source: MondoRescue/branches/3.3/mindi-busybox/util-linux/rdate.c@ 3865

Last change on this file since 3865 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 2.0 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * The Rdate command will ask a time server for the RFC 868 time
4 * and optionally set the system time.
5 *
6 * by Sterling Huxley <sterling@europa.com>
7 *
8 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
9*/
10
11//usage:#define rdate_trivial_usage
12//usage: "[-sp] HOST"
13//usage:#define rdate_full_usage "\n\n"
14//usage: "Get and possibly set system time from a remote HOST\n"
15//usage: "\n -s Set system time (default)"
16//usage: "\n -p Print time"
17
18#include "libbb.h"
19
20enum { RFC_868_BIAS = 2208988800UL };
21
22static void socket_timeout(int sig UNUSED_PARAM)
23{
24 bb_error_msg_and_die("timeout connecting to time server");
25}
26
27static time_t askremotedate(const char *host)
28{
29 uint32_t nett;
30 int fd;
31
32 /* Add a timeout for dead or inaccessible servers */
33 alarm(10);
34 signal(SIGALRM, socket_timeout);
35
36 fd = create_and_connect_stream_or_die(host, bb_lookup_port("time", "tcp", 37));
37
38 if (safe_read(fd, &nett, 4) != 4) /* read time from server */
39 bb_error_msg_and_die("%s: %s", host, "short read");
40 if (ENABLE_FEATURE_CLEAN_UP)
41 close(fd);
42
43 /* Convert from network byte order to local byte order.
44 * RFC 868 time is the number of seconds
45 * since 00:00 (midnight) 1 January 1900 GMT
46 * the RFC 868 time 2,208,988,800 corresponds to 00:00 1 Jan 1970 GMT
47 * Subtract the RFC 868 time to get Linux epoch.
48 */
49
50 return ntohl(nett) - RFC_868_BIAS;
51}
52
53int rdate_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
54int rdate_main(int argc UNUSED_PARAM, char **argv)
55{
56 time_t remote_time;
57 unsigned flags;
58
59 opt_complementary = "-1";
60 flags = getopt32(argv, "sp");
61
62 remote_time = askremotedate(argv[optind]);
63
64 if (!(flags & 2)) { /* no -p (-s may be present) */
65 time_t current_time;
66
67 time(&current_time);
68 if (current_time == remote_time)
69 bb_error_msg("current time matches remote time");
70 else
71 if (stime(&remote_time) < 0)
72 bb_perror_msg_and_die("can't set time of day");
73 }
74
75 if (flags != 1) /* not lone -s */
76 printf("%s", ctime(&remote_time));
77
78 return EXIT_SUCCESS;
79}
Note: See TracBrowser for help on using the repository browser.