summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_time.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2005-03-31 22:51:18 +0000
committerjhb <jhb@FreeBSD.org>2005-03-31 22:51:18 +0000
commit72d1a40cb6c7ff3b17cd2068b627a396451dccd6 (patch)
treecfb513c212e9107b3204c99fe38ba5134e879f3f /sys/kern/kern_time.c
parentd0940291b4d76e25c459ed9f7ff55eb6becaeb44 (diff)
downloadFreeBSD-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.c51
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
OpenPOWER on IntegriCloud