diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2004-08-05 23:01:03 +0000 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2004-08-05 23:01:03 +0000 |
commit | d86254a25acd878c97af400f8ad1309ac6e307b3 (patch) | |
tree | c15293059bff93c15975ced98e23d97c13307d7e /lib/settime.c | |
parent | 71ff7490f9162ef114c2b141b1a1305e6c20c439 (diff) | |
download | coreutils-d86254a25acd878c97af400f8ad1309ac6e307b3.tar.xz |
Sync from gnulib.
Diffstat (limited to 'lib/settime.c')
-rw-r--r-- | lib/settime.c | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/lib/settime.c b/lib/settime.c index 277c80583..e989a6db6 100644 --- a/lib/settime.c +++ b/lib/settime.c @@ -1,5 +1,5 @@ /* settime -- set the system clock - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,21 +23,52 @@ #include "timespec.h" +#if HAVE_UNISTD_H +# include <unistd.h> +#endif + +#include <errno.h> + +/* Some systems don't have ENOSYS. */ +#ifndef ENOSYS +# ifdef ENOTSUP +# define ENOSYS ENOTSUP +# else +/* Some systems don't have ENOTSUP either. */ +# define ENOSYS EINVAL +# endif +#endif + /* Set the system time. */ int settime (struct timespec const *ts) { #if defined CLOCK_REALTIME && HAVE_CLOCK_SETTIME - if (clock_settime (CLOCK_REALTIME, ts) == 0) - return 0; + { + int r = clock_settime (CLOCK_REALTIME, ts); + if (r == 0 || errno == EPERM) + return r; + } #endif +#if HAVE_SETTIMEOFDAY { struct timeval tv; + int r; tv.tv_sec = ts->tv_sec; tv.tv_usec = ts->tv_nsec / 1000; - return settimeofday (&tv, 0); + r = settimeofday (&tv, 0); + if (r == 0 || errno == EPERM) + return r; } +#endif + +#if HAVE_STIME + return stime (&ts->tv_sec); +#endif + + errno = ENOSYS; + return -1; } |