summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/time.h1
-rw-r--r--libc/sysdeps/linux/common/settimeofday.c30
-rw-r--r--libc/sysdeps/linux/common/stime.c19
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