Some issues in examples/udhcp/simple.script

Denys Vlasenko vda.linux at googlemail.com
Thu Sep 5 12:57:15 UTC 2019


On Wed, Aug 14, 2019 at 9:50 AM Rolf Eike Beer <eb at emlix.com> wrote:
> Hi all,
>
> I have discovered some problems with examples/udhcp/simple.script. I know,
> it's an example, and a simplified one. Most people will still just use it
> because it works, so I would like to point out at least some things.
>
> First, it does not really use ip. At least not if "command" does not exist.

"command" is a mandatory shell builtin.

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/command.html

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
section "Command Search and Execution" specifically mentions it.

The reason for this mention is that its function
can not reasonably be implemented as a separate external tool,
since external tools don't know what functions are defined
in current shell's invocation, thus "command FUNCNAME"
won't work.

Since it's an internal builtin, using it should be a fastest way to test
whether "ip" can be executed, without assuming a path
("test -x /usr/bin/ip") or forking a possibly external tool
("which ip").

Which shell do you use so that you don't have "command"?

> Fair enough, I know I have ip, so I just deleted the checks and the ifconfig
> lines.
>
> This makes it do nothing. As I found out the culprit is this:
>
>                 if command -v ip >/dev/null; then
>                         ip addr flush dev $interface
>                 else
>                         ifconfig $interface 0.0.0.0
>                 fi
>
> The difference between both cases is: ifconfig brings up the interface, ip
> with this command does not. So if you are using ip this will just send DHCP
> request to a network interface that has link down, which will not get you
> anywhere.

Yes, this is different. How about:

                echo "Clearing IP addresses on $interface, upping it"
                if command -v ip >/dev/null; then
                        ip addr flush dev $interface
                        ip link set dev $interface up
                else
                        ifconfig $interface 0.0.0.0
                fi


More information about the busybox mailing list