]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Support older udev versions where we need to rely on udev-settle.
authorRoy Marples <roy@marples.name>
Thu, 12 Sep 2013 16:46:41 +0000 (16:46 +0000)
committerRoy Marples <roy@marples.name>
Thu, 12 Sep 2013 16:46:41 +0000 (16:46 +0000)
configure
dev.c
dev.h
dev/udev.c
net.c

index 40ce65c6077e425d1c2106ccaa624a5d48ab9e74..37090bb178601670b5a1250e3819a4b7d058b6d6 100755 (executable)
--- 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 <<EOF >_udev.c
-#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE
 #include <libudev.h>
 #include <stdlib.h>
 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 e181dbb2482e8795ceb7b98c15affc6db3f12072..c9e7346be5af2f1d7097fad7d48bca05142c3888 100644 (file)
--- 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 f56209d44bb1d16d9bacb0eb36907bf7cc58e401..0db2fcfad578736c156461913f9c355dea92dfc5 100644 (file)
--- 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()
index 4376b9fc6b4c49117ccbe022f6c7dac5554ae189..24193bc12212128a41509226a74ba1c6ded3fef2 100644 (file)
  * 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 <libudev.h>
 #include <string.h>
@@ -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 c3191f5cb11097f179029eb5b5f469362b1f9c12..2b7e6120b46c114939c5e9561f9baaf65926c320 100644 (file)
--- 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.