Here's an attempt to remove sed from netstart. Since we use sed in a
simple string replacement without any fancy regex stuff I think we can
relatively easy use something based on shell built-ins.

Risk of the current code is that if someone places search inside
replacement we get an infinite loop, but since both search and
replacement are under our control I don't think it's worth making the
code larger than needed.

Only lightly tested

thoughts?

martijn@

Index: netstart
===================================================================
RCS file: /cvs/src/etc/netstart,v
retrieving revision 1.229
diff -u -p -r1.229 netstart
--- netstart    5 Nov 2022 12:06:05 -0000       1.229
+++ netstart    23 Nov 2022 09:12:28 -0000
@@ -35,6 +35,18 @@ stripcom() {
        done <$_file
 }
 
+# Usage: gsub search replace line
+gsub() {
+       local _s="$1" _r="$2" _l
+       shift 2
+       _l="$@"
+
+       while [[ "$_l" == *$_s* ]]; do
+               _l="${_l%%$_s*}$_r${_l#*$_s}"
+       done
+       print -n -- "$_l"
+}
+
 # Parse and "unpack" a hostname.if(5) line given as positional parameters.
 # Fill the _cmds array with the resulting interface configuration commands.
 parse_hn_line() {
@@ -82,7 +94,7 @@ parse_hn_line() {
        dhcp)   _cmds[${#_cmds[*]}]="ifconfig $_if inet autoconf"
                V4_AUTOCONF=true
                ;;
-       '!'*)   _cmd=$(print -- "${_c[@]}" | sed 's/\$if/'$_if'/g')
+       '!'*)   _cmd=$(gsub '$if' $_if "${_c[*]}")
                _cmds[${#_cmds[*]}]="${_cmd#!}"
                ;;
        *)      _cmds[${#_cmds[*]}]="ifconfig $_if ${_c[@]}"

Reply via email to