Wifidog是一個(gè)linux下開源的認(rèn)證網(wǎng)關(guān)軟件撞牢,它主要用于配合認(rèn)證服務(wù)器實(shí)現(xiàn)無線路由器的認(rèn)證放行功能雌团。
wifidog是一個(gè)后臺(tái)的服務(wù)程序,可以通過wdctrl命令對wifidog主程序進(jìn)行控制。
本文解釋wifidog在啟動(dòng)階段所做的初始化主要工作(代碼片段1.1)
初始化配置(先將配置結(jié)構(gòu)體初始化為默認(rèn)值,在讀取配置文件修改配置結(jié)構(gòu)體)
初始化已連接客戶端列表(如果是通過wdctrl重啟wifidog惶岭,將會(huì)讀取之前wifidog的已連接客戶端列表 代碼片段1.2 代碼片段1.3)
如無特殊情況,分離進(jìn)程鸵贬,建立守護(hù)進(jìn)程 (代碼片段1.1)
添加多個(gè)http請求回調(diào)函數(shù)(包括404錯(cuò)誤回調(diào)函數(shù)) (見之后章節(jié))
摧毀刪除現(xiàn)有的iptables路由表規(guī)則 (見之后章節(jié))
建立新的iptables路由表規(guī)則 (見之后章節(jié))
啟動(dòng)多個(gè)功能線程 (見之后章節(jié))
循環(huán)等待客戶端連接 (見之后章節(jié))
int main(int argc, char **argv) {
s_config *config = config_get_config(); //就是返回全局變量config結(jié)構(gòu)體的地址
config_init(); //初始化全局變量config結(jié)構(gòu)體為默認(rèn)值
parse_commandline(argc, argv); //根據(jù)傳入?yún)?shù)執(zhí)行操作(如果參數(shù)有-x則會(huì)設(shè)置restart_orig_pid為已運(yùn)行的wifidog的pid)
/* Initialize the config */
config_read(config->configfile); //根據(jù)配置文件設(shè)置全局變量config結(jié)構(gòu)體
config_validate(); //判斷GatewayInterface和AuthServer是否為空俗他,空則無效退出程序。
/* Initializes the linked list of connected clients */
client_list_init(); //將已連接客戶端鏈表置空阔逼。
/* Init the signals to catch chld/quit/etc */
init_signals(); //初始化一些信號(hào)
if (restart_orig_pid) { //用于restart,如果有已運(yùn)行的wifidog地沮,先會(huì)kill它
/*
* We were restarted and our parent is waiting for us to talk to it over the socket
*/
get_clients_from_parent(); //從已運(yùn)行的wifidog中獲取客戶端列表嗜浮,詳見 代碼片段1.2
/*
* At this point the parent will start destroying itself and the firewall. Let it finish it's job before we continue
*/
while (kill(restart_orig_pid, 0) != -1) { //kill已運(yùn)行的wifidog
debug(LOG_INFO, "Waiting for parent PID %d to die before continuing loading", restart_orig_pid);
sleep(1);
}
debug(LOG_INFO, "Parent PID %d seems to be dead. Continuing loading.");
}
if (config->daemon) { //創(chuàng)建為守護(hù)進(jìn)程羡亩,config->daemon默認(rèn)值為-1
debug(LOG_INFO, "Forking into background");
switch(safe_fork()) {
case 0: /* child */
setsid(); //創(chuàng)建新會(huì)話,脫離此終端危融,實(shí)現(xiàn)守護(hù)進(jìn)程
append_x_restartargv();
main_loop(); //進(jìn)入主循環(huán)(核心代碼在此)畏铆。
break;
default: /* parent */
exit(0);
break;
}
}
else {
append_x_restartargv();
main_loop();
}
return(0); /* never reached */
}
代碼片段1.2(獲取已啟動(dòng)的wifidog的客戶端列表):
此段代表描述了新啟動(dòng)的wifidog如何從已啟動(dòng)的wifidog程序中獲取已連接的客戶端列表。發(fā)送端見 代碼片段1.3
代碼片段1.2:
......本站只呈現(xiàn)部分內(nèi)容吉殃,查看完整文章請到WiFiDog官網(wǎng)社區(qū) http://www.wifidog.pro/2015/04/02/wifidog%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E5%88%9D%E5%A7%8B%E5%8C%96.html辞居,轉(zhuǎn)載請注明出處