diff options
-rw-r--r-- | include/time.h | 1 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/settimeofday.c | 30 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/stime.c | 19 |
3 files changed, 40 insertions, 10 deletions
diff --git a/include/time.h b/include/time.h index bea562399..50a412de0 100644 --- a/include/time.h +++ b/include/time.h @@ -318,6 +318,7 @@ extern long int timezone; /* Set the system time to *WHEN. This call is restricted to the superuser. */ extern int stime (__const time_t *__when) __THROW; +libc_hidden_proto(stime) # endif diff --git a/libc/sysdeps/linux/common/settimeofday.c b/libc/sysdeps/linux/common/settimeofday.c index 7e508aea0..e6b396e15 100644 --- a/libc/sysdeps/linux/common/settimeofday.c +++ b/libc/sysdeps/linux/common/settimeofday.c @@ -8,12 +8,36 @@ */ #include <sys/syscall.h> -#include <sys/time.h> #ifdef __USE_BSD +# include <sys/time.h> +# ifdef __NR_settimeofday +_syscall2(int, settimeofday, const struct timeval *, tv, + const struct timezone *, tz) +# elif defined __USE_SVID && defined __NR_stime +# define __need_NULL +# include <stddef.h> +# include <errno.h> +# include <time.h> +int settimeofday(const struct timeval *tv, const struct timezone *tz) +{ + time_t when; + if (tv == NULL) { + __set_errno(EINVAL); + return -1; + } -_syscall2(int, settimeofday, const struct timeval *, tv, - const struct timezone *, tz) + if (tz != NULL || tv->tv_usec % 1000000 != 0) { + __set_errno(ENOSYS); + return -1; + } + + when = tv->tv_sec + (tv->tv_usec / 1000000); + return stime(&when); +} +# endif +# if defined __NR_settimeofday || (defined __USE_SVID && defined __NR_stime) libc_hidden_def(settimeofday) +# endif #endif diff --git a/libc/sysdeps/linux/common/stime.c b/libc/sysdeps/linux/common/stime.c index cb7e8040c..b30884dd7 100644 --- a/libc/sysdeps/linux/common/stime.c +++ b/libc/sysdeps/linux/common/stime.c @@ -8,15 +8,17 @@ */ #include <sys/syscall.h> -#include <time.h> -#include <sys/time.h> #ifdef __USE_SVID -#ifdef __NR_stime +# include <time.h> +# ifdef __NR_stime _syscall1(int, stime, const time_t *, t) -#else - -int stime(const time_t * when) +# elif defined __USE_BSD && defined __NR_settimeofday +# define __need_NULL +# include <stddef.h> +# include <errno.h> +# include <sys/time.h> +int stime(const time_t *when) { struct timeval tv; @@ -28,5 +30,8 @@ int stime(const time_t * when) tv.tv_usec = 0; return settimeofday(&tv, (struct timezone *) 0); } -#endif +# endif +# if defined __NR_stime || (defined __USE_BSD && defined __NR_settimeofday) +libc_hidden_def(stime) +# endif #endif |