Blob Blame Raw
From ca58932fdba91911ceb7fe59bff3206c073671cf Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Tue, 13 Aug 2013 11:34:31 -0700
Subject: [PATCH 02/22] idbm_rec_write, seperate old and new style writes

Duplicates a small bit of code, but easier to understand and extened.
---
 usr/idbm.c | 116 +++++++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 79 insertions(+), 37 deletions(-)

diff --git a/usr/idbm.c b/usr/idbm.c
index b5b86269f6bf..d69a5c5c41a2 100644
--- a/usr/idbm.c
+++ b/usr/idbm.c
@@ -2008,7 +2008,7 @@ mkdir_portal:
 	return f;
 }
 
-static int idbm_rec_write(node_rec_t *rec)
+static int idbm_rec_write_new(node_rec_t *rec)
 {
 	struct stat statb;
 	FILE *f;
@@ -2020,38 +2020,8 @@ static int idbm_rec_write(node_rec_t *rec)
 		log_error("Could not alloc portal");
 		return ISCSI_ERR_NOMEM;
 	}
-
-	snprintf(portal, PATH_MAX, "%s", NODE_CONFIG_DIR);
-	if (access(portal, F_OK) != 0) {
-		if (mkdir(portal, 0660) != 0) {
-			log_error("Could not make %s: %s", portal,
-				  strerror(errno));
-			rc = ISCSI_ERR_IDBM;
-			goto free_portal;
-		}
-	}
-
-	snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name);
-	if (access(portal, F_OK) != 0) {
-		if (mkdir(portal, 0660) != 0) {
-			log_error("Could not make %s: %s", portal,
-				  strerror(errno));
-			rc = ISCSI_ERR_IDBM;
-			goto free_portal;
-		}
-	}
-
 	snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR,
 		 rec->name, rec->conn[0].address, rec->conn[0].port);
-	log_debug(5, "Looking for config file %s", portal);
-
-	rc = idbm_lock();
-	if (rc)
-		goto free_portal;
-
-	if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN)
-		/* drop down to old style portal as config */
-		goto open_conf;
 
 	rc = stat(portal, &statb);
 	if (rc) {
@@ -2072,11 +2042,11 @@ static int idbm_rec_write(node_rec_t *rec)
 			log_error("Could not convert %s: %s", portal,
 				  strerror(errno));
 			rc = ISCSI_ERR_IDBM;
-			goto unlock;
+			goto free_portal;
 		}
 	} else {
 		rc = ISCSI_ERR_INVAL;
-		goto unlock;
+		goto free_portal;
 	}	
 
 mkdir_portal:
@@ -2087,24 +2057,96 @@ mkdir_portal:
 			log_error("Could not make dir %s: %s",
 				  portal, strerror(errno));
 			rc = ISCSI_ERR_IDBM;
-			goto unlock;
+			goto free_portal;
 		}
 	}
 
 	snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR,
 		 rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt,
 		 rec->iface.name);
-open_conf:
+/* open_conf: */
 	f = fopen(portal, "w");
 	if (!f) {
 		log_error("Could not open %s: %s", portal, strerror(errno));
 		rc = ISCSI_ERR_IDBM;
-		goto unlock;
+		goto free_portal;
 	}
 
 	idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f);
 	fclose(f);
-unlock:
+free_portal:
+	free(portal);
+	return rc;
+}
+
+static int idbm_rec_write_old(node_rec_t *rec)
+{
+	FILE *f;
+	char *portal;
+	int rc = 0;
+
+	portal = malloc(PATH_MAX);
+	if (!portal) {
+		log_error("Could not alloc portal");
+		return ISCSI_ERR_NOMEM;
+	}
+	snprintf(portal, PATH_MAX, "%s/%s/%s,%d", NODE_CONFIG_DIR,
+		 rec->name, rec->conn[0].address, rec->conn[0].port);
+
+	f = fopen(portal, "w");
+	if (!f) {
+		log_error("Could not open %s: %sd", portal, strerror(errno));
+		rc = ISCSI_ERR_IDBM;
+		goto free_portal;
+	}
+	idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f);
+	fclose(f);
+free_portal:
+	free(portal);
+	return rc;
+}
+
+static int idbm_rec_write(node_rec_t *rec)
+{
+	char *portal;
+	int rc = 0;
+
+	portal = malloc(PATH_MAX);
+	if (!portal) {
+		log_error("Could not alloc portal");
+		return ISCSI_ERR_NOMEM;
+	}
+
+	snprintf(portal, PATH_MAX, "%s", NODE_CONFIG_DIR);
+	if (access(portal, F_OK) != 0) {
+		if (mkdir(portal, 0660) != 0) {
+			log_error("Could not make %s: %s", portal,
+				  strerror(errno));
+			rc = ISCSI_ERR_IDBM;
+			goto free_portal;
+		}
+	}
+
+	snprintf(portal, PATH_MAX, "%s/%s", NODE_CONFIG_DIR, rec->name);
+	if (access(portal, F_OK) != 0) {
+		if (mkdir(portal, 0660) != 0) {
+			log_error("Could not make %s: %s", portal,
+				  strerror(errno));
+			rc = ISCSI_ERR_IDBM;
+			goto free_portal;
+		}
+	}
+
+	rc = idbm_lock();
+	if (rc)
+		goto free_portal;
+
+	if (rec->tpgt == PORTAL_GROUP_TAG_UNKNOWN)
+		/* old style portal as config */
+		rc = idbm_rec_write_old(rec);
+	else
+		rc = idbm_rec_write_new(rec);
+
 	idbm_unlock();
 free_portal:
 	free(portal);
-- 
2.14.3