2012-08-12 43 views
1

作爲一個概念證明,再加上一個方便的偏執狂工具,我正在編寫一個OpenBSD LKM,它將連接到一個IRC通道,並且報告何時掛鉤的系統調用被執行。OpenBSD內核模塊調用網絡功能

這樣我就可以實時更新文件系統更改,用戶登錄等等,當我離開現場但可以訪問互聯網時。

我已經得到儘可能連接插座,但我堅持嘗試執行相當於getaddrinfo甚至inet_addr調用一個硬編碼地址。

由於這些是用戶級函數,任何使用它們的嘗試都會導致未定義的引用 - 足夠公平。麻煩的是,經過一段時間的谷歌搜索和grep'ing openbsd源,我找不到任何等效的內核函數來做到這一點;最好的建議是在模塊中重新實現它們。

這意味着我需要,也能實現像islowerisxdigitisspace(也可能是別人,因爲我進步),它變得有點多執行這麼簡單的東西的東西;任何人都知道這個解決方法或替代方案,或者我從網絡文件卡住c + p代碼?

+1

爲了不讓內核模塊直接與服務器通信,爲什麼不讓它打開某些本地通信通道(例如管道或本地套接字)並讓用戶態應用程序執行實際的服務器通信? – 2012-08-12 11:12:25

+0

爲什麼內核需要執行DNS查找?爲什麼你會偏執地擔心被執行的系統調用,但是相信你的DNS系統不是可欺騙的? – tbert 2012-08-12 11:18:06

+0

我想盡量減少模塊依賴的數量(幾乎到了獨立的地步) - 我對使用內核中的userland數據不信任,即使在驗證之後。不過,你說得對,因爲用戶態通信是首選和推薦的方法,我只是喜歡與衆不同。 – septical 2012-08-12 11:24:26

回答

1

這絕對是在用戶空間中完成的更好。無論如何,OpenBSD不再支持內核模塊。

不是你正在做這個項目了。我只是想回答這個問題,這樣可以關閉,這樣我就可以闡明如何在內核中使用一些stdlib函數。

爲了應對這樣的:

這意味着我需要,也能實現像islower判斷,isxdigit判斷和isspace爲東西(也可能是別人,因爲我進步),它變得有點多執行這麼簡單的東西;任何人都知道這個解決方法或替代方案,或者我從網絡文件卡住c + p代碼?

某些C stdlib函數可從libkern獲取(請參閱libkern(9))。其他的,包括許多ctype函數,如islower(),都可以從libsa獲得。要使用這些,你需要的東西,如:

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

libsa包含頭極少數(在/usr/src/sys/lib/libsa/找到),所以包括每一個你所需要的。