Last active
August 29, 2015 14:15
-
-
Save dougluce/4793377ee6a8d98be36e to your computer and use it in GitHub Desktop.
Example kernel module to cat MOTD
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
KMOD = motd_kmod | |
SRCS = motd_kmod.c | |
.include <bsd.kmod.mk> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// kernel module motd catter. | |
// Doug Luce [email protected] | |
#include <sys/param.h> | |
#include <sys/vnode.h> | |
#include <sys/fcntl.h> | |
#include <sys/module.h> | |
#include <sys/kernel.h> | |
#include <sys/namei.h> | |
#include <sys/proc.h> | |
#include <sys/sbuf.h> | |
static int catfile(const char *filename) { | |
struct sbuf *sb; | |
static char buf[128]; | |
struct nameidata nd; | |
off_t ofs; | |
ssize_t resid; | |
int error, flags, len; | |
NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename, curthread); | |
flags = FREAD; | |
error = vn_open(&nd, &flags, 0, NULL); | |
if (error) | |
return (error); | |
NDFREE(&nd, NDF_ONLY_PNBUF); | |
ofs = 0; | |
len = sizeof(buf) - 1; | |
sb = sbuf_new_auto(); | |
while (1) { | |
error = vn_rdwr(UIO_READ, nd.ni_vp, buf, len, ofs, | |
UIO_SYSSPACE, IO_NODELOCKED, curthread->td_ucred, | |
NOCRED, &resid, curthread); | |
if (error) | |
break; | |
if (resid == len) | |
break; | |
buf[len - resid] = 0; | |
sbuf_printf(sb, "%s", buf); | |
ofs += len - resid; | |
} | |
VOP_UNLOCK(nd.ni_vp, 0); | |
vn_close(nd.ni_vp, FREAD, curthread->td_ucred, curthread); | |
uprintf("%s", sbuf_data(sb)); | |
return 0; | |
} | |
static int EventHandler(struct module *inModule, int inEvent, void *inArg) { | |
switch (inEvent) { | |
case MOD_LOAD: | |
uprintf("MOTD module loading.\n"); | |
if (catfile("/etc/motd") != 0) | |
uprintf("Error reading MOTD.\n"); | |
return 0; | |
case MOD_UNLOAD: | |
uprintf("MOTD module unloading.\n"); | |
return 0; | |
default: | |
return EOPNOTSUPP; | |
} | |
} | |
static moduledata_t moduleData = { | |
"motd_kmod", | |
EventHandler, | |
NULL | |
}; | |
DECLARE_MODULE(motd_kmod, moduleData, SI_SUB_DRIVERS, SI_ORDER_MIDDLE); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment