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