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[@]}"