OpenBSD内核模块调用网络功能

时间:2012-08-12 11:05:18

标签: c sockets bsd openbsd

作为一个概念验证,加上一个方便的偏执工具,我正在编写一个OpenBSD LKM,它将连接到IRC通道,并在执行挂钩系统调用时报告。

当我离开现场但可以访问互联网时,我基本上可以对文件系统更改,用户登录等进行“实时”更新。

我已经连接套接字了,但我仍然坚持尝试使用硬编码地址执行相当于getaddrinfo甚至inet_addr的呼叫。

由于这些是userland函数,任何使用它们的尝试都会导致未定义的引用 - 足够公平。麻烦的是,经过一段时间的谷歌搜索和grep'ing openbsd源代码,我找不到任何等效的内核函数来做到这一点;最好的建议是在模块中重新实现它们。

这意味着我还需要实现诸如islowerisxdigitisspace之类的内容(以及其他可能正在进步的内容),这对于执行如此简单的操作有点大意义;是否有人知道解决方法或替代方案,或者我是否从网络文件中删除了c + p代码?

1 个答案:

答案 0 :(得分:1)

这绝对是在用户空间中做得更好。无论如何,OpenBSD不再支持内核模块。

不再是你在这个项目上工作了。我只是想回答这个问题,以便我可以解释如何在内核中使用一些stdlib函数。

回应:

  

这意味着我还需要实现像islower,isxdigit和isspace这样的东西(可能还有其他的东西,比如我的进步),这对于执行如此简单的事情有点多了;是否有人知道解决方法或替代方案,或者我是否从网络文件中删除了c + p代码?

libkern提供了一些C stdlib函数(参见libkern(9))。其他,包括许多ctype函数,如islower(),可从libsa获得。要使用这些,您需要以下内容:

#include <lib/libkern/libkern.h>
#include <lib/libsa/stand.h>

libsa包含一些标题(在/usr/src/sys/lib/libsa/中找到),因此请包含您需要的每个标题。