utils/net_time.c

説明を見る。
00001 /* 
00002    Samba Unix/Linux SMB client library 
00003    net time command
00004    Copyright (C) 2001 Andrew Tridgell (tridge@samba.org)
00005 
00006    This program is free software; you can redistribute it and/or modify
00007    it under the terms of the GNU General Public License as published by
00008    the Free Software Foundation; either version 2 of the License, or
00009    (at your option) any later version.
00010    
00011    This program is distributed in the hope that it will be useful,
00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014    GNU General Public License for more details.
00015    
00016    You should have received a copy of the GNU General Public License
00017    along with this program; if not, write to the Free Software
00018    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
00019 
00020 #include "includes.h"
00021 #include "utils/net.h"
00022 
00023 
00024 /*
00025   return the time on a server. This does not require any authentication
00026 */
00027 static time_t cli_servertime(const char *host, struct in_addr *ip, int *zone)
00028 {
00029         struct nmb_name calling, called;
00030         time_t ret = 0;
00031         struct cli_state *cli = NULL;
00032         NTSTATUS status;
00033 
00034         cli = cli_initialise();
00035         if (!cli) {
00036                 goto done;
00037         }
00038 
00039         status = cli_connect(cli, host, ip);
00040         if (!NT_STATUS_IS_OK(status)) {
00041                 fprintf(stderr,"Can't contact server %s. Error %s\n", host, nt_errstr(status));
00042                 goto done;
00043         }
00044 
00045         make_nmb_name(&calling, global_myname(), 0x0);
00046         if (host) {
00047                 make_nmb_name(&called, host, 0x20);
00048         } else {
00049                 make_nmb_name(&called, "*SMBSERVER", 0x20);
00050         }
00051 
00052         if (!cli_session_request(cli, &calling, &called)) {
00053                 fprintf(stderr,"Session request failed\n");
00054                 goto done;
00055         }
00056         if (!cli_negprot(cli)) {
00057                 fprintf(stderr,"Protocol negotiation failed\n");
00058                 goto done;
00059         }
00060 
00061         ret = cli->servertime;
00062         if (zone) *zone = cli->serverzone;
00063 
00064 done:
00065         if (cli) {
00066                 cli_shutdown(cli);
00067         }
00068         return ret;
00069 }
00070 
00071 /* find the servers time on the opt_host host */
00072 static time_t nettime(int *zone)
00073 {
00074         return cli_servertime(opt_host, opt_have_ip? &opt_dest_ip : NULL, zone);
00075 }
00076 
00077 /* return a time as a string ready to be passed to /bin/date */
00078 static const char *systime(time_t t)
00079 {
00080         static fstring s;
00081         struct tm *tm;
00082 
00083         tm = localtime(&t);
00084         if (!tm) {
00085                 return "unknown";
00086         }
00087         
00088         fstr_sprintf(s, "%02d%02d%02d%02d%04d.%02d", 
00089                  tm->tm_mon+1, tm->tm_mday, tm->tm_hour, 
00090                  tm->tm_min, tm->tm_year + 1900, tm->tm_sec);
00091         return s;
00092 }
00093 
00094 int net_time_usage(int argc, const char **argv)
00095 {
00096         d_printf(
00097 "net time\n\tdisplays time on a server\n\n"\
00098 "net time system\n\tdisplays time on a server in a format ready for /bin/date\n\n"\
00099 "net time set\n\truns /bin/date with the time from the server\n\n"\
00100 "net time zone\n\tdisplays the timezone in hours from GMT on the remote computer\n\n"\
00101 "\n");
00102         net_common_flags_usage(argc, argv);
00103         return -1;
00104 }
00105 
00106 /* try to set the system clock using /bin/date */
00107 static int net_time_set(int argc, const char **argv)
00108 {
00109         time_t t = nettime(NULL);
00110         char *cmd;
00111         int result;
00112 
00113         if (t == 0) return -1;
00114         
00115         /* yes, I know this is cheesy. Use "net time system" if you want to 
00116            roll your own. I'm putting this in as it works on a large number
00117            of systems and the user has a choice in whether its used or not */
00118         asprintf(&cmd, "/bin/date %s", systime(t));
00119         result = system(cmd);
00120         if (result)
00121                 d_fprintf(stderr, "%s failed.  Error was (%s)\n",
00122                         cmd, strerror(errno));
00123         free(cmd);
00124 
00125         return result;
00126 }
00127 
00128 /* display the time on a remote box in a format ready for /bin/date */
00129 static int net_time_system(int argc, const char **argv)
00130 {
00131         time_t t = nettime(NULL);
00132 
00133         if (t == 0) return -1;
00134 
00135         printf("%s\n", systime(t));
00136 
00137         return 0;
00138 }
00139 
00140 /* display the time on a remote box in a format ready for /bin/date */
00141 static int net_time_zone(int argc, const char **argv)
00142 {
00143         int zone = 0;
00144         int hours, mins;
00145         char zsign;
00146         time_t t;
00147 
00148         t = nettime(&zone);
00149 
00150         if (t == 0) return -1;
00151 
00152         zsign = (zone > 0) ? '-' : '+';
00153         if (zone < 0) zone = -zone;
00154 
00155         zone /= 60;
00156         hours = zone / 60;
00157         mins = zone % 60;
00158 
00159         printf("%c%02d%02d\n", zsign, hours, mins);
00160 
00161         return 0;
00162 }
00163 
00164 /* display or set the time on a host */
00165 int net_time(int argc, const char **argv)
00166 {
00167         time_t t;
00168         struct functable func[] = {
00169                 {"SYSTEM", net_time_system},
00170                 {"SET", net_time_set},
00171                 {"ZONE", net_time_zone},
00172                 {NULL, NULL}
00173         };
00174 
00175         if (!opt_host && !opt_have_ip && 
00176             !find_master_ip(opt_target_workgroup, &opt_dest_ip)) {
00177                 d_fprintf(stderr, "Could not locate a time server.  Try "\
00178                                  "specifying a target host.\n");
00179                 net_time_usage(argc,argv);
00180                 return -1;
00181         }
00182 
00183         if (argc != 0) {
00184                 return net_run_function(argc, argv, func, net_time_usage);
00185         }
00186 
00187         /* default - print the time */
00188         t = cli_servertime(opt_host, opt_have_ip? &opt_dest_ip : NULL, NULL);
00189         if (t == 0) return -1;
00190 
00191         d_printf("%s", ctime(&t));
00192         return 0;
00193 }

Sambaに対してSat Aug 29 21:23:29 2009に生成されました。  doxygen 1.4.7