]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
parse-util: introduce parse_ifindex() and make use of it everywhere
authorLennart Poettering <lennart@poettering.net>
Mon, 2 Nov 2015 22:57:21 +0000 (23:57 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 2 Nov 2015 23:02:00 +0000 (00:02 +0100)
We have enough places where we parse an ifindex, hence introduce a
proper parsing function for it, that verifies all parameters.

src/basic/parse-util.c
src/basic/parse-util.h
src/libsystemd/sd-device/sd-device.c
src/libsystemd/sd-login/sd-login.c
src/machine/machine.c
src/network/networkctl.c
src/network/networkd-link-bus.c
src/resolve-host/resolve-host.c

index 1ee57836803fb6d4de82576eb626379bbaae3236..b6358c459a1c2668ec50792b343f948446b5787d 100644 (file)
@@ -81,6 +81,19 @@ int parse_mode(const char *s, mode_t *ret) {
         return 0;
 }
 
+int parse_ifindex(const char *s, int *ret) {
+        int ifi, r;
+
+        r = safe_atoi(s, &ifi);
+        if (r < 0)
+                return r;
+        if (ifi <= 0)
+                return -EINVAL;
+
+        *ret = ifi;
+        return 0;
+}
+
 int parse_size(const char *t, uint64_t base, uint64_t *size) {
 
         /* Soo, sometimes we want to parse IEC binary suffixes, and
index 0e56848e26e9c9304e908b94a4c3e0a03cff87cb..408690d0b3ac0bd2bbb6140c3ba00c9106a03f05 100644 (file)
@@ -31,6 +31,7 @@
 int parse_boolean(const char *v) _pure_;
 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);
 
 int parse_size(const char *t, uint64_t base, uint64_t *size);
 int parse_range(const char *t, unsigned *lower, unsigned *upper);
index 0d40bc5c00624b33e75367e1eb09b9461c86163c..0e4926208784dc9b53bd5460073ecfdf36d4bf2a 100644 (file)
@@ -356,13 +356,10 @@ int device_set_ifindex(sd_device *device, const char *_ifindex) {
         assert(device);
         assert(_ifindex);
 
-        r = safe_atoi(_ifindex, &ifindex);
+        r = parse_ifindex(_ifindex, &ifindex);
         if (r < 0)
                 return r;
 
-        if (ifindex <= 0)
-                return -EINVAL;
-
         r = device_add_property_internal(device, "IFINDEX", _ifindex);
         if (r < 0)
                 return r;
@@ -632,11 +629,9 @@ _public_ int sd_device_new_from_device_id(sd_device **ret, const char *id) {
                 struct ifreq ifr = {};
                 int ifindex;
 
-                r = safe_atoi(&id[1], &ifr.ifr_ifindex);
+                r = parse_ifindex(&id[1], &ifr.ifr_ifindex);
                 if (r < 0)
                         return r;
-                else if (ifr.ifr_ifindex <= 0)
-                        return -EINVAL;
 
                 sk = socket(PF_INET, SOCK_DGRAM, 0);
                 if (sk < 0)
index cd766c3f91edea17c62e07c9bfde52151c6d29db..3f2e459825797b4f2f124e924de63a69b265119e 100644 (file)
@@ -932,9 +932,7 @@ _public_ int sd_machine_get_ifindices(const char *machine, int **ifindices) {
 
                 *(char*) (mempcpy(buf, word, l)) = 0;
 
-                if (safe_atoi(buf, &ifi) < 0)
-                        continue;
-                if (ifi <= 0)
+                if (parse_ifindex(buf, &ifi) < 0)
                         continue;
 
                 if (!GREEDY_REALLOC(ni, allocated, nr+1)) {
index d88b7c90df2e38f2d0854df7d147b95f33949d6b..cbc03640c1754d1433757d099bfdcd63aaac316d 100644 (file)
@@ -332,9 +332,7 @@ int machine_load(Machine *m) {
                                 break;
                         }
 
-                        if (safe_atoi(word, &ifi) < 0)
-                                continue;
-                        if (ifi <= 0)
+                        if (parse_ifindex(word, &ifi) < 0)
                                 continue;
 
                         if (!GREEDY_REALLOC(ni, allocated, nr+1)) {
index 97c1fe65602c3682ef316f237cf82a8d286c2118..ba7e3ba74a066d26ee9788eae2b7602ff96f782a 100644 (file)
@@ -521,7 +521,7 @@ static int link_status_one(
         assert(rtnl);
         assert(name);
 
-        if (safe_atoi(name, &ifindex) >= 0 && ifindex > 0)
+        if (parse_ifindex(name, &ifindex) >= 0)
                 r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, ifindex);
         else {
                 r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, 0);
index 7fc4510ac90674e60877ae194b4c5de0acfb498f..11b35d6cf804c9f7859f387b670aed9cd8f623fa 100644 (file)
@@ -103,7 +103,7 @@ int link_object_find(sd_bus *bus, const char *path, const char *interface, void
         if (r < 0)
                 return 0;
 
-        r = safe_atoi(identifier, &ifindex);
+        r = parse_ifindex(identifier, &ifindex);
         if (r < 0)
                 return 0;
 
index 57739d1f3e7ccaada76b141d2aae7c97b19af43a..432e62dd9f8efd0177bd3345dae10ae18c151d2d 100644 (file)
@@ -300,8 +300,7 @@ static int parse_address(const char *s, int *family, union in_addr_union *addres
 
         percent = strchr(s, '%');
         if (percent) {
-                r = safe_atoi(percent+1, &ifi);
-                if (r < 0 || ifi <= 0) {
+                if (parse_ifindex(percent+1, &ifi) < 0) {
                         ifi = if_nametoindex(percent+1);
                         if (ifi <= 0)
                                 return -EINVAL;
@@ -521,7 +520,7 @@ static int parse_argv(int argc, char *argv[]) {
                 case 'i': {
                         int ifi;
 
-                        if (safe_atoi(optarg, &ifi) >= 0 && ifi > 0)
+                        if (parse_ifindex(optarg, &ifi) >= 0)
                                 arg_ifindex = ifi;
                         else {
                                 ifi = if_nametoindex(optarg);