分析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 !
相關文章
相關標籤/搜索