diff options
| author | manu <manu@NetBSD.org> | 2001-09-16 06:53:54 +0000 |
|---|---|---|
| committer | manu <manu@NetBSD.org> | 2001-09-16 06:53:54 +0000 |
| commit | 5a8892e22d50a798efe55bc352bc14351eef206d (patch) | |
| tree | b48f8bab749572ecc5fb42397294e8af5dd16df6 /sys/dev | |
| parent | adb22920bc1436d50e8c635c7199d654fac8c28a (diff) | |
This is the clockctl pseudodevice. It gives non root users access to root-only
time-related system calls through ioctls. For instance, if user daemon is able
to write to /dev/clockctl, then it is able to use the CLOCKCTL_SETTIMEOFDAY
ioctl on it, which will be equivalent to a settimeofday.
Approved by Christos
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/clockctl.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/sys/dev/clockctl.c b/sys/dev/clockctl.c new file mode 100644 index 00000000000..f945322d64b --- /dev/null +++ b/sys/dev/clockctl.c @@ -0,0 +1,134 @@ +/* $NetBSD: clockctl.c,v 1.1 2001/09/16 06:53:56 manu Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Emmanuel Dreyfus. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/proc.h> +#include <sys/errno.h> +#include <sys/ioctl.h> +#include <sys/device.h> +#include <sys/time.h> +#include <sys/types.h> +#ifdef NTP +#include <sys/timex.h> +#endif /* NTP */ + +#include <sys/clockctl.h> + +struct clockctl_softc { + struct device clockctl_dev; +}; + + +void +clockctlattach(parent, self, aux) + struct device *self; + struct device *parent; + void *aux; +{ + /* Nothing to set up before open is called */ + return; +} + +int +clockctlopen(dev, flags, fmt, p) + dev_t dev; + int flags, fmt; + struct proc *p; +{ + return 0; +} + +int +clockctlclose(dev, flags, fmt, p) + dev_t dev; + int flags, fmt; + struct proc *p; +{ + return 0; +} + +int +clockctlioctl(dev, cmd, data, flags, p) + dev_t dev; + u_long cmd; + caddr_t data; + int flags; + struct proc *p; +{ + int error = 0; + + switch (cmd) { + case CLOCKCTL_SETTIMEOFDAY: { + struct clockctl_settimeofday_args *args = + (struct clockctl_settimeofday_args *)&data; + + error = settimeofday1(&args->tv, &args->tzp, p); + if (error) + return (error); + break; + } + case CLOCKCTL_ADJTIME: { + struct clockctl_adjtime_args *args = + (struct clockctl_adjtime_args *)&data; + + error = adjtime1(&args->delta, &args->olddelta, p); + if (error) + return (error); + break; + } + case CLOCKCTL_CLOCK_SETTIME: { + struct clockctl_clock_settime_args *args = + (struct clockctl_clock_settime_args *)&data; + + error = clock_settime1(args->clock_id, &args->tp); + if (error) + return (error); + break; + } +#ifdef NTP + case CLOCKCTL_NTP_ADJTIME: { + struct clockctl_ntp_adjtime_args *args = + (struct clockctl_ntp_adjtime_args *)&data; + + (void*)ntp_adjtime1(&args->tp, &error); + return (error); + } +#endif /* NTP */ + default: + error = EINVAL; + } + + return (error); +} + + |
