chiark / gitweb /
udevadm: trigger - add --sysname-match=
authorKay Sievers <kay.sievers@vrfy.org>
Wed, 22 Jul 2009 22:02:28 +0000 (00:02 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Wed, 22 Jul 2009 22:02:28 +0000 (00:02 +0200)
  $ udevadm trigger -n -v --subsystem-match=usb --sysname-match=2-1.1*
  /sys/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1.1
  /sys/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1.1/2-1.1.1
  /sys/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1.1/2-1.1.1/2-1.1.1:1.0
  /sys/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1.1/2-1.1.2
  /sys/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1.1/2-1.1.2/2-1.1.2:1.0
  /sys/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1.1/2-1.1.2/2-1.1.2:1.1
  /sys/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1.1/2-1.1:1.0

libudev/Makefile.am
libudev/exported_symbols
libudev/libudev-enumerate.c
libudev/libudev.h
udev/udevadm-trigger.c
udev/udevadm.xml

index 866a5ca13525ffa01fc3072af9a3af4d16741b6f..e83888617a7dfdf0f2e6a1cd6d971ebffb90b780 100644 (file)
@@ -28,9 +28,9 @@ libudev_la_SOURCES =\
        libudev-monitor.c \
        libudev-queue.c
 
-LT_CURRENT=4
-LT_REVISION=2
-LT_AGE=4
+LT_CURRENT=5
+LT_REVISION=0
+LT_AGE=5
 libudev_la_LDFLAGS = \
        -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
        -export-symbols $(top_srcdir)/libudev/exported_symbols
index 8e7749e488f391a438c402ea5d718c8d9520d641..018463dd91db0d7b06ba1d9057c0666fb3a883c9 100644 (file)
@@ -45,6 +45,7 @@ udev_enumerate_add_nomatch_subsystem
 udev_enumerate_add_match_sysattr
 udev_enumerate_add_nomatch_sysattr
 udev_enumerate_add_match_property
+udev_enumerate_add_match_sysname
 udev_enumerate_scan_devices
 udev_enumerate_scan_subsystems
 udev_enumerate_add_syspath
index db8c51404f652de53312f7a7a23bcb2391b4f3d4..96cf0609073dd283695338c76219d3aff61b3f4a 100644 (file)
@@ -49,6 +49,7 @@ struct udev_enumerate {
        struct udev_list_node sysattr_nomatch_list;
        struct udev_list_node subsystem_match_list;
        struct udev_list_node subsystem_nomatch_list;
+       struct udev_list_node sysname_match_list;
        struct udev_list_node properties_match_list;
        struct udev_list_node devices_list;
        struct syspath *devices;
@@ -76,6 +77,7 @@ struct udev_enumerate *udev_enumerate_new(struct udev *udev)
        udev_list_init(&udev_enumerate->sysattr_nomatch_list);
        udev_list_init(&udev_enumerate->subsystem_match_list);
        udev_list_init(&udev_enumerate->subsystem_nomatch_list);
+       udev_list_init(&udev_enumerate->sysname_match_list);
        udev_list_init(&udev_enumerate->properties_match_list);
        udev_list_init(&udev_enumerate->devices_list);
        return udev_enumerate;
@@ -117,6 +119,7 @@ void udev_enumerate_unref(struct udev_enumerate *udev_enumerate)
        udev_list_cleanup_entries(udev_enumerate->udev, &udev_enumerate->sysattr_nomatch_list);
        udev_list_cleanup_entries(udev_enumerate->udev, &udev_enumerate->subsystem_match_list);
        udev_list_cleanup_entries(udev_enumerate->udev, &udev_enumerate->subsystem_nomatch_list);
+       udev_list_cleanup_entries(udev_enumerate->udev, &udev_enumerate->sysname_match_list);
        udev_list_cleanup_entries(udev_enumerate->udev, &udev_enumerate->properties_match_list);
        udev_list_cleanup_entries(udev_enumerate->udev, &udev_enumerate->devices_list);
        for (i = 0; i < udev_enumerate->devices_cur; i++)
@@ -383,6 +386,25 @@ int udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, con
        return 0;
 }
 
+/**
+ * udev_enumerate_add_match_sysname:
+ * @udev_enumerate: context
+ * @sysname: filter for the name of the device to include in the list
+ *
+ * Returns: 0 on success, otherwise a negative error value.
+ */
+int udev_enumerate_add_match_sysname(struct udev_enumerate *udev_enumerate, const char *sysname)
+{
+       if (udev_enumerate == NULL)
+               return -EINVAL;
+       if (sysname == NULL)
+               return 0;
+       if (udev_list_entry_add(udev_enumerate_get_udev(udev_enumerate),
+                               &udev_enumerate->sysname_match_list, sysname, NULL, 1, 0) == NULL)
+               return -ENOMEM;
+       return 0;
+}
+
 static int match_sysattr(struct udev_enumerate *udev_enumerate, const char *syspath)
 {
        struct udev *udev = udev_enumerate_get_udev(udev_enumerate);
@@ -454,6 +476,21 @@ out:
        return match;
 }
 
+static int match_sysname(struct udev_enumerate *udev_enumerate, const char *sysname)
+{
+       struct udev_list_entry *list_entry;
+
+       if (udev_list_get_entry(&udev_enumerate->sysname_match_list) == NULL)
+               return 1;
+
+       udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_enumerate->sysname_match_list)) {
+               if (fnmatch(udev_list_entry_get_name(list_entry), sysname, 0) != 0)
+                       continue;
+               return 1;
+       }
+       return 0;
+}
+
 static int scan_dir_and_add_devices(struct udev_enumerate *udev_enumerate,
                                    const char *basedir, const char *subdir1, const char *subdir2)
 {
@@ -480,6 +517,9 @@ static int scan_dir_and_add_devices(struct udev_enumerate *udev_enumerate,
 
                if (dent->d_name[0] == '.')
                        continue;
+               if (!match_sysname(udev_enumerate, dent->d_name))
+                       continue;
+
                util_strscpyl(syspath, sizeof(syspath), path, "/", dent->d_name, NULL);
                if (lstat(syspath, &statbuf) != 0)
                        continue;
index 8b5391c066664c66802204ecceeed91460f71d42..4bcf442f51fd42925e4360acfe63a51d4c254e97 100644 (file)
@@ -131,6 +131,7 @@ int udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_enumerate,
 int udev_enumerate_add_match_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value);
 int udev_enumerate_add_nomatch_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value);
 int udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, const char *property, const char *value);
+int udev_enumerate_add_match_sysname(struct udev_enumerate *udev_enumerate, const char *sysname);
 int udev_enumerate_add_syspath(struct udev_enumerate *udev_enumerate, const char *syspath);
 /* run enumeration with active filters */
 int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate);
index 2e9fe6ba96cc79a5e5435c5dc0c5ab1948d400bb..db7d1e05718bfc12e3cfec11e19ab1aabc360564 100644 (file)
@@ -102,6 +102,7 @@ int udevadm_trigger(struct udev *udev, int argc, char *argv[])
                { "attr-match", required_argument, NULL, 'a' },
                { "attr-nomatch", required_argument, NULL, 'A' },
                { "property-match", required_argument, NULL, 'p' },
+               { "sysname-match", required_argument, NULL, 'y' },
                { "help", no_argument, NULL, 'h' },
                {}
        };
@@ -127,7 +128,7 @@ int udevadm_trigger(struct udev *udev, int argc, char *argv[])
                const char *val;
                char buf[UTIL_PATH_SIZE];
 
-               option = getopt_long(argc, argv, "vnFo:t:hcp:s:S:a:A:", options, NULL);
+               option = getopt_long(argc, argv, "vnFo:t:hcp:s:S:a:A:y:", options, NULL);
                if (option == -1)
                        break;
 
@@ -176,6 +177,9 @@ int udevadm_trigger(struct udev *udev, int argc, char *argv[])
                        key = keyval(optarg, &val, buf, sizeof(buf));
                        udev_enumerate_add_match_property(udev_enumerate, key, val);
                        break;
+               case 'y':
+                       udev_enumerate_add_match_sysname(udev_enumerate, optarg);
+                       break;
                case 'h':
                        printf("Usage: udevadm trigger OPTIONS\n"
                               "  --verbose                       print the list of devices while running\n"
@@ -191,6 +195,7 @@ int udevadm_trigger(struct udev *udev, int argc, char *argv[])
                               "  --attr-match=<file[=<value>]>   trigger devices with a matching attribute\n"
                               "  --attr-nomatch=<file[=<value>]> exclude devices with a matching attribute\n"
                               "  --property-match=<key>=<value>  trigger devices with a matching property\n"
+                              "  --sysname-match=<name>          trigger devices with a matching name\n"
                               "  --help\n\n");
                        goto exit;
                default:
index 64e6f2aeb979a8828c3327895362e7f37d70da06..e4151e0ed4e5f01813229edf9dfbf8a59aebc2ea 100644 (file)
                 specified multiple times and supports shell style pattern matching.</para>
               </listitem>
             </varlistentry>
+            <varlistentry>
+              <term><option>--sysname-match=<replaceable>name</replaceable></option></term>
+              <listitem>
+                <para>Trigger events for devices with a matching sys device name. This option can be
+                specified multiple times and supports shell style pattern matching.</para>
+              </listitem>
+            </varlistentry>
           </variablelist>
         </refsect2>