chiark / gitweb /
udevadm: split out find_device helper
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 26 Nov 2014 00:39:19 +0000 (19:39 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 26 Nov 2014 02:16:47 +0000 (21:16 -0500)
The idea is to unify the way that devices can be specified.

Makefile.am
src/udev/udevadm-info.c
src/udev/udevadm-trigger.c
src/udev/udevadm-util.c [new file with mode: 0644]
src/udev/udevadm-util.h [new file with mode: 0644]

index 1674f61..b52ff8e 100644 (file)
@@ -3462,7 +3462,9 @@ udevadm_SOURCES = \
        src/udev/udevadm-settle.c \
        src/udev/udevadm-trigger.c \
        src/udev/udevadm-test.c \
-       src/udev/udevadm-test-builtin.c
+       src/udev/udevadm-test-builtin.c \
+       src/udev/udevadm-util.c \
+       src/udev/udevadm-util.h
 
 udevadm_LDADD = \
        libudev-core.la
index 22d0826..a56f159 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "udev.h"
 #include "udev-util.h"
+#include "udevadm-util.h"
 
 static bool skip_attribute(const char *name) {
         static const char* const skip[] = {
@@ -257,35 +258,6 @@ static void cleanup_db(struct udev *udev) {
         }
 }
 
-static struct udev_device *find_device(struct udev *udev, const char *id, const char *prefix) {
-        char name[UTIL_PATH_SIZE];
-
-        if (prefix && !startswith(id, prefix)) {
-                strscpyl(name, sizeof(name), prefix, id, NULL);
-                id = name;
-        }
-
-        if (startswith(id, "/dev/")) {
-                struct stat statbuf;
-                char type;
-
-                if (stat(id, &statbuf) < 0)
-                        return NULL;
-
-                if (S_ISBLK(statbuf.st_mode))
-                        type = 'b';
-                else if (S_ISCHR(statbuf.st_mode))
-                        type = 'c';
-                else
-                        return NULL;
-
-                return udev_device_new_from_devnum(udev, type, statbuf.st_rdev);
-        } else if (startswith(id, "/sys/"))
-                return udev_device_new_from_syspath(udev, id);
-        else
-                return NULL;
-}
-
 static int uinfo(struct udev *udev, int argc, char *argv[]) {
         _cleanup_udev_device_unref_ struct udev_device *device = NULL;
         bool root = 0;
index a52d1b5..49e2562 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "udev.h"
 #include "udev-util.h"
+#include "udevadm-util.h"
 #include "util.h"
 
 static int verbose;
@@ -174,25 +175,18 @@ static int adm_trigger(struct udev *udev, int argc, char *argv[]) {
                         udev_enumerate_add_match_sysname(udev_enumerate, optarg);
                         break;
                 case 'b': {
-                        char path[UTIL_PATH_SIZE];
-                        struct udev_device *dev;
-
-                        /* add sys dir if needed */
-                        if (!startswith(optarg, "/sys"))
-                                strscpyl(path, sizeof(path), "/sys", optarg, NULL);
-                        else
-                                strscpy(path, sizeof(path), optarg);
-                        util_remove_trailing_chars(path, '/');
-                        dev = udev_device_new_from_syspath(udev, path);
+                        _cleanup_udev_device_unref_ struct udev_device *dev;
+
+                        dev = find_device(udev, optarg, "/sys");
                         if (dev == NULL) {
                                 log_error("unable to open the device '%s'", optarg);
                                 return 2;
                         }
+
                         udev_enumerate_add_match_parent(udev_enumerate, dev);
-                        /* drop reference immediately, enumerate pins the device as long as needed */
-                        udev_device_unref(dev);
                         break;
                 }
+
                 case 'h':
                         help();
                         return 0;
diff --git a/src/udev/udevadm-util.c b/src/udev/udevadm-util.c
new file mode 100644 (file)
index 0000000..37e80c3
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2008-2009 Kay Sievers <kay@vrfy.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "udevadm-util.h"
+
+struct udev_device *find_device(struct udev *udev,
+                                const char *id,
+                                const char *prefix) {
+
+        assert(udev);
+        assert(id);
+
+        if (prefix && !startswith(id, prefix))
+                id = strappenda(prefix, id);
+
+        if (startswith(id, "/dev/")) {
+                struct stat statbuf;
+                char type;
+
+                if (stat(id, &statbuf) < 0)
+                        return NULL;
+
+                if (S_ISBLK(statbuf.st_mode))
+                        type = 'b';
+                else if (S_ISCHR(statbuf.st_mode))
+                        type = 'c';
+                else
+                        return NULL;
+
+                return udev_device_new_from_devnum(udev, type, statbuf.st_rdev);
+        } else if (startswith(id, "/sys/"))
+                return udev_device_new_from_syspath(udev, id);
+        else
+                return NULL;
+}
diff --git a/src/udev/udevadm-util.h b/src/udev/udevadm-util.h
new file mode 100644 (file)
index 0000000..dba651f
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2014 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "udev.h"
+
+struct udev_device *find_device(struct udev *udev,
+                                const char *id,
+                                const char *prefix);