[PATCH 05/15] Make tgtadm_errno -> string conversion less error prone

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Avoid segfaults due to invalid tgtadm error codes and make the error code ->
string mapping more explicit at the same time (changing the order of error
codes won't lead to wrong conversions).

Signed-off-by: Arne Redlich <arne.redlich@xxxxxxxxxxxxxx>
---
 usr/tgtadm.c |   64 ++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 38 insertions(+), 26 deletions(-)

diff --git a/usr/tgtadm.c b/usr/tgtadm.c
index 71d7fc5..2002baa 100644
--- a/usr/tgtadm.c
+++ b/usr/tgtadm.c
@@ -60,31 +60,43 @@ do {									\
 static char program_name[] = "tgtadm";
 static int debug;
 
-static char *tgtadm_emsg[] = {
-	"",
-	"unknown error",
-	"out of memory",
-	"can't find the driver",
-	"can't find the target", /* 5 */
-
-	"can't find the logical unit",
-	"can't find the session",
-	"can't find the connection",
-	"this target already exists",
-	"this logical unit number already exists",  /* 10 */
-
-	"this access control rule already exists",
-	"this account already exists",
-	"can't find the account",
-	"Too many accounts",
-	"invalid request", /* 15 */
-
-	"this target already has an outgoing account",
-	"this target unit is still active",
-	"this logical unit is still active",
-	"this operation isn't supported",
-	"unknown parameter", /* 20 */
-};
+static const char * tgtadm_strerror(int err)
+{
+	static const struct {
+		enum tgtadm_errno err;
+		char *desc;
+	} errors[] = {
+		{ TGTADM_SUCCESS, "success" },
+		{ TGTADM_UNKNOWN_ERR, "unknown error" },
+		{ TGTADM_NOMEM, "out of memory" },
+		{ TGTADM_NO_DRIVER, "can't find the driver" },
+		{ TGTADM_NO_TARGET, "can't find the target" },
+		{ TGTADM_NO_LUN, "can't find the logical unit" },
+		{ TGTADM_NO_SESSION, "can't find the session" },
+		{ TGTADM_NO_CONNECTION, "can't find the connection" },
+		{ TGTADM_TARGET_EXIST, "this target already exists" },
+		{ TGTADM_LUN_EXIST, "this logical unit number already exists" },
+		{ TGTADM_ACL_EXIST, "this access control rule already exists" },
+		{ TGTADM_USER_EXIST, "this account already exists" },
+		{ TGTADM_NO_USER, "can't find the account" },
+		{ TGTADM_TOO_MANY_USER, "too many accounts" },
+		{ TGTADM_INVALID_REQUEST, "invalid request" },
+		{ TGTADM_OUTACCOUNT_EXIST,
+		  "this target already has an outgoing account" },
+		{ TGTADM_TARGET_ACTIVE, "this target is still active" },
+		{ TGTADM_LUN_ACTIVE, "this logical unit is still active" },
+		{ TGTADM_UNSUPPORTED_OPERATION,
+		  "this operation isn't supported" },
+		{ TGTADM_UNKNOWN_PARAM, "unknown parameter" }
+	};
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(errors); ++i)
+		if (errors[i].err == err)
+			return errors[i].desc;
+
+	return "(unknown tgtadm_errno)";
+}
 
 struct option const long_options[] = {
 	{"debug", no_argument, NULL, 'd'},
@@ -216,7 +228,7 @@ retry:
 	}
 
 	if (rsp.err != TGTADM_SUCCESS) {
-		eprintf("%s\n", tgtadm_emsg[rsp.err]);
+		eprintf("%s\n",	tgtadm_strerror(rsp.err));
 		return EINVAL;
 	}
 
-- 
1.6.0.4



--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux SCSI]     [Linux RAID]     [Linux Clusters]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]

  Powered by Linux