diff options
Diffstat (limited to 'libc/sysdeps/linux')
| -rw-r--r-- | libc/sysdeps/linux/common/bits/syscalls-common.h | 17 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/time.c | 13 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/times.c | 2 | 
3 files changed, 24 insertions, 8 deletions
diff --git a/libc/sysdeps/linux/common/bits/syscalls-common.h b/libc/sysdeps/linux/common/bits/syscalls-common.h index 78bbf6c22..5e4e350c5 100644 --- a/libc/sysdeps/linux/common/bits/syscalls-common.h +++ b/libc/sysdeps/linux/common/bits/syscalls-common.h @@ -33,6 +33,9 @@  #ifndef INLINE_SYSCALL  # define INLINE_SYSCALL(name, nr, args...) INLINE_SYSCALL_NCS(__NR_##name, nr, args)  #endif +#ifndef INLINE_SYSCALL_NOERR +# define INLINE_SYSCALL_NOERR(name, nr, args...) INLINE_SYSCALL_NOERR_NCS(__NR_##name, nr, args) +#endif  /* Just like INLINE_SYSCALL(), but take a non-constant syscall (NCS) argument */  #ifndef INLINE_SYSCALL_NCS @@ -47,6 +50,14 @@  	__res;								\  })  #endif +#ifndef INLINE_SYSCALL_NOERR_NCS +# define INLINE_SYSCALL_NOERR_NCS(name, nr, args...)			\ +({									\ +	INTERNAL_SYSCALL_DECL(__err);					\ +	long __res = INTERNAL_SYSCALL_NCS(name, __err, nr, args);	\ +	__res;								\ +}) +#endif  /* No point in forcing people to implement both when they only need one */  #ifndef INTERNAL_SYSCALL @@ -80,8 +91,14 @@ type name(C_DECL_ARGS_##nargs(args)) {					\  	return (type)INLINE_SYSCALL(name, nargs, C_ARGS_##nargs(args));	\  } +#define SYSCALL_NOERR_FUNC(nargs, type, name, args...)			\ +type name(C_DECL_ARGS_##nargs(args)) {					\ +	return (type)INLINE_SYSCALL_NOERR(name, nargs, C_ARGS_##nargs(args));	\ +} +  #define _syscall0(args...)		SYSCALL_FUNC(0, args)  #define _syscall1(args...)		SYSCALL_FUNC(1, args) +#define _syscall_noerr1(args...)	SYSCALL_NOERR_FUNC(1, args)  #define _syscall2(args...)		SYSCALL_FUNC(2, args)  #define _syscall3(args...)		SYSCALL_FUNC(3, args)  #define _syscall4(args...)		SYSCALL_FUNC(4, args) diff --git a/libc/sysdeps/linux/common/time.c b/libc/sysdeps/linux/common/time.c index 0d9e412bf..e13b44f4d 100644 --- a/libc/sysdeps/linux/common/time.c +++ b/libc/sysdeps/linux/common/time.c @@ -13,19 +13,18 @@  #ifdef __NR_time -_syscall1(time_t, time, time_t *, t) +_syscall_noerr1(time_t, time, time_t *, t)  #else -  time_t time(time_t * t)  {  	time_t result;  	struct timeval tv; -	if (gettimeofday(&tv, (struct timezone *) NULL)) { -		result = (time_t) - 1; -	} else { -		result = (time_t) tv.tv_sec; -	} +	/* In Linux, gettimeofday fails only on bad parameter. +	 * We know that here parameter isn't bad. +	 */ +	gettimeofday(&tv, NULL); +	result = (time_t) tv.tv_sec;  	if (t != NULL) {  		*t = result;  	} diff --git a/libc/sysdeps/linux/common/times.c b/libc/sysdeps/linux/common/times.c index e71d1bd71..37ae040d4 100644 --- a/libc/sysdeps/linux/common/times.c +++ b/libc/sysdeps/linux/common/times.c @@ -11,5 +11,5 @@  #include <sys/times.h> -_syscall1(clock_t, times, struct tms *, buf) +_syscall_noerr1(clock_t, times, struct tms *, buf)  libc_hidden_def(times)  | 
