Date: Tue, 16 Mar 1999 00:06:45 -0500 (EST) From: Brian Haug <haug@hawaii.conterra.com> To: FreeBSD-gnats-submit@freebsd.org Subject: bin/10610: date enhancement Message-ID: <199903160506.AAA05691@hawaii.conterra.com>
next in thread | raw e-mail | index | archive | help
>Number: 10610 >Category: bin >Synopsis: New options to date to slowly adjust time with adjtime(2) >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Mon Mar 15 21:10:00 PST 1999 >Closed-Date: >Last-Modified: >Originator: Brian Haug >Release: FreeBSD 3.1-RELEASE i386 (?? submitting from different machine) >Organization: None >Environment: Generic BSD environment >Description: SVR4 implementations of date have a -a option which allows the time to slowly be adjusted with the adjtime system call. I've also provided a -T option which adjust the time like the -a option but does not require the user to calculate the delta. >How-To-Repeat: Not applicapble >Fix: The BRH define was to keep track of the changes, I suggest removing it. *** /usr/src/bin/date/date.c.old Sun Mar 14 08:15:47 1999 --- /usr/src/bin/date/date.c Mon Mar 15 08:19:05 1999 *************** *** 1,3 **** --- 1,4 ---- + #define BRH /* * Copyright (c) 1985, 1987, 1988, 1993 * The Regents of the University of California. All rights reserved. *************** *** 62,67 **** --- 63,72 ---- time_t tval; int retval, nflag; + #ifdef BRH + int aflag, Tflag; + char *aval; + #endif static void setthetime __P((const char *, const char *)); static void badformat __P((void)); *************** *** 91,98 **** --- 96,118 ---- tz.tz_dsttime = tz.tz_minuteswest = 0; rflag = 0; set_timezone = 0; + #ifdef BRH + while ((ch = getopt(argc, argv, "a:d:f:nr:t:uv:T")) != -1) + #else while ((ch = getopt(argc, argv, "d:f:nr:t:uv:")) != -1) + #endif switch((char)ch) { + #ifdef BRH + /* adjust time slowly to specified time */ + case 'T': + Tflag = 1; + break; + /* adjust time slowly by amount specified */ + case 'a': + aflag = 1; + aval = optarg; + break; + #endif case 'd': /* daylight savings time */ tz.tz_dsttime = strtol(optarg, &endptr, 10) ? 1 : 0; if (endptr == optarg || *endptr != '\0') *************** *** 146,152 **** --- 166,178 ---- ++argv; } + #ifdef BRH + if (aflag) { + setthetime(fmt, aval); + } else if (*argv) { + #else if (*argv) { + #endif setthetime(fmt, *argv); ++argv; } else if (fmt != NULL) *************** *** 178,183 **** --- 204,218 ---- register struct tm *lt; struct timeval tv; const char *dot, *t; + #ifdef BRH + time_t ctval; /* current time_t value */ + int sign = 1; + + if (aflag && '-' == *p) { + sign = -1; + p++; + } + #endif if (fmt != NULL) { lt = localtime(&tval); *************** *** 202,209 **** --- 237,269 ---- badformat(); } + #ifdef BRH + if (aflag) { + tv.tv_usec = 0; + if (NULL != dot) { + int scale = 1000000; + + dot++; + while (isdigit(*dot)) { + scale /= 10; + tv.tv_usec += scale * (*dot - '0'); + dot++; + } + } + tv.tv_sec = strtol(p, NULL, 10) * sign; + if (-1 == adjtime(&tv, (struct timeval *)NULL)) { + err(1, "adjtime (timeval)"); + } + return; + } + #endif + lt = localtime(&tval); + #ifdef BRH + if (Tflag && (ctval = mktime(lt)) == -1) + errx(1, "nonexistant time"); + #endif if (dot != NULL) { /* .ss */ dot++; /* *dot++ = '\0'; */ if (strlen(dot) != 2) *************** *** 252,257 **** --- 312,329 ---- errx(1, "nonexistent time"); /* set the time */ + #ifdef BRH + if (Tflag) { + tv.tv_sec = tval - ctval; + tv.tv_usec = 0; + if (-1 == adjtime(&tv, (struct timeval *)NULL)) { + err(1, "adjtime(timeval)"); + } + /* should something be logged to wtmp? */ + /* should info be passed to ntp? */ + return; + } + #endif if (nflag || netsettime(tval)) { logwtmp("|", "date", ""); tv.tv_sec = tval; *************** *** 277,283 **** --- 349,359 ---- usage() { (void)fprintf(stderr, "%s\n%s\n", + #ifdef BRH + "usage: date [-nu] [-d dst] [-r seconds] [-t west] [-T|-a delta]" + #else "usage: date [-nu] [-d dst] [-r seconds] [-t west] " + #endif "[-v[+|-]val[ymwdHM]] ... ", " [-f fmt date | [[[[yy]mm]dd]HH]MM[.ss]] [+format]"); exit(1); *** /usr/src/bin/date/date.1.old Sun Mar 14 08:15:44 1999 --- /usr/src/bin/date/date.1 Mon Mar 15 12:37:52 1999 *************** *** 47,52 **** --- 47,53 ---- .Op Fl d Ar dst .Op Fl r Ar seconds .Op Fl t Ar minutes_west + .Op Fl T | Fl a Ar delta .Op Fl v Ns Ar [+|-]val Ns Op ymwdHM .Ar ... .Op Fl f Ar fmt Ar date | [[[[yy]mm]dd]HH]MM[\&.ss] *************** *** 60,65 **** --- 61,76 ---- .Pp The options are as follows: .Bl -tag -width Ds + .It Fl a + Adjust the time by + .Ar delta + seconds. If + .Ar delta + is positive, the clock will be sped up by the + .Xr adjtime 2 + function. If + .Ar delta + is negative, the clock will be slowed down. .It Fl d Set the kernel's value for daylight savings time. If *************** *** 103,108 **** --- 114,126 ---- .Ql tz_minuteswest by future calls to .Xr gettimeofday 2 . + .It Fl T + Similar to the + .Fl a + option, the time will be adjusted, however the utility calculates the value + to pass to the + .Xr adjtime 2 + function based on the time specified. .It Fl u Display or set the date in .Tn UCT *************** *** 266,271 **** --- 284,290 ---- a record of the user setting the time .El .Sh SEE ALSO + .Xr adjtime 2 , .Xr gettimeofday 2 , .Xr strftime 3 , .Xr strptime 3 , >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199903160506.AAA05691>