diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-12-12 18:13:35 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2007-12-12 18:13:35 +0000 |
commit | 574e283890a6ca92325a06dafa76ff307a8019a2 (patch) | |
tree | 055e44e24a55fb4863e5d9cdc04e320cde52ffe9 /sysdeps/unix/sysv/linux/adjtime.c | |
parent | a162e5955f7e324be82d9318bbcbe869c66ffb86 (diff) |
Updated to fedora-glibc-20071212T1051
Diffstat (limited to 'sysdeps/unix/sysv/linux/adjtime.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/adjtime.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/sysdeps/unix/sysv/linux/adjtime.c b/sysdeps/unix/sysv/linux/adjtime.c index 38ef805cd5..202bb14485 100644 --- a/sysdeps/unix/sysv/linux/adjtime.c +++ b/sysdeps/unix/sysv/linux/adjtime.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997, 1998, 2002, 2004 +/* Copyright (C) 1995, 1996, 1997, 1998, 2002, 2004, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -22,6 +22,8 @@ #include <sys/time.h> #include <sys/timex.h> +#include <kernel-features.h> + #define MAX_SEC (INT_MAX / 1000000L - 2) #define MIN_SEC (INT_MIN / 1000000L + 2) @@ -69,13 +71,29 @@ ADJTIME (const struct TIMEVAL *itv, struct TIMEVAL *otv) return -1; } tntx.offset = tmp.tv_usec + tmp.tv_sec * 1000000L; +#ifdef ADJ_OFFSET_SS_READ + tntx.modes = ADJ_OFFSET_SS_READ; +#else tntx.modes = ADJ_OFFSET_SINGLESHOT; +#endif } else tntx.modes = 0; - if (ADJTIMEX (&tntx) < 0) - return -1; +#if defined ADJ_OFFSET_SS_READ && !defined __ASSUME_ADJ_OFFSET_SS_READ + again: +#endif + if (__builtin_expect (ADJTIMEX (&tntx) < 0, 0)) + { +#if defined ADJ_OFFSET_SS_READ && !defined __ASSUME_ADJ_OFFSET_SS_READ + if (itv && errno == EINVAL && tntx.modes == ADJ_OFFSET_SS_READ) + { + tntx.modes = ADJ_OFFSET_SINGLESHOT; + goto again; + } +#endif + return -1; + } if (otv) { |