This document is meant to convince you to not use ifup/ifdown.


The general problem with ifupdown is that it is "copulated in vertical
fashion" by design. It tries to do the job of shell script in C,
and this is invariably doomed to fail. You need ifup/ifdown
to be adaptable by local admins, and C is an extremely poor choice
for that.

We are doomed to have problems with ifup/ifdown. Just look as this code:

static const struct dhcp_client_t ext_dhcp_clients[] = {
       { "dhcpcd", "<up cmd>", "<down cmd>" },
       { "dhclient", ........ },
       { "pump", ........ },
       { "udhcpc", ........ },
};

static int dhcp_down(struct interface_defn_t *ifd, execfn *exec)
{
#if ENABLE_FEATURE_IFUPDOWN_EXTERNAL_DHCP
       int i ;
       for (i = 0; i < ARRAY_SIZE(ext_dhcp_clients); i++) {
               if (exists_execable(ext_dhcp_clients[i].name))
                       return execute(ext_dhcp_clients[i].stopcmd, ifd, exec);
       }
       bb_error_msg("no dhcp clients found, using static interface shutdown");
       return static_down(ifd, exec);
#elif ENABLE_UDHCPC
       return execute("kill "
                      "`cat /var/run/udhcpc.%iface%.pid` 2>/dev/null", ifd, exec);
#else
       return 0; /* no dhcp support */
#endif
}

How the hell it is supposed to work reliably this way? Just imagine that
admin is using pump and ifup/ifdown. It works. Then, for whatever reason,
admin installs dhclient, but does NOT use it. ifdown will STOP WORKING,
just because it will see installed dhclient binary in e.g. /usr/bin/dhclient!
This is stupid.

I seriously urge people to not use ifup/ifdown.
Use something less brain damaged.
