Line data Source code
1 : /* settime -- set the system clock
2 :
3 : Copyright (C) 2002, 2004, 2005, 2006, 2007 Free Software
4 : Foundation, Inc.
5 :
6 : This program is free software: you can redistribute it and/or modify
7 : it under the terms of the GNU General Public License as published by
8 : the Free Software Foundation; either version 3 of the License, or
9 : (at your option) any later version.
10 :
11 : This program is distributed in the hope that it will be useful,
12 : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : GNU General Public License for more details.
15 :
16 : You should have received a copy of the GNU General Public License
17 : along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 :
19 : /* Written by Paul Eggert. */
20 :
21 : #include <config.h>
22 :
23 : #include "timespec.h"
24 :
25 : #include <sys/time.h>
26 : #include <unistd.h>
27 :
28 : #include <errno.h>
29 :
30 : /* Some systems don't have ENOSYS. */
31 : #ifndef ENOSYS
32 : # ifdef ENOTSUP
33 : # define ENOSYS ENOTSUP
34 : # else
35 : /* Some systems don't have ENOTSUP either. */
36 : # define ENOSYS EINVAL
37 : # endif
38 : #endif
39 :
40 : /* Set the system time. */
41 :
42 : int
43 2 : settime (struct timespec const *ts)
44 : {
45 : #if defined CLOCK_REALTIME && HAVE_CLOCK_SETTIME
46 : {
47 2 : int r = clock_settime (CLOCK_REALTIME, ts);
48 2 : if (r == 0 || errno == EPERM)
49 2 : return r;
50 : }
51 : #endif
52 :
53 : #if HAVE_SETTIMEOFDAY
54 : {
55 : struct timeval tv;
56 :
57 0 : tv.tv_sec = ts->tv_sec;
58 0 : tv.tv_usec = ts->tv_nsec / 1000;
59 0 : return settimeofday (&tv, 0);
60 : }
61 : #elif HAVE_STIME
62 : /* This fails to compile on OSF1 V5.1, due to stime requiring
63 : a `long int*' and tv_sec is `int'. But that system does provide
64 : settimeofday. */
65 : return stime (&ts->tv_sec);
66 : #else
67 : errno = ENOSYS;
68 : return -1;
69 : #endif
70 : }
|