diff options
author | jhb <jhb@FreeBSD.org> | 2005-03-31 22:51:18 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2005-03-31 22:51:18 +0000 |
commit | 72d1a40cb6c7ff3b17cd2068b627a396451dccd6 (patch) | |
tree | cfb513c212e9107b3204c99fe38ba5134e879f3f /sys/kern/kern_time.c | |
parent | d0940291b4d76e25c459ed9f7ff55eb6becaeb44 (diff) | |
download | FreeBSD-src-72d1a40cb6c7ff3b17cd2068b627a396451dccd6.zip FreeBSD-src-72d1a40cb6c7ff3b17cd2068b627a396451dccd6.tar.gz |
Implement kern_adjtime(), kern_readv(), kern_sched_rr_get_interval(),
kern_settimeofday(), and kern_writev() to allow for further stackgap
reduction in the compat ABIs.
Diffstat (limited to 'sys/kern/kern_time.c')
-rw-r--r-- | sys/kern/kern_time.c | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c index a71e995..d0c3f9e 100644 --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -374,36 +374,53 @@ struct settimeofday_args { int settimeofday(struct thread *td, struct settimeofday_args *uap) { - struct timeval atv; - struct timezone atz; - int error = 0; + struct timeval atv, *tvp; + struct timezone atz, *tzp; + int error; + + if (uap->tv) { + error = copyin(uap->tv, &atv, sizeof(atv)); + if (error) + return (error); + tvp = &atv; + } else + tvp = NULL; + if (uap->tzp) { + error = copyin(uap->tzp, &atz, sizeof(atz)); + if (error) + return (error); + tzp = &atz; + } else + tzp = NULL; + return (kern_settimeofday(td, tvp, tzp)); +} + +int +kern_settimeofday(struct thread *td, struct timeval *tv, struct timezone *tzp) +{ + int error; #ifdef MAC error = mac_check_system_settime(td->td_ucred); if (error) return (error); #endif - if ((error = suser(td))) + error = suser(td); + if (error) return (error); /* Verify all parameters before changing time. */ - if (uap->tv) { - if ((error = copyin(uap->tv, &atv, sizeof(atv)))) - return (error); - if (atv.tv_usec < 0 || atv.tv_usec >= 1000000) + if (tv) { + if (tv->tv_usec < 0 || tv->tv_usec >= 1000000) return (EINVAL); + error = settime(td, tv); } - if (uap->tzp && - (error = copyin(uap->tzp, &atz, sizeof(atz)))) - return (error); - - if (uap->tv && (error = settime(td, &atv))) - return (error); - if (uap->tzp) { - tz_minuteswest = atz.tz_minuteswest; - tz_dsttime = atz.tz_dsttime; + if (tzp && error == 0) { + tz_minuteswest = tzp->tz_minuteswest; + tz_dsttime = tzp->tz_dsttime; } return (error); } + /* * Get value of an interval timer. The process virtual and * profiling virtual time timers are kept in the p_stats area, since |