From: Roy Marples Date: Thu, 12 Sep 2013 16:46:41 +0000 (+0000) Subject: Support older udev versions where we need to rely on udev-settle. X-Git-Tag: v6.1.0~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a68c2460365c0ccd2eda838c4cca62b99e006776;p=thirdparty%2Fdhcpcd.git Support older udev versions where we need to rely on udev-settle. --- diff --git a/configure b/configure index 40ce65c6..37090bb1 100755 --- a/configure +++ b/configure @@ -617,9 +617,8 @@ if [ "$DEV" != no -a "$UDEV" != no -a -n "$LIBUDEV_LIBS" ]; then fi echo "LIBUDEV_LIBS= $LIBUDEV_LIBS" >>$CONFIG_MK - printf "Checking udev_monitor_filter_add_match_subsystem_devtype ..." + printf "Checking udev_monitor_filter_add_match_subsystem_devtype ... " cat <_udev.c -#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE #include #include int main(void) { @@ -629,10 +628,10 @@ int main(void) { EOF if $XCC $LIBUDEV_CFLAGS _udev.c -o _udev $LIBUDEV_LIBS 2>/dev/null then - echo "LIBUDEV_CPPFLAGS+= -DLIBUDEV_FILTER" >>$CONFIG_MK - echo " yes" + echo "yes" else - echo " no" + echo "LIBUDEV_CPPFLAGS+= -DLIBUDEV_NOFILTER" >>$CONFIG_MK + echo "no" fi rm -f _udev.c _udev elif [ "$DEV" != no -a "$UDEV" != no ]; then diff --git a/dev.c b/dev.c index e181dbb2..c9e7346b 100644 --- a/dev.c +++ b/dev.c @@ -38,12 +38,12 @@ static struct dev *dev; static void *handle; int -dev_settled(const char *ifname) +dev_initialized(const char *ifname) { if (dev == NULL) return 1; - return dev->settled(ifname); + return dev->initialized(ifname); } int diff --git a/dev.h b/dev.h index f56209d4..0db2fcfa 100644 --- a/dev.h +++ b/dev.h @@ -30,7 +30,7 @@ // dev plugin setup struct dev { const char *name; - int (*settled)(const char *); + int (*initialized)(const char *); int (*listening)(void); int (*start)(void); void (*stop)(void); @@ -39,12 +39,12 @@ int dev_init(struct dev *); // hooks for dhcpcd #ifdef PLUGIN_DEV -int dev_settled(const char *); +int dev_initialized(const char *); int dev_listening(void); int dev_start(const char *); void dev_stop(void); #else -#define dev_settled(a) 1 +#define dev_initialized(a) 1 #define dev_listening() 0 #define dev_start(a) #define dev_stop() diff --git a/dev/udev.c b/dev/udev.c index 4376b9fc..24193bc1 100644 --- a/dev/udev.c +++ b/dev/udev.c @@ -24,7 +24,15 @@ * SUCH DAMAGE. */ -#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE +#ifdef LIBUDEV_NOFILTER +# define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE +# warning This version of udev is too old does not support +# warning monitor filtering or per device initialization +# warning checks. +# warning As such, dhcpcd will need to depend on the +# warning udev-settle service or similar if starting +# warning in master mode. +#endif #include #include @@ -41,14 +49,18 @@ static struct udev_monitor *monitor; static int monitor_fd = -1; static int -udev_settled(const char *ifname) +udev_initialized(const char *ifname) { struct udev_device *device; int r; device = udev_device_new_from_subsystem_sysname(udev, "net", ifname); if (device) { +#ifndef LIBUDEV_NOFILTER r = udev_device_get_is_initialized(device); +#else + r = 1; +#endif udev_device_unref(device); } else r = 0; @@ -130,7 +142,7 @@ udev_start(void) syslog(LOG_ERR, "udev_monitor_new_from_netlink: %m"); goto bad; } -#ifdef LIBUDEV_FILTER +#ifndef LIBUDEV_NOFILTER if (udev_monitor_filter_add_match_subsystem_devtype(monitor, "net", NULL) != 0) { @@ -165,7 +177,7 @@ dev_init(struct dev *dev) { dev->name = udev_name; - dev->settled = udev_settled; + dev->initialized = udev_initialized; dev->listening = udev_listening; dev->start = udev_start; dev->stop = udev_stop; diff --git a/net.c b/net.c index c3191f5c..2b7e6120 100644 --- a/net.c +++ b/net.c @@ -269,7 +269,7 @@ discover_interfaces(int argc, char * const *argv) } /* Ensure that the interface name has settled */ - if (!dev_settled(ifa->ifa_name)) + if (!dev_initialized(ifa->ifa_name)) continue; /* It's possible for an interface to have >1 AF_LINK.