Brian Inglis wrote:
I've been running with /etc/resolv.conf for a few years now, generated from the ISP info from ipconfig and lists of public DNS servers and suffixes.

The attached postinstall script 0p_l_etc_resolv_conf.dash generates a new resolv.conf and replaces the current if different every update.
It is also run at cron startup and that covers system startup.

The AWK script collects names and addresses from ipconfig ouput and adds lists of public DNS servers and public suffixes in the proper order.

How this works with other ISPs or in other network environments is not anything I ever thought of testing externally.
Feel feel to try it and change it if curious or interested.

This is an interesting approach, thanks for sharing.

Unfortunately the ipconfig output is always localized, so this does only work OOTB with English versions of Windows. The ipconfig parsing is also broken due to two reasons:

- The current Cygwin versions of awk, grep and sed no longer convert CR/LF -> LF on stdin, so '/FooBar$/' patterns never match.

- ipconfig may output scoped IPv6 addresses ("fe80::1%12") which are not matched by the awk script.

A draft patch is attached. It also avoids the tmp file and uses shell builtins where possible.

--
Regards,
Christian

diff -ru cyg-resolv.orig/0p_l_etc_resolv_conf.dash 
cyg-resolv/0p_l_etc_resolv_conf.dash
--- cyg-resolv.orig/0p_l_etc_resolv_conf.dash   2022-08-09 13:52:07.293134900 
+0200
+++ cyg-resolv/0p_l_etc_resolv_conf.dash        2022-08-09 14:29:56.429564700 
+0200
@@ -9,14 +9,13 @@
 conf=$SYSCONFDIR/$r.conf
 
 /bin/mkdir -pv         -- $run/                && \
-ip=$(/usr/bin/which    -- ipconfig)            && \
-tmp=$(/bin/mktemp -t   -- .XXXXXXXX.)          && \
-$ip /all | $cr  > $tmp                         && \
-[ -s $tmp ]                                    && \
-[ -w $rrc ]    || : > $rrc
-if ! /usr/bin/cmp -s   -- $tmp $rrc; then
-    /bin/cp -fv                -- $tmp $rrc
+ip=$(command -v ipconfig)                      && \
+a=$(/bin/cat $rrc 2>/dev/null || :)            && \
+b=$("$ip" /all | /bin/tr -d '\r' | $cr)                && \
+[ "${b:+set}" = "set" ]                                && \
+[ -w $rrc ]    || a= : > $rrc
+if [ "$a" != "$b" ]; then
+    echo "$cr > $rrc"
+    echo "$b" > $rrc
     /bin/ln -frsTv     -- $rrc $conf
 fi
-
-/bin/rm -f             -- $tmp
diff -ru cyg-resolv.orig/cyg-resolv.awk cyg-resolv/cyg-resolv.awk
--- cyg-resolv.orig/cyg-resolv.awk      2022-08-09 13:52:07.293348300 +0200
+++ cyg-resolv/cyg-resolv.awk   2022-08-09 14:15:51.164139100 +0200
@@ -156,7 +156,7 @@
 # collect DNS server IP V4 addresses
 /DNS\sServers[^:]*:\s\S/       { dns = 1 }             # start - enable
 
-dns && $NF ~ /^([0-9A-Fa-f]{0,4}:){1,7}[0-9A-Fa-f]{0,4}$/ { next } # skip IP V6
+dns && $NF ~ /^([0-9A-Fa-f]{0,4}:){1,7}[0-9A-Fa-f]{0,4}(%.*)?$/ { next } # 
skip IP V6
 
 
 dns && $NF ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}$/   {               # collect IP V4
@@ -164,7 +164,7 @@
     last = ""
 }
 
-dns && $NF !~ /^([0-9A-Fa-f]{0,4}:){1,7}[0-9A-Fa-f]{0,4}$/ && \
+dns && $NF !~ /^([0-9A-Fa-f]{0,4}:){1,7}[0-9A-Fa-f]{0,4}(%.*)$/ && \
        $NF !~ /^([0-9]{1,3}\.){3}[0-9]{1,3}$/  { dns = 0 }     # non-IP disable
 
 
-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

Reply via email to