From: Miroslav Lichvar Date: Tue, 15 Sep 2015 16:46:17 +0000 (+0200) Subject: sys: drop SunOS driver X-Git-Tag: 2.2-pre1~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=98c245ed7b5f9a9016ef3532a242bd7b9bbe80fa;p=thirdparty%2Fchrony.git sys: drop SunOS driver On FreeBSD is used the new timex driver and SunOS 4 is not supported anymore. --- diff --git a/configure b/configure index dada0904..ef7178d3 100755 --- a/configure +++ b/configure @@ -376,23 +376,6 @@ rm -f config.h config.log SYSTEM=${OPERATINGSYSTEM}-${MACHINE} case $SYSTEM in - SunOS-sun4* ) - case $VERSION in - 4.* ) - EXTRA_OBJECTS="sys_sunos.o strerror.o" - EXTRA_LIBS="-lkvm" - add_def SUNOS - echo "Configuring for SunOS (" $SYSTEM "version" $VERSION ")" - ;; - 5.* ) - EXTRA_OBJECTS="sys_solaris.o" - EXTRA_LIBS="-lsocket -lnsl -lkvm -lelf" - EXTRA_CLI_LIBS="-lsocket -lnsl" - add_def SOLARIS - echo "Configuring for Solaris (" $SYSTEM "SunOS version" $VERSION ")" - ;; - esac - ;; Linux* ) EXTRA_OBJECTS="sys_generic.o sys_linux.o sys_timex.o" [ $try_libcap != "0" ] && try_libcap=1 @@ -428,7 +411,7 @@ case $SYSTEM in add_def MACOSX echo "Configuring for MacOS X (" $SYSTEM "MacOS X version" $VERSION ")" ;; - SunOS-i86pc* ) + SunOS-i86pc*|SunOS-sun4* ) # Doug Woodward reported that this configuration # works for Solaris 2.8 / SunOS 5.8 on x86 platforms EXTRA_OBJECTS="sys_solaris.o" diff --git a/strerror.c b/strerror.c deleted file mode 100644 index 83961427..00000000 --- a/strerror.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - chronyd/chronyc - Programs for keeping computer clocks accurate. - - ********************************************************************** - * Copyright (C) Richard P. Curnow 1997-2002 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - ********************************************************************** - - ======================================================================= - - Replacement strerror function for systems that don't have it - */ - -#include "config.h" - -#ifdef SUNOS - -#include -extern char *sys_errlist[]; - -char *strerror(int n) { - return sys_errlist[n]; -} - -#endif /* SUNOS */ diff --git a/sys_sunos.c b/sys_sunos.c deleted file mode 100644 index f3eb6080..00000000 --- a/sys_sunos.c +++ /dev/null @@ -1,419 +0,0 @@ -/* - chronyd/chronyc - Programs for keeping computer clocks accurate. - - ********************************************************************** - * Copyright (C) Richard P. Curnow 1997-2003 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - ********************************************************************** - - ======================================================================= - - Driver file for the SunOS 4.1.x operating system. - */ - -#include "config.h" - -#ifdef SUNOS - -#include -#include -#include -#include -#include - -#include -#include - -#include "sys_sunos.h" -#include "localp.h" -#include "logging.h" -#include "util.h" -#include "sched.h" - -/* ================================================== */ - -/* This register contains the number of seconds by which the local - clock was estimated to be fast of reference time at the epoch when - gettimeofday() returned T0 */ - -static double offset_register; - -/* This register contains the epoch to which the offset is referenced */ - -static struct timeval T0; - -/* This register contains the current estimate of the system - frequency, in absolute (NOT ppm) */ - -static double current_freq; - -/* This register contains the number of seconds of adjustment that - were passed to adjtime last time it was called. */ - -static double adjustment_requested; - -/* Eventually, this needs to be a user-defined parameter - e.g. user - might want 5 to get much finer resolution like xntpd. We stick - with a reasonable number so that slewing can work. - - This value has to be a factor of 1 million, otherwise the noddy - method we use for rounding an adjustment to the nearest multiple of - this value won't work!! - - */ -static unsigned long our_tickadj = 100; - -/* Interval in seconds between adjustments to cancel systematic drift */ -#define DRIFT_REMOVAL_INTERVAL (4.0) - -/* ================================================== */ - -static void -clock_initialise(void) -{ - struct timeval newadj, oldadj; - - offset_register = 0.0; - adjustment_requested = 0.0; - current_freq = 0.0; - - if (gettimeofday(&T0, NULL) < 0) { - LOG_FATAL(LOGF_SysSunOS, "gettimeofday() failed"); - } - - newadj.tv_sec = 0; - newadj.tv_usec = 0; - - if (adjtime(&newadj, &oldadj) < 0) { - LOG_FATAL(LOGF_SysSunOS, "adjtime() failed"); - } - - if (adjtime(&newadj, &oldadj) < 0) { - LOG_FATAL(LOGF_SysSunOS, "adjtime() failed"); - } -} - -/* ================================================== */ - -static void -clock_finalise(void) -{ - /* Nothing to do yet */ -} - -/* ================================================== */ - -static void -start_adjust(void) -{ - struct timeval newadj, oldadj; - struct timeval T1; - double elapsed, accrued_error, predicted_error; - double adjust_required; - struct timeval exact_newadj; - double rounding_error; - double old_adjust_remaining; - long remainder, multiplier; - - /* Determine the amount of error built up since the last adjustment */ - if (gettimeofday(&T1, NULL) < 0) { - LOG_FATAL(LOGF_SysSunOS, "gettimeofday() failed"); - } - - UTI_DiffTimevalsToDouble(&elapsed, &T1, &T0); - accrued_error = elapsed * current_freq; - predicted_error = DRIFT_REMOVAL_INTERVAL / 2.0 * current_freq; - - adjust_required = - (accrued_error + offset_register + predicted_error); - - UTI_DoubleToTimeval(adjust_required, &exact_newadj); - - /* At this point, we need to round the required adjustment to the - closest multiple of _tickadj --- because SunOS can't process - other adjustments exactly and will silently discard the residual. - Obviously such behaviour can't be tolerated for us. */ - - newadj = exact_newadj; - remainder = newadj.tv_usec % our_tickadj; - multiplier = newadj.tv_usec / our_tickadj; - if (remainder >= (our_tickadj >> 1)) { - newadj.tv_usec = (multiplier + 1) * our_tickadj; - } else { - newadj.tv_usec = multiplier * our_tickadj; - } - - UTI_NormaliseTimeval(&newadj); - - /* Want to *add* rounding error back onto offset register. Note - that the exact adjustment was the offset register *negated* */ - UTI_DiffTimevalsToDouble(&rounding_error, &newadj, &exact_newadj); - - if (adjtime(&newadj, &oldadj) < 0) { - LOG_FATAL(LOGF_SysSunOS, "adjtime() failed"); - } - - UTI_TimevalToDouble(&oldadj, &old_adjust_remaining); - - offset_register = rounding_error - old_adjust_remaining - predicted_error; - - T0 = T1; - UTI_TimevalToDouble(&newadj, &adjustment_requested); - -} - -/* ================================================== */ - -static void -stop_adjust(void) -{ - struct timeval T1; - struct timeval zeroadj, remadj; - double adjustment_remaining, adjustment_achieved; - double gap; - double elapsed, elapsed_plus_adjust; - - zeroadj.tv_sec = 0; - zeroadj.tv_usec = 0; - - if (adjtime(&zeroadj, &remadj) < 0) { - LOG_FATAL(LOGF_SysSunOS, "adjtime() failed"); - } - - if (gettimeofday(&T1, NULL) < 0) { - LOG_FATAL(LOGF_SysSunOS, "gettimeofday() failed"); - } - - UTI_DiffTimevalsToDouble(&elapsed, &T1, &T0); - UTI_TimevalToDouble(&remadj, &adjustment_remaining); - - adjustment_achieved = adjustment_requested - adjustment_remaining; - elapsed_plus_adjust = elapsed - adjustment_achieved; - - offset_register += current_freq * elapsed_plus_adjust - adjustment_remaining; - - adjustment_requested = 0.0; - T0 = T1; - -} - -/* ================================================== */ - -/* Positive offset means system clock is fast of true time, therefore - slew backwards */ - -static void -accrue_offset(double offset, double corr_rate) -{ - stop_adjust(); - offset_register += offset; - start_adjust(); -} - -/* ================================================== */ - -/* Positive offset means system clock is fast of true time, therefore - step backwards */ - -static int -apply_step_offset(double offset) -{ - struct timeval old_time, new_time, T1; - - stop_adjust(); - if (gettimeofday(&old_time, NULL) < 0) { - LOG_FATAL(LOGF_SysSunOS, "gettimeofday() failed"); - } - - UTI_AddDoubleToTimeval(&old_time, -offset, &new_time); - - if (settimeofday(&new_time, NULL) < 0) { - DEBUG_LOG(LOGF_SysSunOS, "settimeofday() failed"); - return 0; - } - - UTI_AddDoubleToTimeval(&T0, offset, &T1); - T0 = T1; - - start_adjust(); - - return 1; -} - -/* ================================================== */ - -static double -set_frequency(double new_freq_ppm) -{ - stop_adjust(); - current_freq = new_freq_ppm * 1.0e-6; - start_adjust(); - - return current_freq * 1.0e6; -} - -/* ================================================== */ - -static double -read_frequency(void) -{ - return current_freq * 1.0e6; -} - -/* ================================================== */ - -static void -get_offset_correction(struct timeval *raw, - double *corr, double *err) -{ - stop_adjust(); - *corr = -offset_register; - start_adjust(); - if (err) - *err = 0.0; -} - -/* ================================================== */ - -static void -immediate_step(void) -{ -} - -/* ================================================== */ - -static int drift_removal_running = 0; -static SCH_TimeoutID drift_removal_id; - -/* ================================================== */ -/* This is the timer callback routine which is called periodically to - invoke a time adjustment to take out the machine's drift. - Otherwise, times reported through this software (e.g. by running - ntpdate from another machine) show the machine being correct (since - they correct for drift build-up), but any program on this machine - that reads the system time will be given an erroneous value, the - degree of error depending on how long it is since - get_offset_correction was last called. */ - -static void -drift_removal_timeout(SCH_ArbitraryArgument not_used) -{ - stop_adjust(); - start_adjust(); - drift_removal_id = SCH_AddTimeoutByDelay(DRIFT_REMOVAL_INTERVAL, drift_removal_timeout, NULL); -} - -/* ================================================== */ - -static void -setup_kernel(unsigned long on_off) -{ - static struct nlist nl[] = { - {"_dosynctodr"}, - {"_tick"}, - {"_tickadj"}, - {NULL} - }; - - kvm_t *kt; - unsigned long read_back; - unsigned long our_tick = 10000; - unsigned long default_tickadj = 625; - - assert(on_off == 1 || on_off == 0); - - kt = kvm_open(NULL, NULL, NULL, O_RDWR, NULL); - if (!kt) { - LOG(LOGS_ERR, LOGF_SysSunOS, "Cannot open kvm"); - return; - } - - if (kvm_nlist(kt, nl) < 0) { - LOG(LOGS_ERR, LOGF_SysSunOS, "Cannot read kernel symbols"); - kvm_close(kt); - return; - } - - if (kvm_write(kt, nl[0].n_value, (char *)(&on_off), sizeof(unsigned long)) < 0) { - LOG(LOGS_ERR, LOGF_SysSunOS, "Cannot write to _dosynctodr"); - kvm_close(kt); - return; - } - - if (kvm_write(kt, nl[1].n_value, (char *)(&our_tick), sizeof(unsigned long)) < 0) { - LOG(LOGS_ERR, LOGF_SysSunOS, "Cannot write to _tick"); - kvm_close(kt); - return; - } - - if (kvm_write(kt, nl[2].n_value, - (char *)(on_off ? &default_tickadj : &our_tickadj), - sizeof(unsigned long)) < 0) { - LOG(LOGS_ERR, LOGF_SysSunOS, "Cannot write to _tickadj"); - kvm_close(kt); - return; - } - - kvm_close(kt); -} - -/* ================================================== */ - -void -SYS_SunOS_Initialise(void) -{ - - /* Need to do KVM stuff to turn off dosynctodr. */ - - clock_initialise(); - - lcl_RegisterSystemDrivers(read_frequency, set_frequency, - accrue_offset, apply_step_offset, - get_offset_correction, - NULL /* set_leap */, - NULL /* set_sync_status */); - - /* Turn off the kernel switch that keeps the system clock in step - with the non-volatile clock */ - setup_kernel(0); - - drift_removal_id = SCH_AddTimeoutByDelay(DRIFT_REMOVAL_INTERVAL, drift_removal_timeout, NULL); - drift_removal_running = 1; - -} - -/* ================================================== */ - -void -SYS_SunOS_Finalise(void) -{ - - if (drift_removal_running) { - SCH_RemoveTimeout(drift_removal_id); - } - - /* Turn dosynctodr back on?? */ - - clock_finalise(); - - /* When exiting, we want to return the machine to its 'autonomous' - tracking mode */ - setup_kernel(1); -} - -/* ================================================== */ - - -#endif /* SUNOS */ diff --git a/sys_sunos.h b/sys_sunos.h deleted file mode 100644 index 84222b64..00000000 --- a/sys_sunos.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - chronyd/chronyc - Programs for keeping computer clocks accurate. - - ********************************************************************** - * Copyright (C) Richard P. Curnow 1997-2002 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - ********************************************************************** - - ======================================================================= - - Header file for Solaris driver - */ - -#ifndef GOT_SYS_SUNOS_H -#define GOT_SYS_SUNOS_H - -void SYS_SunOS_Initialise(void); - -void SYS_SunOS_Finalise(void); - -#endif