]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
parse-util: introduce parse_dev() helper
authorFranck Bui <fbui@suse.com>
Wed, 26 Apr 2017 16:18:03 +0000 (18:18 +0200)
committerFranck Bui <fbui@suse.com>
Tue, 6 Jun 2017 20:42:35 +0000 (22:42 +0200)
src/basic/parse-util.c
src/basic/parse-util.h
src/test/test-parse-util.c

index d86700736d7e7b8cbbd5e83f700037886106061d..4532f222c8ab0bb09790ea5176815e19233b0049 100644 (file)
@@ -589,3 +589,18 @@ int parse_ip_port(const char *s, uint16_t *ret) {
 
         return 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 4d132f0de5a265429f631a6eae366d1b731159d1..dc09782ca8997618e04ecafbf4d5576b551cee61 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 d08014100b6dc847846f418fbc0eb8ae1c5591b1..099c8e88f58f6d2d24dd9703469baf6cfd61d3db 100644 (file)
@@ -526,6 +526,19 @@ static void test_parse_nice(void) {
         assert_se(parse_nice("+20", &n) == -ERANGE);
 }
 
+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();
@@ -542,6 +555,7 @@ int main(int argc, char *argv[]) {
         test_parse_percent();
         test_parse_percent_unbounded();
         test_parse_nice();
+        test_parse_dev();
 
         return 0;
 }