]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared/device-nodes: add devnode_same
authorMike Yuan <me@yhndnzj.com>
Mon, 10 Jul 2023 12:58:57 +0000 (20:58 +0800)
committerMike Yuan <me@yhndnzj.com>
Tue, 11 Jul 2023 10:01:49 +0000 (18:01 +0800)
src/shared/device-nodes.c
src/shared/device-nodes.h

index bdbbb98c2c82e4ce406bceb9cbf2ad610e9d93d8..d08c40fe2ca1bd7e8feac275ac7fe6f8be240178 100644 (file)
@@ -3,8 +3,10 @@
 #include <errno.h>
 #include <stdio.h>
 #include <string.h>
+#include <sys/stat.h>
 
 #include "device-nodes.h"
+#include "path-util.h"
 #include "string-util.h"
 #include "utf8.h"
 
@@ -58,3 +60,28 @@ int encode_devnode_name(const char *str, char *str_enc, size_t len) {
         str_enc[j] = '\0';
         return 0;
 }
+
+int devnode_same(const char *a, const char *b) {
+        struct stat sa, sb;
+
+        assert(a);
+        assert(b);
+
+        if (!valid_device_node_path(a) || !valid_device_node_path(b))
+                return -EINVAL;
+
+        if (stat(a, &sa) < 0)
+                return -errno;
+        if (stat(b, &sb) < 0)
+                return -errno;
+
+        if (!S_ISBLK(sa.st_mode) && !S_ISCHR(sa.st_mode))
+                return -ENODEV;
+        if (!S_ISBLK(sb.st_mode) && !S_ISCHR(sb.st_mode))
+                return -ENODEV;
+
+        if (((sa.st_mode ^ sb.st_mode) & S_IFMT) != 0) /* both inode same device node type? */
+                return false;
+
+        return sa.st_rdev == sb.st_rdev;
+}
index a8b256431495702f59923a89d500957d988d241e..8b17a8e1904bd9859515ee04d713f29f9444c163 100644 (file)
@@ -5,3 +5,5 @@
 
 int encode_devnode_name(const char *str, char *str_enc, size_t len);
 int allow_listed_char_for_devnode(char c, const char *additional);
+
+int devnode_same(const char *a, const char *b);