This ensures any failure to initialize the clock driver will eventually end in a unified clear statement that it failed to do so instead of a random mix or EPerm or other issues that happened on init.
The potential root causes (e.g. said Eperm) is still reported as warning. Furthermore this allow further patches to plug-in a generic fallback mechanism at the level os SYS_Initialise. Messages will now look like: CAP_SYS_TIME not present adjtimex(0x8001) failed : Operation not permitted Could not initialise system clock driver Signed-off-by: Christian Ehrhardt <christian.ehrha...@canonical.com> --- sys.c | 15 +++++++++++---- sys_linux.c | 19 ++++++++++--------- sys_linux.h | 2 +- sys_macosx.c | 8 ++++---- sys_macosx.h | 2 +- sys_netbsd.c | 8 ++++---- sys_netbsd.h | 2 +- sys_solaris.c | 6 +++--- sys_solaris.h | 2 +- sys_timex.c | 39 +++++++++++++++++++++++++++------------ sys_timex.h | 16 ++++++++-------- 11 files changed, 71 insertions(+), 48 deletions(-) diff --git a/sys.c b/sys.c index 4d68b37..391b259 100644 --- a/sys.c +++ b/sys.c @@ -52,22 +52,29 @@ static int null_driver; void SYS_Initialise(int clock_control) { + int initalised = 0; + null_driver = !clock_control; if (null_driver) { SYS_Null_Initialise(); return; } #if defined(LINUX) - SYS_Linux_Initialise(); + initalised = SYS_Linux_Initialise(); #elif defined(SOLARIS) - SYS_Solaris_Initialise(); + initalised = SYS_Solaris_Initialise(); #elif defined(NETBSD) || defined(FREEBSD) - SYS_NetBSD_Initialise(); + initalised = SYS_NetBSD_Initialise(); #elif defined(MACOSX) - SYS_MacOSX_Initialise(); + initalised = SYS_MacOSX_Initialise(); #else #error Unknown system #endif + + if (!initalised) { + if (clock_control > 0) + LOG_FATAL("Could not initialise system clock driver"); + } } /* ================================================== */ diff --git a/sys_linux.c b/sys_linux.c index 7848816..e297a66 100644 --- a/sys_linux.c +++ b/sys_linux.c @@ -340,7 +340,7 @@ get_version_specific_details(void) /* ================================================== */ -static void +static int reset_adjtime_offset(void) { struct timex txc; @@ -349,7 +349,7 @@ reset_adjtime_offset(void) txc.modes = ADJ_OFFSET_SINGLESHOT; txc.offset = 0; - SYS_Timex_Adjust(&txc, 0); + return !(SYS_Timex_Adjust(&txc, 2) < 0); } /* ================================================== */ @@ -392,7 +392,7 @@ static void SYS_Linux_ReportTimeAdjustBlockers(void) /* ================================================== */ /* Initialisation code for this module */ -void +int SYS_Linux_Initialise(void) { get_version_specific_details(); @@ -401,18 +401,19 @@ SYS_Linux_Initialise(void) SYS_Linux_ReportTimeAdjustBlockers(); #endif - reset_adjtime_offset(); + if (!reset_adjtime_offset()) + return 0; if (have_setoffset && !test_step_offset()) { LOG(LOGS_INFO, "adjtimex() doesn't support ADJ_SETOFFSET"); have_setoffset = 0; } - SYS_Timex_InitialiseWithFunctions(1.0e6 * max_tick_bias / nominal_tick, - 1.0 / tick_update_hz, - read_frequency, set_frequency, - have_setoffset ? apply_step_offset : NULL, - 0.0, 0.0, NULL, NULL); + return SYS_Timex_InitialiseWithFunctions(1.0e6 * max_tick_bias / nominal_tick, + 1.0 / tick_update_hz, + read_frequency, set_frequency, + have_setoffset ? apply_step_offset : NULL, + 0.0, 0.0, NULL, NULL); } /* ================================================== */ diff --git a/sys_linux.h b/sys_linux.h index 799ae9a..47af4bc 100644 --- a/sys_linux.h +++ b/sys_linux.h @@ -27,7 +27,7 @@ #ifndef GOT_SYS_LINUX_H #define GOT_SYS_LINUX_H -extern void SYS_Linux_Initialise(void); +extern int SYS_Linux_Initialise(void); extern void SYS_Linux_Finalise(void); diff --git a/sys_macosx.c b/sys_macosx.c index 00ce302..27ea81a 100644 --- a/sys_macosx.c +++ b/sys_macosx.c @@ -479,7 +479,7 @@ test_adjtime() /* ================================================== */ -void +int SYS_MacOSX_Initialise(void) { #ifdef HAVE_MACOS_SYS_TIMEX @@ -488,14 +488,14 @@ SYS_MacOSX_Initialise(void) have_bad_adjtime = !test_adjtime(); if (have_bad_adjtime) { LOG(LOGS_WARN, "adjtime() is buggy - using timex driver"); - SYS_Timex_Initialise(); + return SYS_Timex_Initialise(); } else { - SYS_NetBSD_Initialise(); + return SYS_NetBSD_Initialise(); } - return; } #endif legacy_MacOSX_Initialise(); + return 1; } /* ================================================== */ diff --git a/sys_macosx.h b/sys_macosx.h index 5555616..748df8a 100644 --- a/sys_macosx.h +++ b/sys_macosx.h @@ -32,7 +32,7 @@ void SYS_MacOSX_SetScheduler(int SchedPriority); void SYS_MacOSX_DropRoot(uid_t uid, gid_t gid); -void SYS_MacOSX_Initialise(void); +int SYS_MacOSX_Initialise(void); void SYS_MacOSX_Finalise(void); #endif diff --git a/sys_netbsd.c b/sys_netbsd.c index 840d6a5..35379e5 100644 --- a/sys_netbsd.c +++ b/sys_netbsd.c @@ -113,10 +113,10 @@ get_offset_correction(struct timespec *raw, void SYS_NetBSD_Initialise(void) { - SYS_Timex_InitialiseWithFunctions(MAX_FREQ, 1.0 / MIN_TICK_RATE, - NULL, NULL, NULL, - MIN_FASTSLEW_OFFSET, MAX_ADJTIME_SLEWRATE, - accrue_offset, get_offset_correction); + return SYS_Timex_InitialiseWithFunctions(MAX_FREQ, 1.0 / MIN_TICK_RATE, + NULL, NULL, NULL, + MIN_FASTSLEW_OFFSET, MAX_ADJTIME_SLEWRATE, + accrue_offset, get_offset_correction); } /* ================================================== */ diff --git a/sys_netbsd.h b/sys_netbsd.h index 052f5b7..8b00cdf 100644 --- a/sys_netbsd.h +++ b/sys_netbsd.h @@ -28,7 +28,7 @@ #ifndef GOT_SYS_NETBSD_H #define GOT_SYS_NETBSD_H -void SYS_NetBSD_Initialise(void); +int SYS_NetBSD_Initialise(void); void SYS_NetBSD_Finalise(void); diff --git a/sys_solaris.c b/sys_solaris.c index 21197b9..1047376 100644 --- a/sys_solaris.c +++ b/sys_solaris.c @@ -35,12 +35,12 @@ /* ================================================== */ -void +int SYS_Solaris_Initialise(void) { /* The kernel allows the frequency to be set in the full range off int32_t */ - SYS_Timex_InitialiseWithFunctions(32500, 1.0 / 100, NULL, NULL, NULL, - 0.0, 0.0, NULL, NULL); + return SYS_Timex_InitialiseWithFunctions(32500, 1.0 / 100, NULL, NULL, NULL, + 0.0, 0.0, NULL, NULL); } /* ================================================== */ diff --git a/sys_solaris.h b/sys_solaris.h index 46015ba..6d0532b 100644 --- a/sys_solaris.h +++ b/sys_solaris.h @@ -27,7 +27,7 @@ #ifndef GOT_SYS_SOLARIS_H #define GOT_SYS_SOLARIS_H -void SYS_Solaris_Initialise(void); +int SYS_Solaris_Initialise(void); void SYS_Solaris_Finalise(void); diff --git a/sys_timex.c b/sys_timex.c index e54ad24..2754812 100644 --- a/sys_timex.c +++ b/sys_timex.c @@ -181,7 +181,7 @@ set_sync_status(int synchronised, double est_error, double max_error) /* ================================================== */ -static void +static int initialise_timex(void) { struct timex txc; @@ -193,26 +193,30 @@ initialise_timex(void) txc.modes = MOD_OFFSET | MOD_STATUS; txc.status = STA_PLL | sys_status; txc.offset = 0; - SYS_Timex_Adjust(&txc, 0); + if (SYS_Timex_Adjust(&txc, 2) < 0) + return 0; /* Turn PLL off */ txc.modes = MOD_STATUS; txc.status = sys_status; - SYS_Timex_Adjust(&txc, 0); + if (SYS_Timex_Adjust(&txc, 2) < 0) + return 0; + + return 1; } /* ================================================== */ -void +int SYS_Timex_Initialise(void) { - SYS_Timex_InitialiseWithFunctions(MAX_FREQ, 1.0 / MIN_TICK_RATE, NULL, NULL, NULL, - 0.0, 0.0, NULL, NULL); + return SYS_Timex_InitialiseWithFunctions(MAX_FREQ, 1.0 / MIN_TICK_RATE, NULL, + NULL, NULL, 0.0, 0.0, NULL, NULL); } /* ================================================== */ -void +int SYS_Timex_InitialiseWithFunctions(double max_set_freq_ppm, double max_set_freq_delay, lcl_ReadFrequencyDriver sys_read_freq, lcl_SetFrequencyDriver sys_set_freq, @@ -221,7 +225,8 @@ SYS_Timex_InitialiseWithFunctions(double max_set_freq_ppm, double max_set_freq_d lcl_AccrueOffsetDriver sys_accrue_offset, lcl_OffsetCorrectionDriver sys_get_offset_correction) { - initialise_timex(); + if (!initialise_timex()) + return 0; SYS_Generic_CompleteFreqDriver(max_set_freq_ppm, max_set_freq_delay, sys_read_freq ? sys_read_freq : read_frequency, @@ -230,6 +235,7 @@ SYS_Timex_InitialiseWithFunctions(double max_set_freq_ppm, double max_set_freq_d min_fastslew_offset, max_fastslew_rate, sys_accrue_offset, sys_get_offset_correction, set_leap, set_sync_status); + return 1; } /* ================================================== */ @@ -256,10 +262,19 @@ SYS_Timex_Adjust(struct timex *txc, int ignore_error) state = NTP_ADJTIME(txc); if (state < 0) { - if (!ignore_error) - LOG_FATAL(NTP_ADJTIME_NAME"(0x%x) failed : %s", txc->modes, strerror(errno)); - else - DEBUG_LOG(NTP_ADJTIME_NAME"(0x%x) failed : %s", txc->modes, strerror(errno)); + switch (ignore_error) { + case 0: + LOG_FATAL(NTP_ADJTIME_NAME"(0x%x) failed : %s", txc->modes, strerror(errno)); + break; + case 1: + DEBUG_LOG(NTP_ADJTIME_NAME"(0x%x) failed : %s", txc->modes, strerror(errno)); + break; + case 2: + LOG(LOGS_WARN,NTP_ADJTIME_NAME"(0x%x) failed : %s", txc->modes, strerror(errno)); + break; + default: + assert(0); + } } return state; diff --git a/sys_timex.h b/sys_timex.h index b8617a2..0921b43 100644 --- a/sys_timex.h +++ b/sys_timex.h @@ -29,16 +29,16 @@ #include "localp.h" -extern void SYS_Timex_Initialise(void); +extern int SYS_Timex_Initialise(void); /* Initialise with some driver functions replaced with special versions */ -extern void SYS_Timex_InitialiseWithFunctions(double max_set_freq_ppm, double max_set_freq_delay, - lcl_ReadFrequencyDriver sys_read_freq, - lcl_SetFrequencyDriver sys_set_freq, - lcl_ApplyStepOffsetDriver sys_apply_step_offset, - double min_fastslew_offset, double max_fastslew_rate, - lcl_AccrueOffsetDriver sys_accrue_offset, - lcl_OffsetCorrectionDriver sys_get_offset_correction); +extern int SYS_Timex_InitialiseWithFunctions(double max_set_freq_ppm, double max_set_freq_delay, + lcl_ReadFrequencyDriver sys_read_freq, + lcl_SetFrequencyDriver sys_set_freq, + lcl_ApplyStepOffsetDriver sys_apply_step_offset, + double min_fastslew_offset, double max_fastslew_rate, + lcl_AccrueOffsetDriver sys_accrue_offset, + lcl_OffsetCorrectionDriver sys_get_offset_correction); extern void SYS_Timex_Finalise(void); -- 2.7.4 -- To unsubscribe email chrony-dev-requ...@chrony.tuxfamily.org with "unsubscribe" in the subject. For help email chrony-dev-requ...@chrony.tuxfamily.org with "help" in the subject. Trouble? Email listmas...@chrony.tuxfamily.org.