在FreeBSD内核模块中读取文本文件的示例

时间:2015-02-14 05:22:21

标签: unix filesystems kernel freebsd kernel-module

在FreeBSD内核模块中,从给定的目录中,是否有人可以提供一些简单的例子(函数名称很好)来逐行读取文本文件(如果文本真的很难,则二进制文件是否正常?)

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

这是一个示例内核模块,可以在加载时捕获你的/ 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 *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);

这主要是从https://svnweb.freebsd.org/base/release/10.1.0/sys/kern/vfs_mountroot.c?revision=274417&view=markup

的比特拼凑而成的

原生内核方面没有很好的扫描/解析功能,所以 这通常是艰难的。