summaryrefslogtreecommitdiff
path: root/source3/utils/net_time.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2001-12-11 05:21:50 +0000
committerAndrew Tridgell <tridge@samba.org>2001-12-11 05:21:50 +0000
commit32ba2c889fb7eaa0dde8a2951572da7e2a4da3ce (patch)
tree6e7752b6d5855df4c2da4e00df8e06136a704317 /source3/utils/net_time.c
parent6cc5e2edc1018a30b9ef16f2572849790ab490d1 (diff)
downloadsamba-32ba2c889fb7eaa0dde8a2951572da7e2a4da3ce.tar.gz
samba-32ba2c889fb7eaa0dde8a2951572da7e2a4da3ce.tar.bz2
samba-32ba2c889fb7eaa0dde8a2951572da7e2a4da3ce.zip
added a net time command. Allow display or set of system time based on
a SMB server particularly useful for ADS is: net time set -S DOMAIN#1B this makes kerberos clock skew problems go away :) (This used to be commit b3ba2293d0e4eac3b6408c3abc3dcacfa3f67fe4)
Diffstat (limited to 'source3/utils/net_time.c')
-rw-r--r--source3/utils/net_time.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/source3/utils/net_time.c b/source3/utils/net_time.c
new file mode 100644
index 0000000000..f7f3f894b0
--- /dev/null
+++ b/source3/utils/net_time.c
@@ -0,0 +1,151 @@
+/*
+ Samba Unix/Linux SMB client library
+ Version 3.0
+ net time command
+ Copyright (C) 2001 Andrew Tridgell (tridge@samba.org)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include "includes.h"
+#include "../utils/net.h"
+
+
+/*
+ return the time on a server. This does not require any authentication
+*/
+static time_t cli_servertime(const char *host, struct in_addr *ip)
+{
+ struct nmb_name calling, called;
+ time_t ret = 0;
+ extern pstring global_myname;
+ struct cli_state *cli = NULL;
+
+ cli = cli_initialise(NULL);
+ if (!cli || !cli_connect(cli, host, ip)) goto done;
+
+ make_nmb_name(&calling, global_myname, 0x0);
+ if (host) {
+ make_nmb_name(&called, host, 0x20);
+ } else {
+ make_nmb_name(&called, "*SMBSERVER", 0x20);
+ }
+
+ if (!cli_session_request(cli, &calling, &called)) goto done;
+ if (!cli_negprot(cli)) goto done;
+
+ ret = cli->servertime;
+
+ cli_shutdown(cli);
+
+done:
+ if (cli) cli_shutdown(cli);
+ return ret;
+}
+
+/* find the servers time on the opt_host host */
+static time_t nettime(void)
+{
+ extern BOOL opt_have_ip;
+ extern struct in_addr opt_dest_ip;
+ extern char *opt_host;
+ return cli_servertime(opt_host, opt_have_ip? &opt_dest_ip : NULL);
+}
+
+/* return a time as a string ready to be passed to date -u */
+static char *systime(time_t t)
+{
+ static char s[100];
+ struct tm *tm;
+
+ tm = gmtime(&t);
+
+ snprintf(s, sizeof(s), "%02d%02d%02d%02d%04d.%02d",
+ tm->tm_mon+1, tm->tm_mday, tm->tm_hour,
+ tm->tm_min, tm->tm_year + 1900, tm->tm_sec);
+ return s;
+}
+
+int net_time_usage(int argc, const char **argv)
+{
+ d_printf(
+"net time\n\tdisplays time on a server\n\n"\
+"net time system\n\tdisplays time on a server in a format ready for /bin/date\n\n"\
+"net time set\n\truns /bin/date -u with the time from the server\n\n"\
+"\n");
+ general_rap_usage(argc, argv);
+ return -1;
+}
+
+/* try to set the system clock using /bin/date */
+static int net_time_set(int argc, const char **argv)
+{
+ time_t t = nettime();
+ char *cmd;
+
+ if (t == 0) {
+ d_printf("Can't contact server\n");
+ return -1;
+ }
+
+ asprintf(&cmd, "/bin/date -u %s", systime(t));
+ system(cmd);
+ free(cmd);
+
+ return 0;
+}
+
+/* display the time on a remote box in a format ready for /bin/date */
+static int net_time_system(int argc, const char **argv)
+{
+ time_t t = nettime();
+
+ if (t == 0) {
+ d_printf("Can't contact server\n");
+ return -1;
+ }
+
+ printf("%s\n", systime(t));
+
+ return 0;
+}
+
+/* display or set the time on a host */
+int net_time(int argc, const char **argv)
+{
+ time_t t;
+ extern BOOL opt_have_ip;
+ extern struct in_addr opt_dest_ip;
+ extern char *opt_host;
+ struct functable func[] = {
+ {"SYSTEM", net_time_system},
+ {"SET", net_time_set},
+ {NULL, NULL}
+ };
+
+ if (!opt_host && !opt_have_ip) {
+ d_printf("You must specify a hostname or IP\n");
+ return -1;
+ }
+
+ if (argc != 0) {
+ return net_run_function(argc, argv, func, net_time_usage);
+ }
+
+ /* default - print the time */
+ t = cli_servertime(opt_host, opt_have_ip? &opt_dest_ip : NULL);
+
+ d_printf("%s", ctime(&t));
+ return 0;
+}