1 /* Copyright (C) 2003 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
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 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    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; see the file COPYING.LIB.  If
17    not, see <http://www.gnu.org/licenses/>.  */
18 
19 #include <errno.h>
20 #include <stdlib.h>
21 #include <time.h>
22 #include <sysdep.h>
23 #include <bits/kernel-features.h>
24 #include "kernel-posix-timers.h"
25 
26 
27 #if defined(__NR_timer_gettime) || defined(__NR_timer_gettime64)
28 # ifndef __ASSUME_POSIX_TIMERS
29 static int compat_timer_gettime (timer_t timerid, struct itimerspec *value);
30 #  define timer_gettime static compat_timer_gettime
31 #  include <nptl/sysdeps/pthread/timer_gettime.c>
32 #  undef timer_gettime
33 # endif
34 
35 # ifdef timer_gettime_alias
36 #  define timer_gettime timer_gettime_alias
37 # endif
38 
39 
40 int
timer_gettime(timer_t timerid,struct itimerspec * value)41 timer_gettime (
42      timer_t timerid,
43      struct itimerspec *value)
44 {
45 # undef timer_gettime
46 # ifndef __ASSUME_POSIX_TIMERS
47   if (__no_posix_timers >= 0)
48 # endif
49     {
50       struct timer *kt = (struct timer *) timerid;
51 
52       /* Delete the kernel timer object.  */
53 # if defined(__UCLIBC_USE_TIME64__) && defined(__NR_timer_gettime64)
54       int res = INLINE_SYSCALL (timer_gettime64, 2, kt->ktimerid, value);
55 # else
56       int res = INLINE_SYSCALL (timer_gettime, 2, kt->ktimerid, value);
57 # endif
58 
59 # ifndef __ASSUME_POSIX_TIMERS
60       if (res != -1 || errno != ENOSYS)
61 	{
62 	  /* We know the syscall support is available.  */
63 	  __no_posix_timers = 1;
64 # endif
65 	  return res;
66 # ifndef __ASSUME_POSIX_TIMERS
67 	}
68 # endif
69 
70 # ifndef __ASSUME_POSIX_TIMERS
71       __no_posix_timers = -1;
72 # endif
73     }
74 
75 # ifndef __ASSUME_POSIX_TIMERS
76   return compat_timer_gettime (timerid, value);
77 # endif
78 }
79 #else
80 # ifdef timer_gettime_alias
81 #  define timer_gettime timer_gettime_alias
82 # endif
83 /* The new system calls are not available.  Use the userlevel
84    implementation.  */
85 # include <nptl/sysdeps/pthread/timer_gettime.c>
86 #endif
87