(root)/
glibc-2.38/
sysdeps/
unix/
sysv/
linux/
time.c
       1  /* time -- Get number of seconds since Epoch.  Linux version.
       2     Copyright (C) 2020-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library 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 GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  /* Optimize the function call by setting the PLT directly to vDSO symbol.  */
      20  #ifdef USE_IFUNC_TIME
      21  # include <time.h>
      22  # include <sysdep.h>
      23  # include <sysdep-vdso.h>
      24  
      25  #ifdef SHARED
      26  # include <dl-vdso.h>
      27  # include <libc-vdso.h>
      28  
      29  static time_t
      30  time_syscall (time_t *t)
      31  {
      32    return INLINE_SYSCALL_CALL (time, t);
      33  }
      34  
      35  # undef INIT_ARCH
      36  # define INIT_ARCH() \
      37    void *vdso_time = dl_vdso_vsym (HAVE_TIME_VSYSCALL);
      38  libc_ifunc (time,
      39  	    vdso_time ? VDSO_IFUNC_RET (vdso_time)
      40  		      : (void *) time_syscall);
      41  
      42  # else
      43  time_t
      44  time (time_t *t)
      45  {
      46    return INLINE_VSYSCALL (time, 1, t);
      47  }
      48  # endif /* !SHARED */
      49  #else /* USE_IFUNC_TIME  */
      50  # include <time.h>
      51  # include <time-clockid.h>
      52  # include <errno.h>
      53  
      54  /* Return the time now, and store it in *TIMER if not NULL.  */
      55  
      56  __time64_t
      57  __time64 (__time64_t *timer)
      58  {
      59    struct __timespec64 ts;
      60    __clock_gettime64 (TIME_CLOCK_GETTIME_CLOCKID, &ts);
      61  
      62    if (timer != NULL)
      63      *timer = ts.tv_sec;
      64    return ts.tv_sec;
      65  }
      66  
      67  # if __TIMESIZE != 64
      68  libc_hidden_def (__time64)
      69  
      70  time_t
      71  __time (time_t *timer)
      72  {
      73    __time64_t t = __time64 (NULL);
      74  
      75    if (! in_time_t_range (t))
      76      {
      77        __set_errno (EOVERFLOW);
      78        return -1;
      79      }
      80  
      81    if (timer != NULL)
      82      *timer = t;
      83    return t;
      84  }
      85  # endif
      86  weak_alias (__time, time)
      87  #endif