diff options
Diffstat (limited to 'usr.sbin/xntpd/adjtime/adjtime.c')
-rw-r--r-- | usr.sbin/xntpd/adjtime/adjtime.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/usr.sbin/xntpd/adjtime/adjtime.c b/usr.sbin/xntpd/adjtime/adjtime.c new file mode 100644 index 0000000..5b0475e --- /dev/null +++ b/usr.sbin/xntpd/adjtime/adjtime.c @@ -0,0 +1,101 @@ +/*************************************************************************/ +/* (c) Copyright Tai Jin, 1988. All Rights Reserved. */ +/* Hewlett-Packard Laboratories. */ +/* */ +/* Permission is hereby granted for unlimited modification, use, and */ +/* distribution. This software is made available with no warranty of */ +/* any kind, express or implied. This copyright notice must remain */ +/* intact in all versions of this software. */ +/* */ +/* The author would appreciate it if any bug fixes and enhancements were */ +/* to be sent back to him for incorporation into future versions of this */ +/* software. Please send changes to tai@iag.hp.com or ken@sdd.hp.com. */ +/*************************************************************************/ + +#ifndef lint +static char RCSid[] = "adjtime.c,v 3.1 1993/07/06 01:04:42 jbj Exp"; +#endif + +#include <sys/types.h> +#include <sys/ipc.h> +#include <sys/msg.h> +#include <time.h> +#include <signal.h> +#include "adjtime.h" + +#define abs(x) ((x) < 0 ? -(x) : (x)) +static LONG adjthresh = 400L; +static LONG saveup; + + +_clear_adjtime() +{ + saveup = 0L; +} + + +adjtime(delta, olddelta) + register struct timeval *delta; + register struct timeval *olddelta; +{ + struct timeval newdelta; + + /* If they are giving us seconds, ignore up to current threshold saved */ + if (delta->tv_sec) { + saveup = 0L; + return(_adjtime(delta, olddelta)); + } + + /* add in, needs check for overflow ? */ + saveup += delta->tv_usec; + + /* Broke the threshold, call adjtime() */ + if (abs(saveup) > adjthresh) { + newdelta.tv_sec = 0L; + newdelta.tv_usec = saveup; + saveup = 0L; + return(_adjtime(&newdelta, olddelta)); + } + + if (olddelta) + olddelta->tv_sec = olddelta->tv_usec = 0L; + return(0); +} + + +_adjtime(delta, olddelta) + register struct timeval *delta; + register struct timeval *olddelta; +{ + register int mqid; + MsgBuf msg; + register MsgBuf *msgp = &msg; + + /* + * get the key to the adjtime message queue + * (note that we must get it every time because the queue might have been + * removed and recreated) + */ + if ((mqid = msgget(KEY, 0)) == -1) + return (-1); + + msgp->msgb.mtype = CLIENT; + msgp->msgb.tv = *delta; + + if (olddelta) + msgp->msgb.code = DELTA2; + else + msgp->msgb.code = DELTA1; + + if (msgsnd(mqid, &msgp->msgp, MSGSIZE, 0) == -1) + return (-1); + + if (olddelta) { + if (msgrcv(mqid, &msgp->msgp, MSGSIZE, SERVER, 0) == -1) + return (-1); + + *olddelta = msgp->msgb.tv; + } + + return (0); +} |