修改pppd拨号软件的DNS保存路劲
目的
在arm板中,pppd拨号软件获取的DNS会保存到/etc/resolv.conf,这会覆盖网口和wifi的DNS配置,从而使他们不能正常访问域名,所以要修改pppd拨号软件的源码,改不DNS写入的路劲或者写入方式改为追加,这里使用的是修改保存路劲,因为网口和wifi上网同样会覆盖4G上网的DNS配置,所以单独弄个文件/etc/4G_DNS.conf保存,然后写个程序检查/etc/resolv.conf,对比/etc/4G_DNS.conf和/etc/resolv.conf的内容,/etc/resolv.conf没有/etc/4G_DNS.conf的DNS就把/etc/4G_DNS.conf追加到/etc/resolv.conf。
这里以荣品电子的T507开发板为例
一.从源码中找到pppd源码,修改DNS写入路劲
find命令查找
root@ubuntu:/home/mywork/system# find ./ -name "pppd*"
在./out/t507/demo2.0/longan/buildroot/build/pppd-2.4.7目录
进到源码查找/etc/resolv.conf
# grep "/etc/resolv.conf" ./ -R
修改这个文件./pppd/pathnames.h
修改改为,把原来的注释,重新添加需要保存的路劲
二.修改写入方式
如果需要改写入方式则修改pppd/ipcp.c文件即可,修改这个文件的这个位置即可,我的实际应用中并没有追加写入,追加显示可能会导致/etc/resolv.conf有多个DNS,这样解析域名速速度可能会变慢,这里只做介绍
static void
create_resolv(peerdns1, peerdns2)
u_int32_t peerdns1, peerdns2;
{
FILE *f;
notice("nameserver============================%s",_PATH_RESOLV);
f = fopen(_PATH_RESOLV, "w");
if (f == NULL) {
error("Failed to create %s: %m", _PATH_RESOLV);
return;
}
if (peerdns1)
fprintf(f, "nameserver %s\n", ip_ntoa(peerdns1));
if (peerdns2)
fprintf(f, "nameserver %s\n", ip_ntoa(peerdns2));
if (ferror(f))
error("Write failed to %s: %m", _PATH_RESOLV);
fclose(f);
}
只需要把文件打开方式改一下就是,如果文件以只写方式打开会被情况,如果是读写的方式打开就不会被清空了,修改为覆盖写入/etc/4G_DNS.conf,追加写入 /etc/resolv.conf
修改之后_PATH_RESOLV等于/etc/4G_DNS.conf
static void
create_resolv(peerdns1, peerdns2)
u_int32_t peerdns1, peerdns2;
{
FILE *f;
FILE *f2;
notice("nameserver============================%s",_PATH_RESOLV);
f = fopen(_PATH_RESOLV, "w");
if (f == NULL) {
error("Failed to create %s: %m", _PATH_RESOLV);
return;
}
if (peerdns1)
fprintf(f, "nameserver %s\n", ip_ntoa(peerdns1));
if (peerdns2)
fprintf(f, "nameserver %s\n", ip_ntoa(peerdns2));
if (ferror(f))
error("Write failed to %s: %m", _PATH_RESOLV);
fclose(f);
//=======================================================
f2 = fopen("/etc/resolv.conf", "rt+");
if (f2 == NULL) {
error("Failed to create %s: %m","/etc/resolv.conf");
return;
}
if (peerdns1)
fprintf(f2, "nameserver %s\n", ip_ntoa(peerdns1));
if (peerdns2)
fprintf(f2, "nameserver %s\n", ip_ntoa(peerdns2));
if (ferror(f2))
error("Write failed to %s: %m","/etc/resolv.conf");
fclose(f2);
}
三.编译
需要回到下面的这个路劲执行make pppd-rebuild
root@ubuntu:/home/mywork/system/bak507/out/t507/demo2.0/longan/buildroot# make pppd-rebuild
对应的清空命令是make pppd-dirclean
清空会把整个文件夹删除掉
四.最后的补充,最好的解决方案
因为通过测试发现,4G的DNS虽然写到的/etc/4G_DNS.conf,后面再写到/etc/resolv.conf,但是T507的dhcp服务会把wifi和网口的DNS覆盖到/etc/resolv.conf,导致4G的DNS无法正常使用,最后通过创建/etc/resolv.conf.tail文件,把4G的DNS写到这个文件,这样T507的DHCP服务在写/etc/resolv.conf的时候会把/etc/resolv.conf.tail文件的内容追加到/etc/resolv.conf文件,完美的解决的各个网卡间DNS文件覆盖的问题