X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fdate.c;h=6db3e2838731b0f0b0dd0e26ad021b7a245199d2;hb=8b7a0d807a3ec8cfcbc4e4cb3067237b438bae14;hp=9e8e3f3eb44ba8146c247215ea1906af12600830;hpb=b610615be9aedfac07d1e01f12575707fa3a227c;p=oweals%2Fbusybox.git diff --git a/coreutils/date.c b/coreutils/date.c index 9e8e3f3eb..6db3e2838 100644 --- a/coreutils/date.c +++ b/coreutils/date.c @@ -20,17 +20,15 @@ * */ -#include "internal.h" -#define BB_DECLARE_EXTERN -#define bb_need_invalid_date -#define bb_need_memory_exhausted -#include "messages.c" #include #include #include #include #include #include +#include +#include +#include "busybox.h" /* This 'date' command supports only 2 time setting formats, @@ -39,23 +37,12 @@ an RFC 822 complient date output for shell scripting mail commands */ -static const char date_usage[] = "date [OPTION]... [+FORMAT]\n" - " or: date [OPTION] [MMDDhhmm[[CC]YY][.ss]]\n" -#ifndef BB_FEATURE_TRIVIAL_HELP - "\nDisplays the current time in the given FORMAT, or sets the system date.\n" - "\nOptions:\n\t-R\tOutputs RFC-822 compliant date string\n" - "\t-s\tSets time described by STRING\n" - "\t-u\tPrints or sets Coordinated Universal Time\n" -#endif - ; - - /* Input parsing code is always bulky - used heavy duty libc stuff as much as possible, missed out a lot of bounds checking */ /* Default input handling to save suprising some people */ -struct tm *date_conv_time(struct tm *tm_time, const char *t_string) +static struct tm *date_conv_time(struct tm *tm_time, const char *t_string) { int nr; @@ -66,7 +53,7 @@ struct tm *date_conv_time(struct tm *tm_time, const char *t_string) &(tm_time->tm_min), &(tm_time->tm_year)); if (nr < 4 || nr > 5) { - fatalError(invalid_date, "date", t_string); + error_msg_and_die(invalid_date, t_string); } /* correct for century - minor Y2K problem here? */ @@ -82,75 +69,59 @@ struct tm *date_conv_time(struct tm *tm_time, const char *t_string) /* The new stuff for LRP */ -struct tm *date_conv_ftime(struct tm *tm_time, const char *t_string) +static struct tm *date_conv_ftime(struct tm *tm_time, const char *t_string) { - struct tm itm_time, jtm_time, ktm_time, ltm_time, mtm_time, ntm_time; - - itm_time = *tm_time; - jtm_time = *tm_time; - ktm_time = *tm_time; - ltm_time = *tm_time; - mtm_time = *tm_time; - ntm_time = *tm_time; + struct tm t; /* Parse input and assign appropriately to tm_time */ - if (sscanf(t_string, "%d:%d:%d", - &itm_time.tm_hour, &itm_time.tm_min, &itm_time.tm_sec) == 3) { - - *tm_time = itm_time; - return (tm_time); - - } else if (sscanf(t_string, "%d:%d", - &jtm_time.tm_hour, &jtm_time.tm_min) == 2) { - - *tm_time = jtm_time; - return (tm_time); - - } else if (sscanf(t_string, "%d.%d-%d:%d:%d", - &ktm_time.tm_mon, - &ktm_time.tm_mday, - &ktm_time.tm_hour, - &ktm_time.tm_min, &ktm_time.tm_sec) == 5) { - - ktm_time.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ - *tm_time = ktm_time; - return (tm_time); - - } else if (sscanf(t_string, "%d.%d-%d:%d", - <m_time.tm_mon, - <m_time.tm_mday, - <m_time.tm_hour, <m_time.tm_min) == 4) { - - ltm_time.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ - *tm_time = ltm_time; - return (tm_time); - - } else if (sscanf(t_string, "%d.%d.%d-%d:%d:%d", - &mtm_time.tm_year, - &mtm_time.tm_mon, - &mtm_time.tm_mday, - &mtm_time.tm_hour, - &mtm_time.tm_min, &mtm_time.tm_sec) == 6) { - - mtm_time.tm_year -= 1900; /* Adjust years */ - mtm_time.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ - *tm_time = mtm_time; - return (tm_time); - - } else if (sscanf(t_string, "%d.%d.%d-%d:%d", - &ntm_time.tm_year, - &ntm_time.tm_mon, - &ntm_time.tm_mday, - &ntm_time.tm_hour, &ntm_time.tm_min) == 5) { - ntm_time.tm_year -= 1900; /* Adjust years */ - ntm_time.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ - *tm_time = ntm_time; - return (tm_time); + if (t=*tm_time,sscanf(t_string, "%d:%d:%d", + &t.tm_hour, &t.tm_min, &t.tm_sec) == 3) { + /* no adjustments needed */ - } + } else if (t=*tm_time,sscanf(t_string, "%d:%d", + &t.tm_hour, &t.tm_min) == 2) { + /* no adjustments needed */ + + + } else if (t=*tm_time,sscanf(t_string, "%d.%d-%d:%d:%d", + &t.tm_mon, + &t.tm_mday, + &t.tm_hour, + &t.tm_min, &t.tm_sec) == 5) { + + t.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ + + } else if (t=*tm_time,sscanf(t_string, "%d.%d-%d:%d", + &t.tm_mon, + &t.tm_mday, + &t.tm_hour, &t.tm_min) == 4) { + + t.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ + + } else if (t=*tm_time,sscanf(t_string, "%d.%d.%d-%d:%d:%d", + &t.tm_year, + &t.tm_mon, + &t.tm_mday, + &t.tm_hour, + &t.tm_min, &t.tm_sec) == 6) { - fatalError(invalid_date, "date", t_string); + t.tm_year -= 1900; /* Adjust years */ + t.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ + + } else if (t=*tm_time,sscanf(t_string, "%d.%d.%d-%d:%d", + &t.tm_year, + &t.tm_mon, + &t.tm_mday, + &t.tm_hour, &t.tm_min) == 5) { + t.tm_year -= 1900; /* Adjust years */ + t.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */ + + } else { + error_msg_and_die(invalid_date, t_string); + } + *tm_time = t; + return (tm_time); } @@ -159,7 +130,7 @@ int date_main(int argc, char **argv) char *date_str = NULL; char *date_fmt = NULL; char *t_buff; - int i; + int c; int set_time = 0; int rfc822 = 0; int utc = 0; @@ -168,49 +139,44 @@ int date_main(int argc, char **argv) struct tm tm_time; /* Interpret command line args */ - i = --argc; - argv++; - while (i > 0 && **argv) { - if (**argv == '-') { - while (i > 0 && *++(*argv)) - switch (**argv) { - case 'R': - rfc822 = 1; - break; - case 's': - set_time = 1; - if (date_str != NULL) - usage(date_usage); - date_str = *argv; - break; - case 'u': - utc = 1; - if (putenv("TZ=UTC0") != 0) - fatalError(memory_exhausted, "date"); - break; - case 'd': - use_arg = 1; - if (date_str != NULL) - usage(date_usage); - date_str = *argv; - break; - case '-': - usage(date_usage); - } - } else { - if ((date_fmt == NULL) && (**argv == '+')) - date_fmt = *argv + 1; /* Skip over the '+' */ - else if (date_str == NULL) { + while ((c = getopt(argc, argv, "Rs:ud:")) != EOF) { + switch (c) { + case 'R': + rfc822 = 1; + break; + case 's': set_time = 1; - date_str = *argv; - } else { - usage(date_usage); - } + if ((date_str != NULL) || ((date_str = optarg) == NULL)) { + show_usage(); + } + break; + case 'u': + utc = 1; + if (putenv("TZ=UTC0") != 0) + error_msg_and_die(memory_exhausted); + break; + case 'd': + use_arg = 1; + if ((date_str != NULL) || ((date_str = optarg) == NULL)) + show_usage(); + break; + default: + show_usage(); } - i--; - argv++; } + if ((date_fmt == NULL) && (optind < argc) && (argv[optind][0] == '+')) + date_fmt = &argv[optind][1]; /* Skip over the '+' */ + else if (date_str == NULL) { + set_time = 1; + date_str = argv[optind]; + } +#if 0 + else { + error_msg("date_str='%s' date_fmt='%s'\n", date_str, date_fmt); + show_usage(); + } +#endif /* Now we have parsed all the information except the date format which depends on whether the clock is being set or read */ @@ -233,15 +199,19 @@ int date_main(int argc, char **argv) date_conv_time(&tm_time, date_str); } - /* Correct any day of week and day of year etc fields */ + /* Correct any day of week and day of year etc. fields */ tm = mktime(&tm_time); if (tm < 0) - fatalError(invalid_date, "date", date_str); + error_msg_and_die(invalid_date, date_str); + if ( utc ) { + if (putenv("TZ=UTC0") != 0) + error_msg_and_die(memory_exhausted); + } /* if setting time, set it */ if (set_time) { if (stime(&tm) < 0) { - fatalError("date: can't set date.\n"); + perror_msg("cannot set date"); } } } @@ -259,7 +229,7 @@ int date_main(int argc, char **argv) } else if (*date_fmt == '\0') { /* Imitate what GNU 'date' does with NO format string! */ printf("\n"); - exit(TRUE); + return EXIT_SUCCESS; } /* Handle special conversions */ @@ -271,7 +241,7 @@ int date_main(int argc, char **argv) /* Print OUTPUT (after ALL that!) */ t_buff = xmalloc(201); strftime(t_buff, 200, date_fmt, &tm_time); - printf("%s\n", t_buff); + puts(t_buff); - return(TRUE); + return EXIT_SUCCESS; }