chiark / gitweb /
parse-util: introduce parse_dev() helper
authorFranck Bui <fbui@suse.com>
Wed, 26 Apr 2017 16:18:03 +0000 (18:18 +0200)
committerSven Eden <yamakuzure@gmx.net>
Tue, 25 Jul 2017 07:46:52 +0000 (09:46 +0200)
src/basic/parse-util.c
src/basic/parse-util.h
src/test/test-parse-util.c

index c38e14d96a367e5329b6dda480ea4e50e7377bcf..01135596244836f690e31945e1a6e77761cc7734 100644 (file)
@@ -595,3 +595,18 @@ int parse_ip_port(const char *s, uint16_t *ret) {
         return 0;
 }
 #endif // 0
+
+int parse_dev(const char *s, dev_t *ret) {
+        unsigned x, y;
+        dev_t d;
+
+        if (sscanf(s, "%u:%u", &x, &y) != 2)
+                return -EINVAL;
+
+        d = makedev(x, y);
+        if ((unsigned) major(d) != x || (unsigned) minor(d) != y)
+                return -EINVAL;
+
+        *ret = d;
+        return 0;
+}
index 3555aa1eaa23dda82b3ec22ec8a812c879754caa..ecbf4bdadc51234a3f5182f705e666c6fda621a1 100644 (file)
@@ -30,6 +30,7 @@
 #define MODE_INVALID ((mode_t) -1)
 
 int parse_boolean(const char *v) _pure_;
+int parse_dev(const char *s, dev_t *ret);
 int parse_pid(const char *s, pid_t* ret_pid);
 int parse_mode(const char *s, mode_t *ret);
 int parse_ifindex(const char *s, int *ret);
index 981370ab9563d148eee04da5a523c8b4507a8273..83f16da27dde109712439effb3422bcfd5953a0d 100644 (file)
@@ -530,6 +530,19 @@ static void test_parse_nice(void) {
 }
 #endif // 0
 
+static void test_parse_dev(void) {
+        dev_t dev;
+
+        assert_se(parse_dev("0", &dev) == -EINVAL);
+        assert_se(parse_dev("5", &dev) == -EINVAL);
+        assert_se(parse_dev("5:", &dev) == -EINVAL);
+        assert_se(parse_dev(":5", &dev) == -EINVAL);
+#if SIZEOF_DEV_T < 8
+        assert_se(parse_dev("4294967295:4294967295", &dev) == -EINVAL);
+#endif
+        assert_se(parse_dev("8:11", &dev) >= 0 && major(dev) == 8 && minor(dev) == 11);
+}
+
 int main(int argc, char *argv[]) {
         log_parse_environment();
         log_open();
@@ -550,6 +563,7 @@ int main(int argc, char *argv[]) {
 #if 0 /// UNNEEDED by elogind
         test_parse_nice();
 #endif // 0
+        test_parse_dev();
 
         return 0;
 }