]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/unix/sysv/linux/x86/time.c
Prefer https to http for gnu.org and fsf.org URLs
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / x86 / time.c
index 1ab92489e54b330137a1e49c0006bcd2581636af..b114f148df0bb342a5f1067eaf27fa0a1d0f4a45 100644 (file)
@@ -1,5 +1,5 @@
 /* time -- Get number of seconds since Epoch.  Linux/x86 version.
-   Copyright (C) 2015 Free Software Foundation, Inc.
+   Copyright (C) 2015-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
 
    You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
+   <https://www.gnu.org/licenses/>.  */
 
 #include <time.h>
 
 #ifdef SHARED
 
 #include <dl-vdso.h>
+#include <errno.h>
 
-void *time_ifunc (void) __asm__ ("time");
-
-void *
-time_ifunc (void)
+static time_t
+__time_syscall (time_t *t)
 {
-  PREPARE_VERSION_KNOWN (linux26, LINUX_2_6);
-
-  return _dl_vdso_vsym ("__vdso_time", &linux26) ?: TIME_FALLBACK;
+  INTERNAL_SYSCALL_DECL (err);
+  return INTERNAL_SYSCALL (time, err, 1, t);
 }
-asm (".type time, %gnu_indirect_function");
 
-libc_ifunc_hidden_def(time)
+# ifndef time_type
+/* The i386 time.c includes this file with a defined time_type macro.
+   For x86_64 we have to define it to time as the internal symbol is the
+   ifunc'ed one.  */
+#  define time_type time
+# endif
+
+#undef INIT_ARCH
+#define INIT_ARCH() PREPARE_VERSION_KNOWN (linux26, LINUX_2_6);
+/* If the vDSO is not available we fall back on the syscall.  */
+libc_ifunc_hidden (time_type, time,
+                  (_dl_vdso_vsym ("__vdso_time", &linux26)
+                   ?:  &__time_syscall))
+libc_hidden_def (time)
 
 #else