(root)/
tar-1.35/
gnu/
sleep.c
       1  /* Pausing execution of the current thread.
       2     Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
       3     Written by Bruno Haible <bruno@clisp.org>, 2007.
       4  
       5     This file is free software: you can redistribute it and/or modify
       6     it under the terms of the GNU Lesser General Public License as
       7     published by the Free Software Foundation; either version 2.1 of the
       8     License, or (at your option) any later version.
       9  
      10     This file 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 Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public License
      16     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <config.h>
      19  
      20  /* Specification.  */
      21  #include <unistd.h>
      22  
      23  #include <limits.h>
      24  
      25  #if defined _WIN32 && ! defined __CYGWIN__
      26  
      27  # define WIN32_LEAN_AND_MEAN  /* avoid including junk */
      28  # include <windows.h>
      29  
      30  unsigned int
      31  sleep (unsigned int seconds)
      32  {
      33    unsigned int remaining;
      34  
      35    /* Sleep for 1 second many times, because
      36         1. Sleep is not interruptible by Ctrl-C,
      37         2. we want to avoid arithmetic overflow while multiplying with 1000.  */
      38    for (remaining = seconds; remaining > 0; remaining--)
      39      Sleep (1000);
      40  
      41    return remaining;
      42  }
      43  
      44  #elif HAVE_SLEEP
      45  
      46  # undef sleep
      47  
      48  /* Guarantee unlimited sleep and a reasonable return value.  Cygwin
      49     1.5.x rejects attempts to sleep more than 49.7 days (2**32
      50     milliseconds), but uses uninitialized memory which results in a
      51     garbage answer.  Similarly, Linux 2.6.9 with glibc 2.3.4 has a too
      52     small return value when asked to sleep more than 24.85 days.  */
      53  unsigned int
      54  rpl_sleep (unsigned int seconds)
      55  {
      56    /* This requires int larger than 16 bits.  */
      57    static_assert (UINT_MAX / 24 / 24 / 60 / 60);
      58    const unsigned int limit = 24 * 24 * 60 * 60;
      59    while (limit < seconds)
      60      {
      61        unsigned int result;
      62        seconds -= limit;
      63        result = sleep (limit);
      64        if (result)
      65          return seconds + result;
      66      }
      67    return sleep (seconds);
      68  }
      69  
      70  #else /* !HAVE_SLEEP */
      71  
      72   #error "Please port gnulib sleep.c to your platform, possibly using usleep() or select(), then report this to bug-gnulib."
      73  
      74  #endif