Hey Sasha,

I was looking into adding a new command to ibsim, but since the original
cmd-parsing function only checks for the first char of the inputted
command, it limits the ability to add a reasonable-sounding new command
name.  The patch changes the function to check the entire command name.

Al

-- 
Albert Chu
[EMAIL PROTECTED]
925-422-5311
Computer Scientist
High Performance Systems Division
Lawrence Livermore National Laboratory
>From 5871b81d1ebdf86f9a9fcf79c8d8a558fd2600b1 Mon Sep 17 00:00:00 2001
From: Albert Chu <[EMAIL PROTECTED]>
Date: Wed, 13 Aug 2008 13:53:14 -0700
Subject: [PATCH] parse sim cmds via full name


Signed-off-by: Albert Chu <[EMAIL PROTECTED]>
---
 ibsim/sim_cmd.c |  105 +++++++++++++++++++++----------------------------------
 1 files changed, 40 insertions(+), 65 deletions(-)

diff --git a/ibsim/sim_cmd.c b/ibsim/sim_cmd.c
index 1f6ba88..a35d0f4 100644
--- a/ibsim/sim_cmd.c
+++ b/ibsim/sim_cmd.c
@@ -757,91 +757,66 @@ int netstarted = 0;
 
 int do_cmd(char *buf, FILE *f)
 {
+	char cmdbuf[4096];
 	char *line;
 	int r = 0;
+	int i;
 
 	for (line = buf; *line && isspace(*line); line++) ;
 
-	switch (*line) {
-	case '!':
+	/* special cases */
+	if (*line == '!')
 		r = sim_cmd_file(f, line);
-		break;
-	case 'd':
-	case 'D':
+	else if (*line == '#' || *line == '\n' || *line == '\0')
+		goto out;
+
+	memset(cmdbuf, '\0', sizeof(cmdbuf));
+	for (i = 0; 
+	     i < 4095 && line[i] && (isalpha(line[i]) || line[i] == '?'); 
+	     i++)
+		cmdbuf[i] = line[i];
+
+	if (!strcasecmp(cmdbuf, "Dump"))
 		r = dump_net(f, line);
-		break;
-	case 'r':
-	case 'R':
+	else if (!strcasecmp(cmdbuf, "Route"))
 		r = dump_route(f, line);
-		break;
-	case 'l':
-	case 'L':
+	else if (!strcasecmp(cmdbuf, "Link"))
 		r = do_link(f, line);
-		break;
-	case 'B':
-	case 'b':
-		r = do_change_baselid(f, line);
-		break;
-	case 'u':
-	case 'U':
+	else if (!strcasecmp(cmdbuf, "Unlink"))
 		r = do_unlink(f, line, 0);
-		break;
-	case 'G':
-	case 'g':
+	else if (!strcasecmp(cmdbuf, "Clear"))
+		r = do_unlink(f, line, 1);
+	else if (!strcasecmp(cmdbuf, "Guid"))
 		r = do_set_guid(f, line);
-		break;
-	case 'e':
-	case 'E':
+	else if (!strcasecmp(cmdbuf, "Error"))
 		r = do_seterror(f, line);
-		break;
-	case 'c':
-	case 'C':
-		r = do_unlink(f, line, 1);
-		break;
-	case 'q':
-	case 'Q':
-		fprintf(f, "Exiting network simulator.\n");
-		free_core();
-		exit(0);
-		break;
-	case 'h':
-	case 'H':
-	case '?':
-		r = dump_help(f);
-		break;
-	case 'V':
-	case 'v':
-		r = change_verbose(f, line);
-		break;
-	case 'S':
-	case 's':
+	else if (!strcasecmp(cmdbuf, "Baselid"))
+		r = do_change_baselid(f, line);
+	else if (!strcasecmp(cmdbuf, "Start")) {
 		if (!netstarted) {
 			DEBUG("starting...");
 			netstarted = 1;
 			return 0;
 		}
-		break;
-	case 'W':
-	case 'w':
+	}
+	else if (!strcasecmp(cmdbuf, "Verbose"))
+		r = change_verbose(f, line);
+	else if (!strcasecmp(cmdbuf, "Wait"))
 		r = do_wait(f, line);
-		break;
-	case 'A':
-	case 'a':
+	else if (!strcasecmp(cmdbuf, "Attached"))
 		r = list_connections(f);
-		break;
-	case 'X':
-	case 'x':
+	else if (!strcasecmp(cmdbuf, "X"))
 		r = do_disconnect_client(f, strtol(line + 2, 0, 0));
-		break;
-	case '#':
-		fprintf(f, line);
-		// fall through
-	case '\n':
-	case 0:
-		break;
-	default:
-		fprintf(f, "op %c unknown - skipped\n", line[0]);
+	else if (!strcasecmp(cmdbuf, "Help")
+		 || !strcasecmp(cmdbuf, "?"))
+		r = dump_help(f);
+	else if (!strcasecmp(cmdbuf, "Quit")) {
+		fprintf(f, "Exiting network simulator.\n");
+		free_core();
+		exit(0);
 	}
-
+	else
+		fprintf(f, "operation %s unknown - skipped\n", cmdbuf);
+out:
 	return r;
 }
-- 
1.5.4.5

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to