summaryrefslogtreecommitdiffstats
path: root/sys/compat/linux/linux_misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/compat/linux/linux_misc.c')
-rw-r--r--sys/compat/linux/linux_misc.c97
1 files changed, 33 insertions, 64 deletions
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index 0921907..cb77fe3 100644
--- a/sys/compat/linux/linux_misc.c
+++ b/sys/compat/linux/linux_misc.c
@@ -950,97 +950,66 @@ struct l_itimerval {
l_timeval it_value;
};
+#define B2L_ITIMERVAL(bip, lip) \
+ (bip)->it_interval.tv_sec = (lip)->it_interval.tv_sec; \
+ (bip)->it_interval.tv_usec = (lip)->it_interval.tv_usec; \
+ (bip)->it_value.tv_sec = (lip)->it_value.tv_sec; \
+ (bip)->it_value.tv_usec = (lip)->it_value.tv_usec;
+
int
linux_setitimer(struct thread *td, struct linux_setitimer_args *uap)
{
int error;
- caddr_t sg;
- struct l_itimerval *lp, *lop, ls;
- struct itimerval *p = NULL, *op = NULL, s;
+ struct l_itimerval ls;
+ struct itimerval aitv, oitv;
#ifdef DEBUG
if (ldebug(setitimer))
printf(ARGS(setitimer, "%p, %p"),
(void *)uap->itv, (void *)uap->oitv);
#endif
- lp = uap->itv;
- if (lp != NULL) {
- sg = stackgap_init();
- p = stackgap_alloc(&sg, sizeof(struct itimerval));
- uap->itv = (struct l_itimerval *)p;
- error = copyin(lp, &ls, sizeof(ls));
- if (error != 0)
- return (error);
- s.it_interval.tv_sec = ls.it_interval.tv_sec;
- s.it_interval.tv_usec = ls.it_interval.tv_usec;
- s.it_value.tv_sec = ls.it_value.tv_sec;
- s.it_value.tv_usec = ls.it_value.tv_usec;
- error = copyout(&s, p, sizeof(s));
- if (error != 0)
- return (error);
-#ifdef DEBUG
- if (ldebug(setitimer)) {
- printf("setitimer: value: sec: %ld, usec: %ld\n",
- s.it_value.tv_sec, s.it_value.tv_usec);
- printf("setitimer: interval: sec: %ld, usec: %ld\n",
- s.it_interval.tv_sec, s.it_interval.tv_usec);
- }
-#endif
- }
- lop = uap->oitv;
- if (lop != NULL) {
- sg = stackgap_init();
- op = stackgap_alloc(&sg, sizeof(struct itimerval));
- uap->oitv = (struct l_itimerval *)op;
+
+ if (uap->itv == NULL) {
+ uap->itv = uap->oitv;
+ return (linux_getitimer(td, (struct linux_getitimer_args *)uap));
}
- error = setitimer(td, (struct setitimer_args *) uap);
+
+ error = copyin(uap->itv, &ls, sizeof(ls));
if (error != 0)
return (error);
- if (lop != NULL) {
- error = copyin(op, &s, sizeof(s));
- if (error != 0)
- return (error);
- ls.it_interval.tv_sec = s.it_interval.tv_sec;
- ls.it_interval.tv_usec = s.it_interval.tv_usec;
- ls.it_value.tv_sec = s.it_value.tv_sec;
- ls.it_value.tv_usec = s.it_value.tv_usec;
- error = copyout(&ls, lop, sizeof(ls));
+ B2L_ITIMERVAL(&aitv, &ls);
+#ifdef DEBUG
+ if (ldebug(setitimer)) {
+ printf("setitimer: value: sec: %ld, usec: %ld\n",
+ aitv.it_value.tv_sec, aitv.it_value.tv_usec);
+ printf("setitimer: interval: sec: %ld, usec: %ld\n",
+ aitv.it_interval.tv_sec, aitv.it_interval.tv_usec);
}
- return (error);
+#endif
+ error = kern_setitimer(td, uap->which, &aitv, &oitv);
+ if (error != 0 || uap->oitv == NULL)
+ return (error);
+ B2L_ITIMERVAL(&ls, &oitv);
+
+ return (copyout(&ls, uap->oitv, sizeof(ls)));
}
int
linux_getitimer(struct thread *td, struct linux_getitimer_args *uap)
{
int error;
- caddr_t sg;
- struct l_itimerval *lp, ls;
- struct itimerval *p = NULL, s;
+ struct l_itimerval ls;
+ struct itimerval aitv;
#ifdef DEBUG
if (ldebug(getitimer))
printf(ARGS(getitimer, "%p"), (void *)uap->itv);
#endif
- lp = uap->itv;
- if (lp != NULL) {
- sg = stackgap_init();
- p = stackgap_alloc(&sg, sizeof(struct itimerval));
- uap->itv = (struct l_itimerval *)p;
- }
- error = getitimer(td, (struct getitimer_args *) uap);
+ error = kern_getitimer(td, uap->which, &aitv);
if (error != 0)
return (error);
- if (lp != NULL) {
- error = copyin(p, &s, sizeof(s));
- if (error != 0)
- return (error);
- ls.it_interval.tv_sec = s.it_interval.tv_sec;
- ls.it_interval.tv_usec = s.it_interval.tv_usec;
- ls.it_value.tv_sec = s.it_value.tv_sec;
- ls.it_value.tv_usec = s.it_value.tv_usec;
- error = copyout(&ls, lp, sizeof(ls));
- }
- return (error);
+ B2L_ITIMERVAL(&ls, &aitv);
+ return (copyout(&ls, uap->itv, sizeof(ls)));
}
#ifndef __alpha__
OpenPOWER on IntegriCloud