Annotation of /trunk/mkinitrd-magellan/busybox/util-linux/rdate.c
Parent Directory | Revision Log
Revision 984 -
(hide annotations)
(download)
Sun May 30 11:32:42 2010 UTC (14 years ago) by niro
File MIME type: text/plain
File size: 1751 byte(s)
Sun May 30 11:32:42 2010 UTC (14 years ago) by niro
File MIME type: text/plain
File size: 1751 byte(s)
-updated to busybox-1.16.1 and enabled blkid/uuid support in default config
1 | niro | 532 | /* 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 GPL v2 or later, see file License for details. | ||
9 | */ | ||
10 | |||
11 | niro | 816 | #include "libbb.h" |
12 | niro | 532 | |
13 | enum { RFC_868_BIAS = 2208988800UL }; | ||
14 | |||
15 | niro | 816 | static void socket_timeout(int sig UNUSED_PARAM) |
16 | niro | 532 | { |
17 | bb_error_msg_and_die("timeout connecting to time server"); | ||
18 | } | ||
19 | |||
20 | static time_t askremotedate(const char *host) | ||
21 | { | ||
22 | uint32_t nett; | ||
23 | int fd; | ||
24 | |||
25 | /* Add a timeout for dead or inaccessible servers */ | ||
26 | alarm(10); | ||
27 | signal(SIGALRM, socket_timeout); | ||
28 | |||
29 | fd = create_and_connect_stream_or_die(host, bb_lookup_port("time", "tcp", 37)); | ||
30 | |||
31 | if (safe_read(fd, (void *)&nett, 4) != 4) /* read time from server */ | ||
32 | bb_error_msg_and_die("%s did not send the complete time", host); | ||
33 | close(fd); | ||
34 | |||
35 | /* convert from network byte order to local byte order. | ||
36 | * RFC 868 time is the number of seconds | ||
37 | * since 00:00 (midnight) 1 January 1900 GMT | ||
38 | * the RFC 868 time 2,208,988,800 corresponds to 00:00 1 Jan 1970 GMT | ||
39 | * Subtract the RFC 868 time to get Linux epoch | ||
40 | */ | ||
41 | |||
42 | return ntohl(nett) - RFC_868_BIAS; | ||
43 | } | ||
44 | |||
45 | niro | 816 | int rdate_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
46 | int rdate_main(int argc UNUSED_PARAM, char **argv) | ||
47 | niro | 532 | { |
48 | time_t remote_time; | ||
49 | unsigned long flags; | ||
50 | |||
51 | opt_complementary = "-1"; | ||
52 | niro | 816 | flags = getopt32(argv, "sp"); |
53 | niro | 532 | |
54 | remote_time = askremotedate(argv[optind]); | ||
55 | |||
56 | if ((flags & 2) == 0) { | ||
57 | time_t current_time; | ||
58 | |||
59 | time(¤t_time); | ||
60 | if (current_time == remote_time) | ||
61 | bb_error_msg("current time matches remote time"); | ||
62 | else | ||
63 | if (stime(&remote_time) < 0) | ||
64 | niro | 984 | bb_perror_msg_and_die("can't set time of day"); |
65 | niro | 532 | } |
66 | |||
67 | if ((flags & 1) == 0) | ||
68 | printf("%s", ctime(&remote_time)); | ||
69 | |||
70 | return EXIT_SUCCESS; | ||
71 | } |