diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-11-02 16:18:29 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-11-09 11:19:35 -0300 |
commit | 75a193b7611bade31a150dfcc528b973e3d46231 (patch) | |
tree | 0ede2fea4979986c6031b3fd037077b14d855cf4 | |
parent | 5edf3d9fd6efe06fda37b2a460e60690a90457a4 (diff) | |
download | glibc-75a193b7611bade31a150dfcc528b973e3d46231.tar.gz glibc-75a193b7611bade31a150dfcc528b973e3d46231.tar.xz glibc-75a193b7611bade31a150dfcc528b973e3d46231.zip |
linux: Allow adjtime with NULL argument [BZ #26833]
The adjtime interface allows return the amount of time remaining from any previous adjustment that has not yet been completed by passing a NULL as first argument. This was introduced with y2038 support 0308077e3a. Checked on i686-linux-gnu. Reviewed-by: Lukasz Majewski <lukma@denx.de>
-rw-r--r-- | sysdeps/unix/sysv/linux/adjtime.c | 11 | ||||
-rw-r--r-- | time/Makefile | 3 | ||||
-rw-r--r-- | time/tst-adjtime.c | 44 |
3 files changed, 54 insertions, 4 deletions
diff --git a/sysdeps/unix/sysv/linux/adjtime.c b/sysdeps/unix/sysv/linux/adjtime.c index 3f9a4ea2eb..6d1d1b6af2 100644 --- a/sysdeps/unix/sysv/linux/adjtime.c +++ b/sysdeps/unix/sysv/linux/adjtime.c @@ -68,11 +68,16 @@ libc_hidden_def (__adjtime64) int __adjtime (const struct timeval *itv, struct timeval *otv) { - struct __timeval64 itv64, otv64; + struct __timeval64 itv64, *pitv64 = NULL; + struct __timeval64 otv64; int retval; - itv64 = valid_timeval_to_timeval64 (*itv); - retval = __adjtime64 (&itv64, otv != NULL ? &otv64 : NULL); + if (itv != NULL) + { + itv64 = valid_timeval_to_timeval64 (*itv); + pitv64 = &itv64; + } + retval = __adjtime64 (pitv64, otv != NULL ? &otv64 : NULL); if (otv != NULL) *otv = valid_timeval64_to_timeval (otv64); diff --git a/time/Makefile b/time/Makefile index 26aa835166..f27a75a115 100644 --- a/time/Makefile +++ b/time/Makefile @@ -47,7 +47,8 @@ tests := test_time clocktest tst-posixtz tst-strptime tst_wcsftime \ tst-mktime3 tst-strptime2 bug-asctime bug-asctime_r bug-mktime1 \ tst-strptime3 bug-getdate1 tst-strptime-whitespace tst-ftime \ tst-tzname tst-y2039 bug-mktime4 tst-strftime2 tst-strftime3 \ - tst-clock tst-clock2 tst-clock_nanosleep tst-cpuclock1 + tst-clock tst-clock2 tst-clock_nanosleep tst-cpuclock1 \ + tst-adjtime include ../Rules diff --git a/time/tst-adjtime.c b/time/tst-adjtime.c new file mode 100644 index 0000000000..ae2b37cdab --- /dev/null +++ b/time/tst-adjtime.c @@ -0,0 +1,44 @@ +/* Basic tests for adjtime. + Copyright (C) 2020 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <sys/time.h> +#include <stdlib.h> + +#include <errno.h> +#include <support/check.h> + + +static int +do_test (void) +{ + /* Check if the interface allows getting the amount of time remaining + from any previous adjustment that has not yet been completed. This + is a non-privileged function of adjtime. */ + struct timeval tv; + int r = adjtime (NULL, &tv); + if (r == -1) + { + if (errno == ENOSYS) + FAIL_UNSUPPORTED ("adjtime unsupported"); + FAIL_EXIT1 ("adjtime (NULL, ...) failed: %m"); + } + + return 0; +} + +#include <support/test-driver.c> |