25.11.2025 11:17, [email protected] пишет:
> I think we need to update unbound and spamlogd to add OPTIND=1 to local.

Why?

> After reading these in "man ksh":
> 
>    Functions
> 
>    Functions defined with the function reserved word are treated differently
>    in the following ways from functions defined with the () notation:
> 
>    o   OPTIND is saved/reset and restored on entry and exit from the
>        function so getopts can be used properly both inside and outside the
>        function (Bourne-style functions leave OPTIND untouched, so using
>        getopts inside a function interferes with using getopts outside the
>        function).
> 
>    getopts optstring name [arg ...]
> 
>        Option parsing can be reset by setting OPTIND to 1 (this is done
>        automatically whenever the shell or a shell procedure is invoked).
> 
>        Warning: Changing the value of the shell parameter OPTIND to a
>        value other than 1, or parsing different sets of arguments
>        without resetting OPTIND, may lead to unexpected results.
> 
> 
> I did some testing to see what OPTIND was set to when rc_pre is called.
> When I run "rcctl start unbound" then OPTIND is 1 when rc_pre starts.
> but if I run "rcctl -q start unbound" then OPTIND is 2 when rc_pre starts.

Is something not working correctly?

> Just appending OPTIND to local doesn't clear its' value (I still get 2)
> 
> Since everything uses bourne-style functions it is probably better
> to append OPTIND=1 to the local definitions line to reset it.

Your text does not explain the diff.

What does it fix?
What's the problem here?

> 
> 
> /etc/rc.d$ diff -u unbound unbound
> --- unbound     Sun Nov 16 13:27:50 2025     1.10
> +++ unbound     Mon Nov 24 22:21:24 2025
> @@ -8,7 +8,7 @@
>  . /etc/rc.d/rc.subr
>  
>  rc_pre() {
> -     local _anchor _config _opt
> +     local _anchor _config _opt OPTIND=1
>  
>       while getopts :c: _opt $daemon_flags; do
>               [[ $_opt == c ]] && _config=$OPTARG
> 
> /etc/rc.d$ diff -u spamlogd.orig spamlogd
> --- spamlogd     Sun Nov 16 13:29:02 2025     1.7
> +++ spamlogd     Mon Nov 24 22:21:37 2025
> @@ -9,7 +9,7 @@
>  rc_reload=NO
>  
>  rc_pre() {
> -     local _opt pflog=pflog0
> +     local _opt pflog=pflog0 OPTIND=1
>  
>       while getopts :l: _opt $daemon_flags; do
>               [[ $_opt == l ]] && pflog=$OPTARG
> 

Reply via email to