分析Padavan的代码三

前面说到httpd的几个重要流程,update_variables(); asus_nvram_commit(); notify_services();这就是更改设置后的几个操作:1、更新参数集;2、更新nvram;3、通知rc处理(里面主要是重启相应的程序)。


我们先来看一下主要的数据结构:


在httpd/commom.h里面定义了这些:
struct svcLink{
        const char *serviceId;       //参数组名,将各种参数分类,像General、Storage等
        struct variable *variables;  //定义在下面
};
struct variable{
        const char *name;            //参数名
        const char *longname;        //没有用,也不知道干嘛,都是空
        char **argv;                 //没有用,也不知道干嘛,都是NULL
        u64 event_mask;              //事件掩码,从实现函数里看,主要用于是否要重启,不用重启就定义为0
};
variable包含在svcLink里面,结构上像是一个二维数组。
所以要新增功能,先想想把参数加到哪个组,或是自己新建一个组。


还有一个结构,叫事件描述集:
struct evDesc{
        u64 event_mask;              //对应上面的事件掩码,和上面的结构相匹配
        u32 max_time;                //可能是重启需要时间吧
        const char* notify_cmd;             //对称通知名,在shared/notify_rc.h里面有定义
        u64 event_unmask;            //可能是有干扰的,需要重启或屏蔽,和上面对应。
};
event_mask,event_unmask这两个的定义类似#define EVM_RESTART_DHCPD (1ULL <<  1)#define EVM_RESTART_RADV (1ULL <<  2);
意思是,1扩展成无符号长整 unsige long long =ULL,向左位移,这样,不同的参数用OR可以提高速度,在CPU里,逻辑运算总是比加减快。
EVM_RESTART_DHCPD就是:0~0010,共64位,
EVM_RESTART_RADV就时: 0~0100,也是64位,
OR的结果是:           0~0110,
AND的结果是:          0~0000,
这里这样定义主要是提高速度的,不是重点。Padavan定义了u64(u_int64_t),用这种运算,可以处理64种不同的动作,已经用了0~42,62,63,还有19个可以加,对大家应该是够了。


把这些数据定义好后(当然别忘了在nvram项里面也要加入相应数据哦),上面的3个操作最后会用通知的办法通知到rc进行处理,下面就可以在rc里加入相应的处理代码就够了~(这部分在前两集有讲过,就此略过哦。)


大概流程就是这样,下面就实践操作,加入迅雷。


我们要先要就用命令行,能让迅雷打开,关闭,重启,改位置等等,达到你自已的目的,这都不能做到,就不要想别的事啦,先让你的程序能自由运转吧。这时你就知道了你的程序需要定义多少个参数,开启有哪些动作,关闭有哪些动作,哪些有冲突,要屏蔽或跟着重启。


说说迅雷远程,已经停止更新的,也不是开源,资料有限,现在能用的最新稳定版是1.0.31,下好与自已CPU体系结构对应的文件,里面有4个文件,vod_httpservice可以删除,不影响,删了CPU占用率也会下降。还剩3个,portal是启动/关闭入口,还有两个是真正做事的。portal可以打开程序,portal -s可以关闭程序。还要一堆运行库,运行后,会新建一个lib文件夹,把两个做事的放进去,新建一个配置文件夹。
根据迅雷的这个特点,我选择用脚本运行,先把迅雷打个包,启动时,解压到挂载的硬盘,再执行,不然固件的是只读的,运行出错。脚本运行的参数从nvram里面读取,所以rc里面,通知的处理也很简单,运行这个脚本就够了,我的是这样改的:在rc/services_stor.c里面
void restart_xunlei(void) {
        if (count_stor_mountpoint())
                eval("/usr/bin/xunlei.sh");
}
是不是有点太简单了,嗯,就是这样简单粗暴。


我的迅雷运行需要两个参数,一个是是否开启,一个是解压到哪里,定义成:xunlei_enable,xunlei_dir我额外加了个,激活码,方便拷贝,叫xunlei_sn,这三个在nvram的定义里有加上,
因为xunlei_sn不是自己设置的,就不用在参数集里加了,httpd/variable.c里面加上xunlei_enable,xunlei_dir这两个就行,因为也是存储相关的,所以我就加在Storage组了,
通知名我定义为:RCN_RESTART_XUNLEI,具体在shared/notify_rc.h里面,值是“restart_xunlei”。
我的迅雷启动或关闭与别人无关,事件描述集就可以这样定义:
{EVM_RESTART_XUNLEI,EVT_RESTART_XUNLEI,RCN_RESTART_XUNLEI,0},真正的值是:
{(1ULL << 43),3,"restart_xunlei",0}


然后在rc/rc.c里的void handle_notifications(void)函数里面,加上对restart_xunlei的通知处理:
else if (strcmp(entry->d_name, RCN_RESTART_XUNLEI) == 0){
        restart_xunlei();
}
这样就可以执行上面的操作啦:运行/usr/bin/xunlei.sh,嗯,就是这样,流程简单吧。。。。。






这改好的文件明天上传,因为上夜班不在家。。。。




全部过程的难点在网页前端,我分析了几天才搞清楚,很多项都在state.js里面,像菜单啥的,


自已建的网页表单里,下面这行要写成:
<input type="hidden" name="sid_list" value="Storage;">
因为我的参数集在Storage组里面,就这样。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值