00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "includes.h"
00021 #include "utils/net.h"
00022
00023
00024
00025
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
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
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
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
00116
00117
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
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
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
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
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 }