[comp.unix.questions...] Re: adjtime(2) hints needed
Chris Torek
chris at mimsy.umd.edu
Mon Aug 6 14:13:26 AEST 1990
Archive-name: adjtime/04-Aug-90
Original-posting-by: chris at mimsy.umd.edu (Chris Torek)
Original-subject: Re: adjtime(2) hints needed
Reposted-by: emv at math.lsa.umich.edu (Edward Vielmetti)
[Reposted from comp.unix.questions,alt.sys.sun.
Comments on this service to emv at math.lsa.umich.edu (Edward Vielmetti).]
In article <2119 at cirrusl.UUCP> dhesi%cirrusl at oliveb.ATC.olivetti.com
(Rahul Dhesi) writes:
>I must supply adjtime(2) with a delta time ... [my] delta_time.tv_sec
>and delta_time.tv_usec could have different signs. Is this acceptable?
It may be accepted, but it is not a great idea.
The following is a program I wrote some time ago. error() is a function
that prints an error message (appending strerror(arg2) if arg2!=0) to
stderr, prefixed by the program's name (is there an echo in here? :-) ),
and then quits with exit status arg1 if arg1!=0. (The program's name
is stashed secretly by the C runtime startup code.)
#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/time.h>
struct timeval delta, olddelta;
extern int errno;
main(argc, argv)
int argc;
char **argv;
{
if (argc < 2) {
timerclear(&delta);
if (adjtime(&delta, &olddelta))
error(1, errno, "adjtime");
if (adjtime(&olddelta, &delta)) {
int e = errno;
showdelta("current adjustment", &olddelta);
error(1, e, "adjtime (readjust)");
}
showdelta("current adjustment", &olddelta);
exit(0);
}
if (convtime(&delta, argv[1]))
error(1, 0, "invalid time spec %s (should be sec.usec)\n",
argv[1]);
if (adjtime(&delta, &olddelta))
error(1, errno, "adjtime");
showdelta("old adjustment", &olddelta);
showdelta("new adjustment", &delta);
exit(0);
}
convtime(tvp, s)
register struct timeval *tvp;
register char *s;
{
char *usec, *index();
int neg = 0;
if (*s == '-') {
neg++;
s++;
}
usec = index(s, '.'); /* strrchr for SysV folks */
if (usec != NULL) {
*usec++ = 0;
if (convone(&tvp->tv_usec, usec))
return (-1);
if (tvp->tv_usec > 999999)
return (-1);
} else
tvp->tv_usec = 0;
if (convone(&tvp->tv_sec, s))
return (-1);
if (neg) {
tvp->tv_usec = -tvp->tv_usec;
tvp->tv_sec = -tvp->tv_sec;
}
return (0);
}
/* this really should use strtol(), but I did not have it when I wrote this */
convone(lp, s)
long *lp;
register char *s;
{
register long l = 0;
register int c;
while ((c = *s++) != 0) {
if (!isdigit(c))
return (-1);
l *= 10;
if (l < 0)
return (-1);
l += c - '0';
if (l < 0)
return (-1);
}
*lp = l;
return (0);
}
showdelta(what, tvp)
char *what;
struct timeval *tvp;
{
char *p = "";
if (tvp->tv_usec < 0) {
tvp->tv_usec = -tvp->tv_usec;
if (tvp->tv_sec == 0)
p = "-";
}
(void) printf("%s: %s%ld.%06ld seconds\n", what,
p, tvp->tv_sec, tvp->tv_usec);
}
--
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163)
Domain: chris at cs.umd.edu Path: uunet!mimsy!chris
(New campus phone system, active sometime soon: +1 301 405 2750)
More information about the Alt.sources
mailing list