加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 交互 > 正文

wifidog源码分析 - 初始化阶段

发布时间:2016-10-31 00:31:30 所属栏目:交互 来源:站长网
导读:副标题#e# Wifidog是一个linux下开源的认证网关软件,它主要用于配合认证服务器实现无线路由器的认证放行功能。 wifidog是一个后台的服务程序,可以通过wdctrl命令对wifidog主程序进行控制。 本文解释wifidog在启动阶段所做的初始化主要工作( 代码片段1.1
副标题[/!--empirenews.page--]

    Wifidog是一个linux下开源的认证网关软件,它主要用于配合认证服务器实现无线路由器的认证放行功能。

wifidog是一个后台的服务程序,可以通过wdctrl命令对wifidog主程序进行控制。

本文解释wifidog在启动阶段所做的初始化主要工作(代码片段1.1

  • 初始化配置(先将配置结构体初始化为默认值,在读取配置文件修改配置结构体)
  • 初始化已连接客户端列表(如果是通过wdctrl重启wifidog,将会读取之前wifidog的已连接客户端列表 代码片段1.2 代码片段1.3
  • 如无特殊情况,分离进程,建立守护进程 (代码片段1.1
  • 添加多个http请求回调函数(包括404错误回调函数) (见之后章节)
  • 摧毁删除现有的iptables路由表规则 (见之后章节)
  • 建立新的iptables路由表规则 (见之后章节)
  • 启动多个功能线程 (见之后章节)
  • 循环等待客户端连接 (见之后章节)

代码片段1.1

点击(此处)折叠或打开

  1. int main(int argc, char **argv) {

  2.     s_config *config = config_get_config(); //就是返回全局变量config结构体的地址
  3.     config_init(); //初始化全局变量config结构体为默认值

  4.     parse_commandline(argc, argv); //根据传入参数执行操作(如果参数有-x则会设置restart_orig_pid为已运行的wifidog的pid)

  5.     /* Initialize the config */
  6.     config_read(config->configfile); //根据配置文件设置全局变量config结构体
  7.     config_validate(); //判断GatewayInterface和AuthServer是否为空,空则无效退出程序。

  8.     /* Initializes the linked list of connected clients */
  9.     client_list_init(); //将已连接客户端链表置空。

  10.     /* Init the signals to catch chld/quit/etc */
  11.     init_signals(); //初始化一些信号

  12.     if (restart_orig_pid) { //用于restart,如果有已运行的wifidog,先会kill它
  13.         /*
  14.          * We were restarted and our parent is waiting for us to talk to it over the socket
  15.          */
  16.         get_clients_from_parent(); //从已运行的wifidog中获取客户端列表,详见 代码片段1.2

  17.         /*
  18.          * At this point the parent will start destroying itself and the firewall. Let it finish it's job before we continue
  19.          */

  20.         while (kill(restart_orig_pid, 0) != -1) { //kill已运行的wifidog
  21.             debug(LOG_INFO, "Waiting for parent PID %d to die before continuing loading", restart_orig_pid);
  22.             sleep(1);
  23.         }

  24.         debug(LOG_INFO, "Parent PID %d seems to be dead. Continuing loading.");
  25.     }

  26.     if (config->daemon) { //创建为守护进程,config->daemon默认值为-1

  27.         debug(LOG_INFO, "Forking into background");

  28.         switch(safe_fork()) {
  29.             case 0: /* child */
  30.                 setsid(); //创建新会话,脱离此终端,实现守护进程
  31.                 append_x_restartargv();
  32.                 main_loop(); //进入主循环(核心代码在此)。
  33.                 break;

  34.             default: /* parent */
  35.                 exit(0);
  36.                 break;
  37.         }
  38.     }
  39.     else {
  40.         append_x_restartargv();
  41.         main_loop();
  42.     }

  43.     return(0); /* never reached */
  44. }

代码片段1.2(获取已启动的wifidog的客户端列表):

此段代表描述了新启动的wifidog如何从已启动的wifidog程序中获取已连接的客户端列表。发送端见 代码片段1.3


(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读