任何人都可以给出一些简单的例子(函数名称是好的)在一个FreeBSD内核模块中,从一个给定的目录中逐行阅读文本文件(二进制是好的,如果文本真的很难)?
真的很感谢你的帮助。
下面是一个示例内核模块,它会在加载时加载你的/ etc / motd:
// kernel module motd catter. // Doug Luce doug@forephypodia.con.com #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 *inmodulee, 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);
这是拼凑在一起,主要是从https://svnweb.freebsd.org/base/release/10.1.0/sys/kern/vfs_mountroot.c?revision=274417&view=markup
在本地内核方面没有很好的扫描/解析工具,所以这通常很困难。