From 0398ae2bf7418f729f8b0d22fb08c26557242cb4 Mon Sep 17 00:00:00 2001 From: ache Date: Wed, 25 Feb 1998 09:40:21 +0000 Subject: Minimize clock drift between getting and setting time Submitted by: bde --- sbin/adjkerntz/adjkerntz.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) (limited to 'sbin/adjkerntz') diff --git a/sbin/adjkerntz/adjkerntz.c b/sbin/adjkerntz/adjkerntz.c index f92ea56..e7ad4a7 100644 --- a/sbin/adjkerntz/adjkerntz.c +++ b/sbin/adjkerntz/adjkerntz.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id$ + * $Id: adjkerntz.c,v 1.20 1997/06/10 11:01:13 charnier Exp $ */ #ifndef lint @@ -257,8 +257,10 @@ recalculate: #ifdef DEBUG fprintf(stderr, "Final diff: %ld secs\n", diff); #endif - tv.tv_sec += diff; - tv.tv_usec = 0; /* we are restarting here... */ + /* + * stv is abused as a flag. The important value + * is in `diff'. + */ stv = &tv; } } @@ -293,13 +295,28 @@ recalculate: } } - if ( ( (init && (stv != NULL || stz != NULL)) - || (stz != NULL && stv == NULL) - ) - && settimeofday(stv, stz) + if ( (init && (stv != NULL || stz != NULL)) + || (stz != NULL && stv == NULL) ) { - syslog(LOG_ERR, "settimeofday: %m"); - return 1; + if (stv != NULL) { + /* + * Get the time again, as close as possible to + * adjusting it, to minimise drift. + * XXX we'd better not fail between here and + * restoring disrtcset, since we don't clean up + * anything. + */ + if (gettimeofday(&tv, (struct timezone *)NULL)) { + syslog(LOG_ERR, "gettimeofday: %m"); + return 1; + } + tv.tv_sec += diff; + stv = &tv; + } + if (settimeofday(stv, stz)) { + syslog(LOG_ERR, "settimeofday: %m"); + return 1; + } } /* setting CPU_ADJKERNTZ have a side effect: resettodr(), which */ -- cgit v1.1