From 89ad34fd3fe1cc2871cff99117af1cf6b35a4776 Mon Sep 17 00:00:00 2001
From: Danny Auble <da@schedmd.com>
Date: Thu, 14 Jul 2011 16:29:31 -0700
Subject: [PATCH] BLUEGENE - updated resolve functionality and moved it into a
 common location

---
 src/smap/configure_functions.c | 45 +++++------------------------
 src/smap/opts.c                | 42 +++++++++++++++++++++++++++
 src/smap/smap.c                | 52 ++--------------------------------
 src/smap/smap.h                |  1 +
 4 files changed, 53 insertions(+), 87 deletions(-)

diff --git a/src/smap/configure_functions.c b/src/smap/configure_functions.c
index 68d3c859363..3fc135d9aee 100644
--- a/src/smap/configure_functions.c
+++ b/src/smap/configure_functions.c
@@ -532,6 +532,8 @@ geo_error_message:
 static int _resolve(char *com)
 {
 	int i=0;
+	char *ret_str;
+
 #ifdef HAVE_BG_FILES
 	int len=strlen(com);
 	char *rack_mid = NULL;
@@ -545,51 +547,18 @@ static int _resolve(char *com)
 	}
 	if (com[i] == 'r')
 		com[i] = 'R';
-
-	memset(error_string, 0, 255);
-#ifdef HAVE_BG_FILES
-	if (!have_db2) {
-		sprintf(error_string, "Must be on BG SN to resolve\n");
-		goto resolve_error;
+	ret_str = resolve_mp(com+i);
+	if (ret_str) {
+		snprintf(error_string, sizeof(error_string), "%s", ret_str);
+		xfree(ret_str);
 	}
 
-	if (len-i<3) {
-		sprintf(error_string, "Must enter 3 coords to resolve.\n");
-		goto resolve_error;
-	}
-	if (com[i] != 'R') {
-		rack_mid = find_bp_rack_mid(com+i);
-
-		if (rack_mid)
-			sprintf(error_string,
-				"X=%c Y=%c Z=%c resolves to %s\n",
-				com[X+i],com[Y+i],com[Z+i], rack_mid);
-		else
-			sprintf(error_string,
-				"X=%c Y=%c Z=%c has no resolve\n",
-				com[X+i],com[Y+i],com[Z+i]);
-
-	} else {
-		coord = find_bp_loc(com+i);
-
-		if (coord)
-			sprintf(error_string,
-				"%s resolves to X=%d Y=%d Z=%d\n",
-				com+i,coord[X],coord[Y],coord[Z]);
-		else
-			sprintf(error_string, "%s has no resolve.\n",
-				com+i);
-	}
-resolve_error:
-#else
-			sprintf(error_string,
-				"Must be on BG SN to resolve.\n");
-#endif
 	wnoutrefresh(text_win);
 	doupdate();
 
 	return 1;
 }
+
 static int _change_state_all_bps(char *com, int state)
 {
 	char start_loc[32], end_loc[32];
diff --git a/src/smap/opts.c b/src/smap/opts.c
index 84bc3876402..5f51fd771bb 100644
--- a/src/smap/opts.c
+++ b/src/smap/opts.c
@@ -203,6 +203,48 @@ extern void clear_window(WINDOW *win)
 	wnoutrefresh(win);
 }
 
+extern char *resolve_mp(char *desc)
+{
+	char *ret_str = NULL;
+#if defined HAVE_BG_FILES
+	ba_mp_t *ba_mp = NULL;
+	int i;
+
+	if (!desc) {
+		ret_str = xstrdup("No Description given.\n");
+		goto fini;
+	}
+
+	i = strlen(desc) - params.cluster_dims;
+	if (i < 0) {
+		ret_str = xstrdup_printf("Must enter %d coords to resolve.\n",
+					 params.cluster_dim);
+		goto fini;
+	}
+
+	if (desc[0] != 'R') {
+		ba_mp = str2ba_mp(desc+len);
+		if (ba_mp)
+			ret_str = xstrdup_printf("%s resolves to %s\n",
+						 ba_mp->coord_str, ba_mp->loc);
+		else
+			ret_str = xstrdup_printf("%s has no resolve\n", desc+i);
+	} else {
+		ba_mp = loc2ba_mp(desc);
+		if (ba_mp)
+			ret_str = xstrdup_printf("%s resolves to %s\n",
+						 desc, ba_mp->coord_str);
+		else
+			ret_str = xstrdup_printf("%s has no resolve.\n", desc);
+	}
+fini:
+#else
+	ret_str = xstrdup("Must be physically on a BlueGene system for support "
+			  "of resolve option.\n");
+#endif
+	return ret_str;
+}
+
 static void _usage(void)
 {
 #ifdef HAVE_BG
diff --git a/src/smap/smap.c b/src/smap/smap.c
index ee20529f96d..f0cbed7325e 100644
--- a/src/smap/smap.c
+++ b/src/smap/smap.c
@@ -121,57 +121,11 @@ int main(int argc, char *argv[])
 	init_grid(new_node_ptr);
 
 	if (params.resolve) {
-#if defined HAVE_BG_FILES && defined HAVE_BG_L_P
-#if 1
-		error("this doesn't work in the current 2.3 code. FIXME");
-#else
-		if (!have_db2) {
-			printf("Required libraries can not be found "
-			       "to access the Bluegene system.\nPlease "
-			       "set your LD_LIBRARY_PATH correctly to "
-			       "point to them.\n");
-			goto part_fini;
-		}
-
+		char *ret_str = resolve_mp(params.resolve);
+		if (ret_str)
+			printf("%s", ret_string);
 		if (!mapset)
 			mapset = 1;
-		if (params.resolve[0] != 'R') {
-			i = strlen(params.resolve);
-			i -= 3;
-			if (i < 0) {
-				printf("No real block was entered\n");
-				goto part_fini;
-			}
-			char *rack_mid = find_bp_rack_mid(params.resolve+i);
-			if (rack_mid) {
-				printf("X=%c Y=%c Z=%c resolves to %s\n",
-				       params.resolve[0+i],
-				       params.resolve[1+i],
-				       params.resolve[2+i],
-				       rack_mid);
-			} else {
-				printf("X=%c Y=%c Z=%c has no resolve\n",
-				       params.resolve[0+i],
-				       params.resolve[1+i],
-				       params.resolve[2+i]);
-			}
-		} else {
-			uint16_t *coord = find_bp_loc(params.resolve);
-			if (coord) {
-				printf("%s resolves to X=%d Y=%d Z=%d\n",
-				       params.resolve,
-				       coord[0], coord[1], coord[2]);
-			} else {
-				printf("%s has no resolve.\n",
-				       params.resolve);
-			}
-		}
-part_fini:
-#endif
-#else
-		printf("Must be physically on a BlueGene system for support "
-		       "of resolve option.\n");
-#endif
 		_smap_exit(0);	/* Calls exit(), no return */
 	}
 	if (!params.commandline) {
diff --git a/src/smap/smap.h b/src/smap/smap.h
index 4d9cdfb2eab..35aeafb44fe 100644
--- a/src/smap/smap.h
+++ b/src/smap/smap.h
@@ -190,6 +190,7 @@ bitstr_t *get_requested_node_bitmap(void);
 extern void parse_command_line(int argc, char *argv[]);
 extern void print_date(void);
 extern void clear_window(WINDOW *win);
+extern char *resolve_mp(char *desc);
 
 extern void get_slurm_part(void);
 extern void get_bg_part(void);
-- 
GitLab