X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=util-linux%2Frdate.c;h=c9a7ffeabe2970ae7ce5ca664c6043fa0fd8b3b2;hb=50547c07451d07178eeb64e7d8637952b427bd4c;hp=87edecbfca0a35b8a03c334a50fbc7f732112ad0;hpb=f57c944e09417edcbcd69f2b01b937cadef39db2;p=oweals%2Fbusybox.git diff --git a/util-linux/rdate.c b/util-linux/rdate.c index 87edecbfc..c9a7ffeab 100644 --- a/util-linux/rdate.c +++ b/util-linux/rdate.c @@ -21,9 +21,6 @@ * */ -#include "busybox.h" -#define BB_DECLARE_EXTERN -#include "messages.c" #include #include #include @@ -31,47 +28,39 @@ #include #include #include +#include +#include +#include +#include +#include + +#include "busybox.h" -#define RFC_868_BIAS 2208988800UL +static const int RFC_868_BIAS = 2208988800UL; -int setdate= 0; -int printdate= 0; +static void socket_timeout(int sig) +{ + bb_error_msg_and_die("timeout connecting to time server"); +} -time_t askremotedate(char *host) +static time_t askremotedate(const char *host) { - struct hostent *h; - struct sockaddr_in sin; - struct servent *tserv; unsigned long int nett, localt; + struct sockaddr_in s_in; int fd; - if (!(h = gethostbyname(host))) { /* get the IP addr */ - error_msg("%s: %s\n", host, strerror(errno)); - return(-1); - } - if ((tserv = getservbyname("time", "tcp")) == NULL) { /* find port # */ - error_msg("%s: %s\n", "time", strerror(errno)); - return(-1); - } - if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { /* get net connection */ - error_msg("%s: %s\n", "socket", strerror(errno)); - return(-1); - } + bb_lookup_host(&s_in, host, "time"); - memcpy(&sin.sin_addr, h->h_addr, sizeof(sin.sin_addr)); - sin.sin_port= tserv->s_port; - sin.sin_family = AF_INET; + /* Add a timeout for dead or non accessable servers */ + alarm(10); + signal(SIGALRM, socket_timeout); + + fd = xconnect(&s_in); + + if (safe_read(fd, (void *)&nett, 4) != 4) /* read time from server */ + bb_error_msg_and_die("%s did not send the complete time", host); - if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) { /* connect to time server */ - error_msg("%s: %s\n", host, strerror(errno)); - close(fd); - return(-1); - } - if (read(fd, (void *)&nett, 4) != 4) { /* read time from server */ - close(fd); - error_msg("%s did not send the complete time\n", host); - } close(fd); /* convert from network byte order to local byte order. @@ -87,47 +76,39 @@ time_t askremotedate(char *host) int rdate_main(int argc, char **argv) { - time_t time; + time_t remote_time; int opt; + int setdate = 1; + int printdate = 1; /* Interpret command line args */ - /* do special-case option parsing */ - if (argv[1] && (strcmp(argv[1], "--help") == 0)) - usage(rdate_usage); - - /* do normal option parsing */ - while ((opt = getopt(argc, argv, "Hsp")) > 0) { + while ((opt = getopt(argc, argv, "sp")) > 0) { switch (opt) { - default: - case 'H': - usage(rdate_usage); - break; case 's': - setdate++; + printdate = 0; + setdate = 1; break; case 'p': - printdate++; + printdate = 1; + setdate = 0; break; + default: + bb_show_usage(); } } - /* the default action is to set the date */ - if (printdate==0 && setdate==0) setdate++; + if (optind == argc) + bb_show_usage(); - if (optind == argc) { - usage(rdate_usage); - } + remote_time = askremotedate(argv[optind]); - if ((time= askremotedate(argv[optind])) == (time_t)-1) { - return EXIT_FAILURE; - } if (setdate) { - if (stime(&time) < 0) - error_msg_and_die("Could not set time of day: %s\n", strerror(errno)); - } - if (printdate) { - fprintf(stdout, "%s", ctime(&time)); + if (stime(&remote_time) < 0) + bb_perror_msg_and_die("Could not set time of day"); } + if (printdate) + printf("%s", ctime(&remote_time)); + return EXIT_SUCCESS; }