aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2019-01-21 16:17:36 +0100
committerArnd Bergmann <arnd@arndb.de>2019-01-25 13:34:31 +0100
commit4149f0fb9e27f6ddee74a0fb8ce66289f663e9c5 (patch)
treefc6aee95777729563d636212ed02bf58f5e8e04a
parent1c4a47333c169412bad5c7f909909261b8dc7cbf (diff)
roll back rusage and itimerval
The kernel does not (yet) have new syscalls for these, so we implement them on top of the time32 ones instead. This is ugly but safe, because the timeval values we pass here are always used for relative times. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-rw-r--r--src/include/time.h23
-rw-r--r--src/internal/syscall.h5
-rw-r--r--src/linux/wait4.c14
-rw-r--r--src/misc/getrusage.c9
-rw-r--r--src/process/waitid.c4
-rw-r--r--src/signal/getitimer.c8
-rw-r--r--src/signal/setitimer.c28
-rw-r--r--src/stdio/pclose.c4
-rw-r--r--src/unistd/alarm.c11
-rw-r--r--src/unistd/faccessat.c6
10 files changed, 61 insertions, 51 deletions
diff --git a/src/include/time.h b/src/include/time.h
index 24c87973..7266f292 100644
--- a/src/include/time.h
+++ b/src/include/time.h
@@ -11,4 +11,27 @@ hidden struct tm *__localtime_r(const time_t *restrict, struct tm *restrict);
hidden size_t __strftime_l(char *restrict, size_t, const char *restrict, const struct tm *restrict, locale_t);
+typedef long __old_time_t;
+typedef long __old_suseconds_t;
+
+struct __old_timeval {
+ __old_time_t tv_sec;
+ __old_suseconds_t tv_usec;
+};
+
+struct __old_itimerval {
+ struct __old_timeval it_interval;
+ struct __old_timeval it_value;
+};
+
+struct __old_timespec {
+ __old_time_t tv_sec;
+ long tv_nsec;
+};
+
+struct __old_itimerspec {
+ struct __old_timespec it_interval;
+ struct __old_timeval it_value;
+};
+
#endif
diff --git a/src/internal/syscall.h b/src/internal/syscall.h
index 20a88c33..c54cdc08 100644
--- a/src/internal/syscall.h
+++ b/src/internal/syscall.h
@@ -261,8 +261,6 @@ hidden void *__vdsosym(const char *, const char *);
#undef SYS_clock_getres
#undef SYS_clock_nanosleep
#undef SYS_alarm
-#undef SYS_getitimer
-#undef SYS_setitimer
#undef SYS_timer_gettime
#undef SYS_timer_settime
#undef SYS_timerfd_gettime
@@ -298,9 +296,6 @@ hidden void *__vdsosym(const char *, const char *);
#undef SYS_rt_sigtimedwait
#undef SYS_futex
#undef SYS_sched_rr_get_interval
-#undef SYS_getrusagea
-#undef SYS_wait4
-#undef SYS_waitid
#endif
#endif
diff --git a/src/linux/wait4.c b/src/linux/wait4.c
index 715b7e6b..c53218c9 100644
--- a/src/linux/wait4.c
+++ b/src/linux/wait4.c
@@ -6,20 +6,20 @@
pid_t wait4(pid_t pid, int *status, int options, struct rusage *ru)
{
#if defined(__USE_TIME_BITS64) || (defined(__x86_64__) && defined(__ILP32__))
- struct __kernel_rusage kr;
+ struct __old_rusage kr;
siginfo_t info;
int ret;
options |= WEXITED;
if (pid == -1)
- ret = __syscall_cp(SYS_waitid_time64, P_ALL, 0, &info, options, ru ? &kr : 0);
+ ret = __syscall_cp(SYS_waitid, P_ALL, 0, &info, options, ru ? &kr : 0);
else if (pid < -1)
- ret = __syscall_cp(SYS_waitid_time64, P_PGID, -pid, &info, options, ru ? &kr : 0);
+ ret = __syscall_cp(SYS_waitid, P_PGID, -pid, &info, options, ru ? &kr : 0);
else if (pid == 0)
- ret = __syscall_cp(SYS_waitid_time64, P_PGID, __syscall(SYS_getpgid, 0), &info, options, ru ? &kr : 0);
+ ret = __syscall_cp(SYS_waitid, P_PGID, __syscall(SYS_getpgid, 0), &info, options, ru ? &kr : 0);
else
- ret = __syscall_cp(SYS_waitid_time64, P_PID, pid, &info, options, ru ? &kr : 0);
+ ret = __syscall_cp(SYS_waitid, P_PID, pid, &info, options, ru ? &kr : 0);
if (ret < 0)
return __syscall_ret(ret);
@@ -47,9 +47,9 @@ pid_t wait4(pid_t pid, int *status, int options, struct rusage *ru)
if (ru) {
ru->ru_utime.tv_sec = kr.ru_utime.tv_sec;
- ru->ru_utime.tv_usec = kr.ru_utime.tv_nsec / 1000;
+ ru->ru_utime.tv_usec = kr.ru_utime.tv_usec;
ru->ru_stime.tv_sec = kr.ru_stime.tv_sec;
- ru->ru_stime.tv_usec = kr.ru_stime.tv_nsec / 1000;
+ ru->ru_stime.tv_usec = kr.ru_stime.tv_usec;
ru->ru_maxrss = kr.ru_maxrss;
ru->ru_ixrss = kr.ru_ixrss;
ru->ru_idrss = kr.ru_idrss;
diff --git a/src/misc/getrusage.c b/src/misc/getrusage.c
index 4e3013d2..d32cdbe1 100644
--- a/src/misc/getrusage.c
+++ b/src/misc/getrusage.c
@@ -1,18 +1,19 @@
#include <sys/resource.h>
+#include <time.h>
#include "syscall.h"
int getrusage(int who, struct rusage *ru)
{
#if defined(__USE_TIME_BITS64) || (defined(__x86_64__) && defined(__ILP32__))
- struct __kernel_rusage kr;
+ struct __old_rusage kr;
int ret;
- ret = syscall(SYS_getrusage_time64, who, &kr);
+ ret = syscall(SYS_getrusage, who, &kr);
ru->ru_utime.tv_sec = kr.ru_utime.tv_sec;
- ru->ru_utime.tv_usec = kr.ru_utime.tv_nsec / 1000;
+ ru->ru_utime.tv_usec = kr.ru_utime.tv_usec;
ru->ru_stime.tv_sec = kr.ru_stime.tv_sec;
- ru->ru_stime.tv_usec = kr.ru_stime.tv_nsec / 1000;
+ ru->ru_stime.tv_usec = kr.ru_stime.tv_usec;
ru->ru_maxrss = kr.ru_maxrss;
ru->ru_ixrss = kr.ru_ixrss;
ru->ru_idrss = kr.ru_idrss;
diff --git a/src/process/waitid.c b/src/process/waitid.c
index d9b2d6ed..d688650d 100644
--- a/src/process/waitid.c
+++ b/src/process/waitid.c
@@ -3,9 +3,5 @@
int waitid(idtype_t type, id_t id, siginfo_t *info, int options)
{
-#ifdef __USE_TIME_BITS64
- return syscall_cp(SYS_waitid_time64, type, id, info, options, 0);
-#else
return syscall_cp(SYS_waitid, type, id, info, options, 0);
-#endif
}
diff --git a/src/signal/getitimer.c b/src/signal/getitimer.c
index 5ad37b2f..84706ccf 100644
--- a/src/signal/getitimer.c
+++ b/src/signal/getitimer.c
@@ -5,13 +5,13 @@
int getitimer(int which, struct itimerval *old)
{
#ifdef __USE_TIME_BITS64
- struct itimerspec its;
- int ret = syscall(SYS_getitimer64, which, 0, &its);
+ struct __old_itimerval its;
+ int ret = syscall(SYS_getitimer, which, &its);
old->it_interval.tv_sec = its.it_interval.tv_sec;
- old->it_interval.tv_usec = its.it_interval.tv_nsec / 1000;
+ old->it_interval.tv_usec = its.it_interval.tv_usec;
old->it_value.tv_sec = its.it_value.tv_sec;
- old->it_value.tv_usec = its.it_value.tv_nsec / 1000;
+ old->it_value.tv_usec = its.it_value.tv_usec;
return ret;
#else
diff --git a/src/signal/setitimer.c b/src/signal/setitimer.c
index 9865f6bd..49e4e7cf 100644
--- a/src/signal/setitimer.c
+++ b/src/signal/setitimer.c
@@ -1,26 +1,34 @@
#include <sys/time.h>
#include <time.h>
+#include <limits.h>
#include "syscall.h"
int setitimer(int which, const struct itimerval *restrict new, struct itimerval *restrict old)
{
#ifdef __USE_TIME_BITS64
- struct itimerspec its_old, its_new;
+ struct __old_itimerval its_old, its_new;
int ret;
- its_new.it_interval.tv_sec = new->it_interval.tv_sec;
- its_new.it_interval.tv_nsec = new->it_interval.tv_usec * 1000;
- its_new.it_value.tv_sec = new->it_value.tv_sec;
- its_new.it_value.tv_nsec = new->it_value.tv_usec * 1000;
+ if (new) {
+ its_new.it_interval.tv_sec = new->it_interval.tv_sec;
+ if (new->it_interval.tv_sec > LONG_MAX)
+ its_new.it_interval.tv_sec = LONG_MAX;
+ its_new.it_interval.tv_usec = new->it_interval.tv_usec;
+ its_new.it_value.tv_sec = new->it_value.tv_sec;
+ its_new.it_value.tv_usec = new->it_value.tv_usec;
+ }
- ret = syscall(SYS_setitimer64, which, 0, &its_new, &its_old);
+ ret = syscall(SYS_setitimer, which, new ? &its_new : NULL,
+ old ? &its_old : NULL);
if (ret)
return ret;
- old->it_interval.tv_sec = its_old.it_interval.tv_sec;
- old->it_interval.tv_usec = its_old.it_interval.tv_nsec / 1000;
- old->it_value.tv_sec = its_old.it_value.tv_sec;
- old->it_value.tv_usec = its_old.it_value.tv_nsec / 1000;
+ if (old) {
+ old->it_interval.tv_sec = its_old.it_interval.tv_sec;
+ old->it_interval.tv_usec = its_old.it_interval.tv_usec;
+ old->it_value.tv_sec = its_old.it_value.tv_sec;
+ old->it_value.tv_usec = its_old.it_value.tv_usec;
+ }
return ret;
#else
diff --git a/src/stdio/pclose.c b/src/stdio/pclose.c
index a382dcb1..0ffd2ed0 100644
--- a/src/stdio/pclose.c
+++ b/src/stdio/pclose.c
@@ -10,11 +10,7 @@ int pclose(FILE *f)
siginfo_t info;
pid_t pid = f->pipe_pid;
fclose(f);
-#ifdef __USE_TIME_BITS64
- while ((r=__syscall(SYS_waitid_time64, P_PID, pid, &info, WEXITED, 0)) == -EINTR);
-#else
while ((r=__syscall(SYS_waitid, P_PID, pid, &info, WEXITED, 0)) == -EINTR);
-#endif
if (r<0) return __syscall_ret(r);
return info.si_status;
}
diff --git a/src/unistd/alarm.c b/src/unistd/alarm.c
index afb7f4e3..2070c5f2 100644
--- a/src/unistd/alarm.c
+++ b/src/unistd/alarm.c
@@ -1,17 +1,14 @@
#include <unistd.h>
#include <sys/time.h>
#include <time.h>
+#include <limits.h>
#include "syscall.h"
unsigned alarm(unsigned seconds)
{
-#ifdef __USE_TIME_BITS64
- struct itimerspec it = { .it_value.tv_sec = seconds };
- __syscall(SYS_setitimer64, ITIMER_REAL, 0, &it, &it);
- return it.it_value.tv_sec + !!it.it_value.tv_nsec;
-#else
- struct itimerval it = { .it_value.tv_sec = seconds };
+ struct __old_itimerval it = { .it_value.tv_sec = seconds };
+ if (seconds > INT_MAX)
+ it.it_value.tv_sec = INT_MAX;
__syscall(SYS_setitimer, ITIMER_REAL, &it, &it);
return it.it_value.tv_sec + !!it.it_value.tv_usec;
-#endif
}
diff --git a/src/unistd/faccessat.c b/src/unistd/faccessat.c
index e66913b3..76bbd4c7 100644
--- a/src/unistd/faccessat.c
+++ b/src/unistd/faccessat.c
@@ -34,9 +34,7 @@ int faccessat(int fd, const char *filename, int amode, int flag)
char stack[1024];
sigset_t set;
pid_t pid;
-#ifndef __USE_TIME_BITS64
int status;
-#endif
int ret, p[2];
if (pipe2(p, O_CLOEXEC)) return __syscall_ret(-EBUSY);
@@ -50,11 +48,7 @@ int faccessat(int fd, const char *filename, int amode, int flag)
if (pid<0 || __syscall(SYS_read, p[0], &ret, sizeof ret) != sizeof(ret))
ret = -EBUSY;
__syscall(SYS_close, p[0]);
-#ifdef __USE_TIME_BITS64
- __syscall(SYS_waitid_time64, P_PID, pid, 0, WEXITED | __WCLONE, 0);
-#else
__syscall(SYS_wait4, pid, &status, __WCLONE, 0);
-#endif
__restore_sigs(&set);