找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 13779|回复: 6

openwrt 如何修改源码 给源码打patch

[复制链接]
发表于 2016-10-14 15:17 | 显示全部楼层 |阅读模式
本帖最后由 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 文件,先备份一下
  1. cp fw_iptables.c fw_iptables.c.backup
复制代码
第三、修改源码
修改build_dir/target-*/fw_iptables.c中的函数iptables_compile (注意选对平台)
  1. if (rule->mask != NULL) {
  2.         char *mask=rule->mask;
  3.         int mask_len=strlen(mask);
  4.         int is_domain=0,
  5.             i=0;
  6.         for(;i<mask_len;i++){
  7.             if((mask[i]>=46&&mask[i]<=57)||mask[i]==32){
  8.                 continue;
  9.             }else{
  10.                 is_domain=1;
  11.                 break;
  12.             }
  13.         }
  14.         char * ip =NULL;
  15.         if(is_domain){
  16.             struct in_addr * h_addr =wd_gethostbyname(mask);
  17.             if(h_addr){
  18.                 ip= safe_strdup(inet_ntoa(*h_addr));
  19.                 free(h_addr);
  20.             }
  21.             if(ip){
  22.                 mask=ip;
  23.             }else{
  24.                 debug(LOG_ERR, "doamin %s not find ip try again!",mask);
  25.                 mask="0.0.0.0";
  26.             }
  27.         }
  28.         snprintf((command + strlen(command)), (sizeof(command) -
  29.                     strlen(command)), "-d %s ", mask);
  30.         if(ip){
  31.             free(ip);
  32.         }
  33.     }
复制代码

第四、确认修改的源码能通过编译
到根目录下去编译wifidog
  1. make package/wifidog/compile V=99
复制代码
第五、生成patch1、到修改源码的目录下生成临时patch
  1. 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就可以
  1. --- a/src/fw_iptables.c
  2. +++ b/src/fw_iptables.c
  3. @@ -165,6 +165,7 @@
  4.      }

  5.      snprintf(command, sizeof(command), "-t %s -A %s ", table, chain);
  6. +        /*
  7.      if (rule->mask != NULL) {
  8.          if (rule->mask_is_ipset) {
  9.              snprintf((command + strlen(command)), (sizeof(command) -
  10. @@ -172,7 +173,41 @@
  11.          } else {
  12.              snprintf((command + strlen(command)), (sizeof(command) - strlen(command)), "-d %s ", rule->mask);
  13.          }
  14. +    }*/
  15. +    if (rule->mask != NULL) {
  16. +        char *mask=rule->mask;
  17. +        int mask_len=strlen(mask);
  18. +        int is_domain=0,
  19. +            i=0;
  20. +        for(;i<mask_len;i++){
  21. +            if((mask[i]>=46&&mask[i]<=57)||mask[i]==32){
  22. +                continue;
  23. +            }else{
  24. +                is_domain=1;
  25. +                break;
  26. +            }
  27. +        }
  28. +        char * ip =NULL;
  29. +        if(is_domain){
  30. +            struct in_addr * h_addr =wd_gethostbyname(mask);
  31. +            if(h_addr){
  32. +                ip= safe_strdup(inet_ntoa(*h_addr));
  33. +                free(h_addr);
  34. +            }
  35. +            if(ip){
  36. +                mask=ip;
  37. +            }else{
  38. +                debug(LOG_ERR, "doamin %s not find ip try again!",mask);
  39. +                mask="0.0.0.0";
  40. +            }
  41. +        }
  42. +        snprintf((command + strlen(command)), (sizeof(command) -
  43. +                    strlen(command)), "-d %s ", mask);
  44. +        if(ip){
  45. +            free(ip);
  46. +        }
  47.      }
  48. +   
  49.      if (rule->protocol != NULL) {
  50.          snprintf((command + strlen(command)), (sizeof(command) - strlen(command)), "-p %s ", rule->protocol);
  51.      }
复制代码
3、正确命名patch
找到package目录下wifidog目录
  1. chaos_calmer\package\feeds\packages\wifidog
复制代码
在wifidog目录下找到patches文件夹,如果没有自己创建
看看patches目录下的patch名称,第一个数字是表示patch的顺序
这里没有任何atch可以将patch命名为001-modify-url.patch

4、使能patch
到根目录下clean以后compile就ok了
  1. make package/wifidog/clean V=99
  2. 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




评分

参与人数 1恩山币 +1 收起 理由
netsnake + 1 城会玩

查看全部评分

只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
发表于 2016-10-14 17:36 来自手机 | 显示全部楼层
谢谢楼主分享.赞! 我的做法是在github上fork一份源码然后修改。makefile 里面把源修改成自己的 github地址
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2016-10-14 17:51 来自手机 | 显示全部楼层
不需要这么麻烦,直接使用quilt即可。详见官方wiki:
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2016-10-14 17:51 来自手机 | 显示全部楼层
https://wiki.openwrt.org/doc/devel/patches
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2016-12-14 17:34 | 显示全部楼层
谢谢分享,收藏了
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2017-4-5 10:41 | 显示全部楼层
# openwrt 如何修改源码 给源码打patch
思考了
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2019-8-20 12:29 来自手机 | 显示全部楼层
思考了,改天去试试
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-9-20 23:25

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

快速回复 返回顶部 返回列表