summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2003-11-19 13:40:03 +0000
committerDimitri Sokolyuk <demon@dim13.org>2003-11-19 13:40:03 +0000
commit2df12b041f39d1f7131fa86a148ac5e0ca5da90b (patch)
tree2a5d8a2c194fe88197df11c00b6f9cb9ca766afc
OpenBSD LKM
initial import
-rw-r--r--coffee/Makefile5
-rw-r--r--coffee/README24
-rw-r--r--coffee/coffee.c118
-rw-r--r--hidep/Makefile6
-rw-r--r--hidep/hidep.c120
5 files changed, 273 insertions, 0 deletions
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 <bsd.lkm.mk>
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 <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/exec.h>
+#include <sys/lkm.h>
+
+#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 <bsd.lkm.mk>
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 <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/mount.h>
+#include <sys/exec.h>
+#include <sys/lkm.h>
+#include <sys/syscall.h>
+#include <sys/sysctl.h>
+#include <sys/syscallargs.h>
+
+#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);
+}