[dm-devel] [PATCH 3/7] libmultipath: refactor uevent_get_XXX

Martin Wilck mwilck at suse.com
Wed Jan 17 07:49:35 UTC 2018


Use common helper functions for uevent_get_XXX.

Signed-off-by: Martin Wilck <mwilck at suse.com>
---
 libmultipath/uevent.c | 159 +++++++++++++++++++++-----------------------------
 1 file changed, 67 insertions(+), 92 deletions(-)

diff --git a/libmultipath/uevent.c b/libmultipath/uevent.c
index 80bf1dd15372..13d468f7fce0 100644
--- a/libmultipath/uevent.c
+++ b/libmultipath/uevent.c
@@ -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");
 }
-- 
2.15.1




More information about the dm-devel mailing list