From 2df12b041f39d1f7131fa86a148ac5e0ca5da90b Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 19 Nov 2003 13:40:03 +0000 Subject: OpenBSD LKM initial import --- coffee/Makefile | 5 +++ coffee/README | 24 ++++++++++++ coffee/coffee.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ hidep/Makefile | 6 +++ hidep/hidep.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 273 insertions(+) create mode 100644 coffee/Makefile create mode 100644 coffee/README create mode 100644 coffee/coffee.c create mode 100644 hidep/Makefile create mode 100644 hidep/hidep.c diff --git a/coffee/Makefile b/coffee/Makefile new file mode 100644 index 0000000..df6ea30 --- /dev/null +++ b/coffee/Makefile @@ -0,0 +1,5 @@ +LKM= coffee +SRCS+= coffee.c +NOMAN= noman + +.include diff --git a/coffee/README b/coffee/README new file mode 100644 index 0000000..f48e0d3 --- /dev/null +++ b/coffee/README @@ -0,0 +1,24 @@ +Simple driver for /dev/coffee: + +How install it: +--------------- +You'll have to change the secure level of the kernel (see securelevel(7)): +In /etc/rc.securelevel: change "securelevel=1" to "securelevel=-1". +Copy coffee.tar.gz in /usr/src/lkm/ +untar it. +cd /usr/src/lkm/coffee/ +make +make load +Next step: creating the /dev/ entry of the driver: +Do `modstat`, and take the major number of the driver, +`mknod coffee c $MAJOR 0` +That's it. + +How it works: +------------- +`echo capuccino > /dev/coffee` puts the Coffee machine plugged on the parallel + port of the PC on, assuming you've put coffee and water in :) +`cat /dev/coffee` puts it off. + + +Good drink. :) diff --git a/coffee/coffee.c b/coffee/coffee.c new file mode 100644 index 0000000..9fc8e85 --- /dev/null +++ b/coffee/coffee.c @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2001 Thomas Coffy. + * All rights reserved. + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Terrence R. Lambert. + * 4. The name Terrence R. Lambert may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY TERRENCE R. LAMBERT ``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 TERRENCE R. LAMBERT 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. + */ + +/* + * Basic lkm driver for making coffee from a shell. + * 0x3bc for /dev/lp0, 0x378 for /dev/lp1, and 0x278 for /dev/lp2 + */ + +#include +#include +#include +#include +#include +#include + +#define PORT_ADDR 0x378 /* lpt1 */ + +int coffee_load __P((struct lkm_table *, int)); +int coffee __P((struct lkm_table *, int, int)); +int coffee_open __P((dev_t, int, int, struct proc *)); +int coffee_read __P((dev_t, struct uio *, int)); + +static struct cdevsw coffee_cdevsw = { + coffee_open, (dev_type_close((*))) enodev, + coffee_read, (dev_type_write((*))) enodev, + (dev_type_ioctl((*))) enodev, + (dev_type_stop((*))) enodev, + 0, seltrue, (dev_type_mmap((*))) enodev, 0 +}; + +MOD_DEV("coffee", LM_DT_CHAR, -1, &coffee_cdevsw ); + +int +coffee(lkmtp, cmd, ver) + struct lkm_table *lkmtp; + int cmd; + int ver; +{ + DISPATCH(lkmtp, cmd, ver, coffee_load, lkm_nofunc, lkm_nofunc); + return 0; +} + +int +coffee_load(lkmtp, cmd) + struct lkm_table *lkmtp; + int cmd; +{ + if (cmd==LKM_E_LOAD) + printf("Coffee driver loaded.\n"); + if (cmd==LKM_E_UNLOAD) + printf("Coffee driver unloaded.\n"); + return 0; +} + +/* + * Open the device + */ +int +coffee_open(dev, oflags, devtype, p) + dev_t dev; + int oflags; + int devtype; + struct proc *p; +{ + int s; + + /* set power everywhere on the // port */ + s = splhigh(); + outb(PORT_ADDR, 255); + splx(s); + + return 0; +} + +int +coffee_read(dev, uio, ioflag) + dev_t dev; + struct uio *uio; + int ioflag; +{ + int s; + + /* set power everywhere on the // port */ + s = splhigh(); + outb(PORT_ADDR, 0); + splx(s); + + return 0; +} diff --git a/hidep/Makefile b/hidep/Makefile new file mode 100644 index 0000000..11b6811 --- /dev/null +++ b/hidep/Makefile @@ -0,0 +1,6 @@ +LKM= hidep +MAN= + +COPTS= -Wall -Werror + +.include diff --git a/hidep/hidep.c b/hidep/hidep.c new file mode 100644 index 0000000..5291591 --- /dev/null +++ b/hidep/hidep.c @@ -0,0 +1,120 @@ +/* + * γοπωςιηθτ (γ) 2003 ομεη σαζιυμμιξ <ζοςνΰπδπ11.οςη.ςυ> + * αμμ ςιηθτσ ςεσεςφεδ. + * + * ςεδιστςιβυτιοξ αξδ υσε ιξ σουςγε αξδ βιξαςω ζοςνσ, χιτθ ος χιτθουτ + * νοδιζιγατιοξ, αςε πεςνιττεδ πςοφιδεδ τθατ τθε ζομμοχιξη γοξδιτιοξσ + * αςε νετ: + * 1. ςεδιστςιβυτιοξσ οζ σουςγε γοδε νυστ ςεταιξ τθε αβοφε γοπωςιηθτ ξοτιγε + * υξνοδιζιεδ, τθισ μιστ οζ γοξδιτιοξσ, αξδ τθε ζομμοχιξη δισγμαινες. + * 2. ςεδιστςιβυτιοξσ ιξ βιξαςω ζοςν νυστ ςεπςοδυγε τθε αβοφε γοπωςιηθτ + * ξοτιγε, τθισ μιστ οζ γοξδιτιοξσ αξδ τθε ζομμοχιξη δισγμαινες ιξ τθε + * δογυνεξτατιοξ αξδ/ος οτθες νατεςιαμσ πςοφιδεδ χιτθ τθε διστςιβυτιοξ. + * + * τθισ σοζτχαςε ισ πςοφιδεδ βω τθε αυτθος αξδ γοξτςιβυτοςσ ``ασ ισ'' αξδ αξω + * εψπςεσσ ος ινπμιεδ χαςςαξτιεσ, ιξγμυδιξη, βυτ ξοτ μινιτεδ το, τθε ινπμιεδ + * χαςςαξτιεσ οζ νεςγθαξταβιμιτω αξδ ζιτξεσσ ζος α παςτιγυμας πυςποσε αςε + * δισγμαινεδ. ιξ ξο εφεξτ σθαμμ τθε αυτθος ος γοξτςιβυτοςσ βε μιαβμε ζος αξω + * διςεγτ, ιξδιςεγτ, ιξγιδεξταμ, σπεγιαμ, εψενπμαςω, ος γοξσερυεξτιαμ δαναηεσ + * (ιξγμυδιξη, βυτ ξοτ μινιτεδ το, πςογυςενεξτ οζ συβστιτυτε ηοοδσ ος + * σεςφιγεσ; μοσσ οζ υσε, δατα, ος πςοζιτσ; ος βυσιξεσσ ιξτεςςυπτιοξ) θοχεφες + * γαυσεδ αξδ οξ αξω τθεοςω οζ μιαβιμιτω, χθετθες ιξ γοξτςαγτ, στςιγτ + * μιαβιμιτω, ος τοςτ (ιξγμυδιξη ξεημιηεξγε ος οτθεςχισε) αςισιξη ιξ αξω χαω + * ουτ οζ τθε υσε οζ τθισ σοζτχαςε, εφεξ ιζ αδφισεδ οζ τθε ποσσιβιμιτω οζ + * συγθ δαναηε. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define KILL_SYSCALL_OFFSET 37 +#define SYSCTL_SYSCALL_OFFSET 202 + +static int hidep_handle(struct lkm_table *, int); +int hidep(struct lkm_table *, int, int); +int lkmexists(struct lkm_table *); +static int hidep_sysctl(struct proc *, void *, register_t *); +static int hidep_kill(struct proc *, void *, register_t *); + +sy_call_t *system_kill; +sy_call_t *system_sysctl; + +MOD_MISC("hidep") + +static int +hidep_handle(struct lkm_table *lkmtp, int cmd) +{ + switch (cmd) { + case LKM_E_LOAD: + if (lkmexists(lkmtp)) + return (EEXIST); + system_kill = sysent[KILL_SYSCALL_OFFSET].sy_call; + system_sysctl = sysent[SYSCTL_SYSCALL_OFFSET].sy_call; + sysent[KILL_SYSCALL_OFFSET].sy_call = hidep_kill; + sysent[SYSCTL_SYSCALL_OFFSET].sy_call = hidep_sysctl; + break; + case LKM_E_UNLOAD: + sysent[KILL_SYSCALL_OFFSET].sy_call = system_kill; + sysent[SYSCTL_SYSCALL_OFFSET].sy_call = system_sysctl; + break; + default: + return (EINVAL); + } + + return (0); +} + +int +hidep(struct lkm_table *lkmtp, int cmd, int ver) +{ + DISPATCH(lkmtp, cmd, ver, hidep_handle, hidep_handle, lkm_nofunc) +} + +int +hidep_sysctl(struct proc *p, void *v, register_t *retval) +{ + struct sys___sysctl_args *uap = v; + struct kinfo_proc *cp, *ep, *kp = SCARG(uap, old); + size_t *size = SCARG(uap, oldlenp); + int *mib = SCARG(uap, name); + int error, nentries; + + error = system_sysctl(p, v, retval); + if (error) + return (error); + + if (mib[0] != CTL_KERN || mib[1] != KERN_PROC || !p->p_ucred->cr_uid || + kp == NULL || (nentries = *size / sizeof(struct kinfo_proc)) == 0) + return (0); + + for (ep = kp, cp = kp; --nentries >= 0; cp++) { + if (cp->kp_eproc.e_pcred.p_ruid == p->p_ucred->cr_uid) { + if (cp != ep) + bcopy(cp, ep, sizeof(struct kinfo_proc)); + ep++; + } else + bzero(cp, sizeof(struct kinfo_proc)); + + } + *size = (u_int32_t)ep - (u_int32_t)kp; + + return (0); +} + +int +hidep_kill(struct proc *p, void *v, register_t *retval) +{ + int error; + + error = system_kill(p, v, retval); + + return (error == EPERM ? ESRCH: error); +} -- cgit v1.2.3