/* * ntp_adjtime() - NTP daemon application interface */ int sys_ntp_adjtime(struct lwp *l, const struct sys_ntp_adjtime_args *uap, register_t *retval) { /* { syscallarg(struct timex *) tp; } */ struct timex ntv; int error = 0; error = copyin((void *)SCARG(uap, tp), (void *)&ntv, sizeof(ntv)); if (error != 0) return (error); if (ntv.modes != 0 && (error = kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_TIME, KAUTH_REQ_SYSTEM_TIME_NTPADJTIME, NULL, NULL, NULL)) != 0) return (error); ntp_adjtime1(&ntv); error = copyout((void *)&ntv, (void *)SCARG(uap, tp), sizeof(ntv)); if (!error) *retval = ntp_timestatus(); return error; }
int compat_50_netbsd32_ntp_gettime(struct lwp *l, const struct compat_50_netbsd32_ntp_gettime_args *uap, register_t *retval) { /* { syscallarg(netbsd32_ntptimeval50p_t) ntvp; } */ struct netbsd32_ntptimeval50 ntv32; struct ntptimeval ntv; int error = 0; if (SCARG_P32(uap, ntvp)) { ntp_gettime(&ntv); ntv32.time.tv_sec = (int32_t)ntv.time.tv_sec; ntv32.time.tv_nsec = ntv.time.tv_nsec; ntv32.maxerror = (netbsd32_long)ntv.maxerror; ntv32.esterror = (netbsd32_long)ntv.esterror; ntv32.tai = (netbsd32_long)ntv.tai; ntv32.time_state = ntv.time_state; error = copyout(&ntv32, SCARG_P32(uap, ntvp), sizeof(ntv32)); } if (!error) { *retval = ntp_timestatus(); } return (error); }
int netbsd32_ntp_adjtime(struct lwp *l, const struct netbsd32_ntp_adjtime_args *uap, register_t *retval) { /* { syscallarg(netbsd32_timexp_t) tp; } */ struct netbsd32_timex ntv32; struct timex ntv; int error = 0; int modes; if ((error = copyin(SCARG_P32(uap, tp), &ntv32, sizeof(ntv32)))) return (error); netbsd32_to_timex(&ntv32, &ntv); /* * Update selected clock variables - only the superuser can * change anything. Note that there is no error checking here on * the assumption the superuser should know what it is doing. */ modes = ntv.modes; if (modes != 0 && (error = kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_TIME, KAUTH_REQ_SYSTEM_TIME_NTPADJTIME, NULL, NULL, NULL))) return (error); ntp_adjtime1(&ntv); netbsd32_from_timex(&ntv, &ntv32); error = copyout(&ntv32, SCARG_P32(uap, tp), sizeof(ntv32)); if (!error) { *retval = ntp_timestatus(); } return error; }
int clockctlioctl( dev_t dev, u_long cmd, void *data, int flags, struct lwp *l) { int error = 0; switch (cmd) { case CLOCKCTL_SETTIMEOFDAY: { struct clockctl_settimeofday *args = data; error = settimeofday1(args->tv, true, args->tzp, l, false); break; } case CLOCKCTL_ADJTIME: { struct timeval atv, oldatv; struct clockctl_adjtime *args = data; if (args->delta) { error = copyin(args->delta, &atv, sizeof(atv)); if (error) return (error); } adjtime1(args->delta ? &atv : NULL, args->olddelta ? &oldatv : NULL, l->l_proc); if (args->olddelta) error = copyout(&oldatv, args->olddelta, sizeof(oldatv)); break; } case CLOCKCTL_CLOCK_SETTIME: { struct clockctl_clock_settime *args = data; struct timespec ts; error = copyin(args->tp, &ts, sizeof ts); if (error) return (error); error = clock_settime1(l->l_proc, args->clock_id, &ts, false); break; } #ifdef NTP case CLOCKCTL_NTP_ADJTIME: { struct clockctl_ntp_adjtime *args = data; struct timex ntv; error = copyin(args->tp, &ntv, sizeof(ntv)); if (error) return (error); ntp_adjtime1(&ntv); error = copyout(&ntv, args->tp, sizeof(ntv)); if (error == 0) args->retval = ntp_timestatus(); break; } #endif /* NTP */ default: #ifdef COMPAT_50 error = compat50_clockctlioctl(dev, cmd, data, flags, l); #else error = EINVAL; #endif } return (error); }