libmultipath: refactor uevent_get_XXX
authorMartin Wilck <mwilck@suse.com>
Wed, 17 Jan 2018 07:49:35 +0000 (08:49 +0100)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Wed, 7 Mar 2018 08:40:12 +0000 (09:40 +0100)
Use common helper functions for uevent_get_XXX.

Signed-off-by: Martin Wilck <mwilck@suse.com>
libmultipath/uevent.c

index 80bf1dd..13d468f 100644 (file)
@@ -104,28 +104,69 @@ uevq_cleanup(struct list_head *tmpq)
        }
 }
 
+static const char* uevent_get_env_var(const struct uevent *uev,
+                                     const char *attr)
+{
+       int i, len;
+       const char *p = NULL;
+
+       if (attr == NULL)
+               goto invalid;
+
+       len = strlen(attr);
+       if (len == 0)
+               goto invalid;
+
+       for (i = 0; uev->envp[i] != NULL; i++) {
+               const char *var = uev->envp[i];
+
+               if (strlen(var) > len &&
+                   !memcmp(var, attr, len) && var[len] == '=') {
+                       p = var + len + 1;
+                       break;
+               }
+       }
+
+       condlog(4, "%s: %s -> '%s'", __func__, attr, p);
+       return p;
+
+invalid:
+       condlog(2, "%s: empty variable name", __func__);
+       return NULL;
+}
+
+static int uevent_get_env_positive_int(const struct uevent *uev,
+                                      const char *attr)
+{
+       const char *p = uevent_get_env_var(uev, attr);
+       char *q;
+       int ret;
+
+       if (p == NULL || *p == '\0')
+               return -1;
+
+       ret = strtoul(p, &q, 10);
+       if (*q != '\0' || ret < 0) {
+               condlog(2, "%s: invalid %s: '%s'", __func__, attr, p);
+               return -1;
+       }
+       return ret;
+}
+
 void
 uevent_get_wwid(struct uevent *uev)
 {
-       int i;
        char *uid_attribute;
+       const char *val;
        struct config * conf;
 
        conf = get_multipath_config();
        uid_attribute = parse_uid_attribute_by_attrs(conf->uid_attrs, uev->kernel);
        put_multipath_config(conf);
 
-       if (!uid_attribute)
-               return;
-
-       for (i = 0; uev->envp[i] != NULL; i++) {
-               if (!strncmp(uev->envp[i], uid_attribute, strlen(uid_attribute)) &&
-                   strlen(uev->envp[i]) > strlen(uid_attribute) &&
-                   uev->envp[i][strlen(uid_attribute)] == '=') {
-                       uev->wwid = uev->envp[i] + strlen(uid_attribute) + 1;
-                       break;
-               }
-       }
+       val = uevent_get_env_var(uev, uid_attribute);
+       if (val)
+               uev->wwid = (char*)val;
        free(uid_attribute);
 }
 
@@ -852,105 +893,39 @@ out:
 
 int uevent_get_major(struct uevent *uev)
 {
-       char *p, *q;
-       int i, major = -1;
-
-       for (i = 0; uev->envp[i] != NULL; i++) {
-               if (!strncmp(uev->envp[i], "MAJOR", 5) && strlen(uev->envp[i]) > 6) {
-                       p = uev->envp[i] + 6;
-                       major = strtoul(p, &q, 10);
-                       if (p == q) {
-                               condlog(2, "invalid major '%s'", p);
-                               major = -1;
-                       }
-                       break;
-               }
-       }
-       return major;
+       return uevent_get_env_positive_int(uev, "MAJOR");
 }
 
 int uevent_get_minor(struct uevent *uev)
 {
-       char *p, *q;
-       int i, minor = -1;
-
-       for (i = 0; uev->envp[i] != NULL; i++) {
-               if (!strncmp(uev->envp[i], "MINOR", 5) && strlen(uev->envp[i]) > 6) {
-                       p = uev->envp[i] + 6;
-                       minor = strtoul(p, &q, 10);
-                       if (p == q) {
-                               condlog(2, "invalid minor '%s'", p);
-                               minor = -1;
-                       }
-                       break;
-               }
-       }
-       return minor;
+       return uevent_get_env_positive_int(uev, "MINOR");
 }
 
 int uevent_get_disk_ro(struct uevent *uev)
 {
-       char *p, *q;
-       int i, ro = -1;
+       return uevent_get_env_positive_int(uev, "DISK_RO");
+}
 
-       for (i = 0; uev->envp[i] != NULL; i++) {
-               if (!strncmp(uev->envp[i], "DISK_RO", 7) && strlen(uev->envp[i]) > 8) {
-                       p = uev->envp[i] + 8;
-                       ro = strtoul(p, &q, 10);
-                       if (p == q) {
-                               condlog(2, "invalid read_only setting '%s'", p);
-                               ro = -1;
-                       }
-                       break;
-               }
-       }
-       return ro;
+static char *uevent_get_dm_str(const struct uevent *uev, char *attr)
+{
+       char *tmp = uevent_get_env_var(uev, attr);
+
+       if (tmp == NULL)
+               return NULL;
+       return strdup(tmp);
 }
 
 char *uevent_get_dm_name(struct uevent *uev)
 {
-       char *p = NULL;
-       int i;
-
-       for (i = 0; uev->envp[i] != NULL; i++) {
-               if (!strncmp(uev->envp[i], "DM_NAME", 7) &&
-                   strlen(uev->envp[i]) > 8) {
-                       p = MALLOC(strlen(uev->envp[i] + 8) + 1);
-                       strcpy(p, uev->envp[i] + 8);
-                       break;
-               }
-       }
-       return p;
+       return uevent_get_dm_str(uev, "DM_NAME");
 }
 
 char *uevent_get_dm_path(struct uevent *uev)
 {
-       char *p = NULL;
-       int i;
-
-       for (i = 0; uev->envp[i] != NULL; i++) {
-               if (!strncmp(uev->envp[i], "DM_PATH", 7) &&
-                   strlen(uev->envp[i]) > 8) {
-                       p = MALLOC(strlen(uev->envp[i] + 8) + 1);
-                       strcpy(p, uev->envp[i] + 8);
-                       break;
-               }
-       }
-       return p;
+       return uevent_get_dm_str(uev, "DM_PATH");
 }
 
 char *uevent_get_dm_action(struct uevent *uev)
 {
-       char *p = NULL;
-       int i;
-
-       for (i = 0; uev->envp[i] != NULL; i++) {
-               if (!strncmp(uev->envp[i], "DM_ACTION", 9) &&
-                   strlen(uev->envp[i]) > 10) {
-                       p = MALLOC(strlen(uev->envp[i] + 10) + 1);
-                       strcpy(p, uev->envp[i] + 10);
-                       break;
-               }
-       }
-       return p;
+       return uevent_get_dm_str(uev, "DM_ACTION");
 }