分析Padavan源码三,添加迅雷演示

前面说到httpd的几个重要流程,update_variables(); asus_nvram_commit(); notify_services();这就是更改设置后的几个操做:一、更新参数集;二、更新nvram;三、通知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组里面,就这样。 enjoy it youself !
相关文章
相关标签/搜索