int main(const int argc, char *argv[]) { register const char * format; register const char * cp; register int ch; register bool rflag = false; time_t t; intmax_t secs; char * endarg; #ifdef LC_ALL setlocale(LC_ALL, ""); #endif /* defined(LC_ALL) */ #if HAVE_GETTEXT #ifdef TZ_DOMAINDIR bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR); #endif /* defined(TEXTDOMAINDIR) */ textdomain(TZ_DOMAIN); #endif /* HAVE_GETTEXT */ t = time(NULL); format = NULL; while ((ch = getopt(argc, argv, "ucr:")) != EOF && ch != -1) { switch (ch) { default: usage(); case 'u': /* do it in UT */ case 'c': dogmt(); break; case 'r': /* seconds since 1970 */ if (rflag) { fprintf(stderr, _("date: error: multiple -r's used")); usage(); } rflag = true; errno = 0; secs = strtoimax (optarg, &endarg, 0); if (*endarg || optarg == endarg) errno = EINVAL; else if (! (time_t_min <= secs && secs <= time_t_max)) errno = ERANGE; if (errno) { perror(optarg); errensure(); exit(retval); } t = secs; break; } } while (optind < argc) { cp = argv[optind++]; if (*cp == '+') if (format == NULL) format = cp + 1; else { fprintf(stderr, _("date: error: multiple formats in command line\n")); usage(); } else { fprintf(stderr, _("date: unknown operand: %s\n"), cp); usage(); } } display(format, t); return retval; }
int main(const int argc, char *argv[]) { register const char * format; register const char * value; register const char * cp; register int ch; register int dousg; register int aflag = 0; register int dflag = 0; register int nflag = 0; register int tflag = 0; register int minuteswest; register int dsttime; register double adjust; time_t now; time_t t; INITIALIZE(dousg); INITIALIZE(minuteswest); INITIALIZE(dsttime); INITIALIZE(adjust); INITIALIZE(t); #ifdef LC_ALL (void) setlocale(LC_ALL, ""); #endif /* defined(LC_ALL) */ #if HAVE_GETTEXT #ifdef TZ_DOMAINDIR (void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR); #endif /* defined(TEXTDOMAINDIR) */ (void) textdomain(TZ_DOMAIN); #endif /* HAVE_GETTEXT */ (void) time(&now); format = value = NULL; while ((ch = getopt(argc, argv, "ucnd:t:a:")) != EOF && ch != -1) { switch (ch) { default: usage(); case 'u': /* do it in UTC */ case 'c': dogmt(); break; case 'n': /* don't set network */ nflag = 1; break; case 'd': /* daylight saving time */ if (dflag) { (void) fprintf(stderr, _("date: error: multiple -d's used")); usage(); } dflag = 1; cp = optarg; dsttime = atoi(cp); if (*cp == '\0' || *nondigit(cp) != '\0') wildinput(_("-t value"), optarg, _("must be a non-negative number")); break; case 't': /* minutes west of UTC */ if (tflag) { (void) fprintf(stderr, _("date: error: multiple -t's used")); usage(); } tflag = 1; cp = optarg; minuteswest = atoi(cp); if (*cp == '+' || *cp == '-') ++cp; if (*cp == '\0' || *nondigit(cp) != '\0') wildinput(_("-d value"), optarg, _("must be a number")); break; case 'a': /* adjustment */ if (aflag) { (void) fprintf(stderr, _("date: error: multiple -a's used")); usage(); } aflag = 1; cp = optarg; adjust = atof(cp); if (*cp == '+' || *cp == '-') ++cp; if (*cp == '\0' || strcmp(cp, ".") == 0) wildinput(_("-a value"), optarg, _("must be a number")); cp = nondigit(cp); if (*cp == '.') ++cp; if (*nondigit(cp) != '\0') wildinput(_("-a value"), optarg, _("must be a number")); break; } } while (optind < argc) { cp = argv[optind++]; if (*cp == '+') if (format == NULL) format = cp + 1; else { (void) fprintf(stderr, _("date: error: multiple formats in command line\n")); usage(); } else if (value == NULL) value = cp; else { (void) fprintf(stderr, _("date: error: multiple values in command line\n")); usage(); } } if (value != NULL) { /* ** This order ensures that "reasonable" twelve-digit inputs ** (such as 120203042006) won't be misinterpreted ** even if time_t's range all the way back to the thirteenth ** century. Do not change the order. */ t = convert(value, (dousg = TRUE), now); if (t == -1) t = convert(value, (dousg = FALSE), now); if (t == -1) { /* ** Out of range values, ** or time that falls in a DST transition hole? */ if ((cp = strchr(value, '.')) != NULL) { /* ** Ensure that the failure of ** TZ=America/New_York date 8712312359.60 ** doesn't get misdiagnosed. (It was ** TZ=America/New_York date 8712311859.60 ** when the leap second was inserted.) ** The normal check won't work since ** the given time is valid in UTC. */ if (atoi(cp + 1) >= SECSPERMIN) wildinput(_("time"), value, _("out of range seconds given")); } dogmt(); t = convert(value, FALSE, now); if (t == -1) t = convert(value, TRUE, now); wildinput(_("time"), value, (t == -1) ? _("out of range value given") : _("time skipped when clock springs forward")); } } /* ** Entire command line has now been checked. */ if (aflag) { #if HAVE_ADJTIME struct timeval tv; tv.tv_sec = (int) adjust; tv.tv_usec = (int) ((adjust - tv.tv_sec) * 1000000L); if (adjtime(&tv, NULL) != 0) oops("adjtime"); #endif /* HAVE_ADJTIME */ #if !HAVE_ADJTIME reset(now + adjust, nflag); #endif /* !HAVE_ADJTIME */ /* ** Sun silently ignores everything else; we follow suit. */ exit(retval); } if (dflag || tflag) { #if HAVE_SETTIMEOFDAY == 2 struct timezone tz; if (!dflag || !tflag) if (gettimeofday(NULL, &tz) != 0) oops("gettimeofday"); if (dflag) tz.tz_dsttime = dsttime; if (tflag) tz.tz_minuteswest = minuteswest; if (settimeofday(NULL, &tz) != 0) oops("settimeofday"); #endif /* HAVE_SETTIMEOFDAY == 2 */ #if HAVE_SETTIMEOFDAY != 2 (void) fprintf(stderr, _("date: warning: kernel doesn't keep -d/-t information, option ignored\n")); #endif /* HAVE_SETTIMEOFDAY != 2 */ } if (value == NULL) display(format); reset(t, nflag); checkfinal(value, dousg, t, now); #ifdef EBUG { struct tm tm; tm = *localtime(&t); timeout(stdout, "%c\n", &tm); exit(retval); } #endif /* defined EBUG */ display(format); /* gcc -Wall pacifier */ for ( ; ; ) continue; }