|
本帖最后由 zeng362424 于 2016-10-14 15:17 编辑
在openwrt的开发中,经常需要修改源码,比如修改wifidog源码使其支持url白名单,添加新的硬件平台等...
openwrt编译的时候,第一次是把源码下载下来,然后打包到dl目录下,以后编译都是直接解压dl下的源码压缩包。
以前都是修改好源码,然后手动压缩以后放到dl目录下,这样效率太低也太容易出错了。其实做一个patch就可以轻松搞定。
这里以修改wifidog源码是其支持URL白名单为例子来讲解怎么做patch。
第一、添加需要的源码
make menuconfig 将需要的功能先选上,然后make package/wifidog/compile V=99 将下载源码并解压到build_dir目录下
第二、备份源码(将需要修改的文件先备份一下,如果不知道要修改哪些文件可以先把整个源码备份一下)这里备份的源码是build_dir/target-*/wifidog下的
比如我要修改 fw_iptables.c 文件,先备份一下
- cp fw_iptables.c fw_iptables.c.backup
复制代码 第三、修改源码
修改build_dir/target-*/fw_iptables.c中的函数iptables_compile (注意选对平台)
- if (rule->mask != NULL) {
- char *mask=rule->mask;
- int mask_len=strlen(mask);
- int is_domain=0,
- i=0;
- for(;i<mask_len;i++){
- if((mask[i]>=46&&mask[i]<=57)||mask[i]==32){
- continue;
- }else{
- is_domain=1;
- break;
- }
- }
- char * ip =NULL;
- if(is_domain){
- struct in_addr * h_addr =wd_gethostbyname(mask);
- if(h_addr){
- ip= safe_strdup(inet_ntoa(*h_addr));
- free(h_addr);
- }
- if(ip){
- mask=ip;
- }else{
- debug(LOG_ERR, "doamin %s not find ip try again!",mask);
- mask="0.0.0.0";
- }
- }
- snprintf((command + strlen(command)), (sizeof(command) -
- strlen(command)), "-d %s ", mask);
- if(ip){
- free(ip);
- }
- }
复制代码
第四、确认修改的源码能通过编译
到根目录下去编译wifidog
- make package/wifidog/compile V=99
复制代码 第五、生成patch1、到修改源码的目录下生成临时patch
- diff -urN fw_iptables.c.backup fw_iptables.c > 1.patch
复制代码 2、修改patch头
这里就修改patch头可以,注意路径问题,
路径可以参考其他包的patch,看看其他包的patch默认路劲,
这里默认路径是target目录下面的两层
chaos_calmer\build_dir\target-i386_i486_uClibc-0.9.33.2\wifidog-normal\wifidog-1.2.1
所以这里只要指定src/fw_iptables.c就可以
- --- a/src/fw_iptables.c
- +++ b/src/fw_iptables.c
- @@ -165,6 +165,7 @@
- }
-
- snprintf(command, sizeof(command), "-t %s -A %s ", table, chain);
- + /*
- if (rule->mask != NULL) {
- if (rule->mask_is_ipset) {
- snprintf((command + strlen(command)), (sizeof(command) -
- @@ -172,7 +173,41 @@
- } else {
- snprintf((command + strlen(command)), (sizeof(command) - strlen(command)), "-d %s ", rule->mask);
- }
- + }*/
- + if (rule->mask != NULL) {
- + char *mask=rule->mask;
- + int mask_len=strlen(mask);
- + int is_domain=0,
- + i=0;
- + for(;i<mask_len;i++){
- + if((mask[i]>=46&&mask[i]<=57)||mask[i]==32){
- + continue;
- + }else{
- + is_domain=1;
- + break;
- + }
- + }
- + char * ip =NULL;
- + if(is_domain){
- + struct in_addr * h_addr =wd_gethostbyname(mask);
- + if(h_addr){
- + ip= safe_strdup(inet_ntoa(*h_addr));
- + free(h_addr);
- + }
- + if(ip){
- + mask=ip;
- + }else{
- + debug(LOG_ERR, "doamin %s not find ip try again!",mask);
- + mask="0.0.0.0";
- + }
- + }
- + snprintf((command + strlen(command)), (sizeof(command) -
- + strlen(command)), "-d %s ", mask);
- + if(ip){
- + free(ip);
- + }
- }
- +
- if (rule->protocol != NULL) {
- snprintf((command + strlen(command)), (sizeof(command) - strlen(command)), "-p %s ", rule->protocol);
- }
复制代码 3、正确命名patch
找到package目录下wifidog目录
- chaos_calmer\package\feeds\packages\wifidog
复制代码 在wifidog目录下找到patches文件夹,如果没有自己创建
看看patches目录下的patch名称,第一个数字是表示patch的顺序
这里没有任何atch可以将patch命名为001-modify-url.patch
4、使能patch
到根目录下clean以后compile就ok了
- make package/wifidog/clean V=99
- make package/wifidog/compile V=99
复制代码
补充:
1、如果是修改kernel源码的话
make target/linux/clean V=99
make target/linux/compile V=99
2、禁用patch
直接将patch的名字修改一下就可以禁用patch了
001-modify-url.patch 改为 .001-modify-url.patch
请不要胡乱输入以及粘贴、复制等方式灌水
请尊重作者、并共同维护网站的正常阅读,否则账户将会被限制发帖、回帖,并且积分可能会被清零,站内短信以及阅读权限等都会受到影响,谢谢。
具体限制方式:https://www.right.com.cn/forum/thread-8307840-1-1.html
|
评分
-
查看全部评分
|