--- /dev/null
+Bottom: 32a7b8b2ffc23b410dc19c50a9bf68e149662635
+Top: 8badc8cdc48b346f15c359b9df5fabc6da645bbd
+Author: Sean Hefty <sean.hefty@intel.com>
+Date: 2010-12-07 10:50:36 -0800
+
+Refresh of mult_dest
+
+---
+
+diff --git a/man/ib_acme.1 b/man/ib_acme.1
+index 56c49f0..de212fb 100644
+--- a/man/ib_acme.1
++++ b/man/ib_acme.1
+@@ -31,6 +31,12 @@ the addr_format option.
+ Specifies the destination address of the path to resolve. The destination\r
+ address can be an IP address, system network name, or LID, as indicated by\r
+ the addr_format option.\r
++.P\r
++Multiple, numerical destinations can be specified by adding brackets [] to\r
++the end of a base destination name or address. Users may specify a list of\r
++numerical ranges inside the brackets using the following example as a\r
++guide: node[1-3,5,7-8]. This will result in testing node1, node2, node3,\r
++node5, node7, and node8. \r
+ .TP\r
+ \-v\r
+ Indicates that the resolved path information should be verified with the\r
+diff --git a/src/acme.c b/src/acme.c
+index 7e1ca5e..5ef05d3 100644
+--- a/src/acme.c
++++ b/src/acme.c
+@@ -60,6 +60,7 @@ struct ibv_context **verbs;
+ int dev_cnt;
+
+ extern int gen_addr_ip(FILE *f);
++extern char **parse(char *args, int *count);
+
+ #define VPRINT(format, ...) do { if (verbose) printf(format, ## __VA_ARGS__ ); } while (0)
+
+@@ -512,10 +513,11 @@ static int verify_resolve(struct ibv_path_record *path)
+ return ret;
+ }
+
+-static int resolve(char *program)
++static int resolve(char *program, char *dest_arg)
+ {
++ char *dest_list;
+ struct ibv_path_record path;
+- int ret;
++ int ret, i;
+
+ ret = libacm_init();
+ if (ret) {
+@@ -523,28 +525,37 @@ static int resolve(char *program)
+ return ret;
+ }
+
+- switch (addr_type) {
+- case 'i':
+- ret = resolve_ip(&path);
+- break;
+- case 'n':
+- ret = resolve_name(&path);
+- break;
+- case 'l':
+- memset(&path, 0, sizeof path);
+- ret = resolve_lid(&path);
+- break;
+- default:
+- show_usage(program);
+- exit(1);
++ dest_list = parse(dest_arg, NULL);
++ if (!dest_list) {
++ printf("Unable to parse destination argument\n");
++ return -1;
+ }
+
+- if (!ret)
+- show_path(&path);
++ for (dest_addr = dest_list[i]; dest_addr; i++) {
++ switch (addr_type) {
++ case 'i':
++ ret = resolve_ip(&path);
++ break;
++ case 'n':
++ ret = resolve_name(&path);
++ break;
++ case 'l':
++ memset(&path, 0, sizeof path);
++ ret = resolve_lid(&path);
++ break;
++ default:
++ show_usage(program);
++ exit(1);
++ }
+
+- if (verify)
+- ret = verify_resolve(&path);
++ if (!ret)
++ show_path(&path);
++
++ if (verify)
++ ret = verify_resolve(&path);
++ }
+
++ free(dest_list);
+ libacm_cleanup();
+ return ret;
+ }
+@@ -562,6 +573,7 @@ char *opt_arg(int argc, char **argv)
+
+ int CDECL_FUNC main(int argc, char **argv)
+ {
++ char *dest_arg;
+ int op, ret;
+
+ ret = osd_init();
+@@ -577,7 +589,7 @@ int CDECL_FUNC main(int argc, char **argv)
+ src_addr = optarg;
+ break;
+ case 'd':
+- dest_addr = optarg;
++ dest_arg = optarg;
+ break;
+ case 'v':
+ verify = 1;
+@@ -607,14 +619,14 @@ int CDECL_FUNC main(int argc, char **argv)
+ }
+ }
+
+- if ((src_addr && !dest_addr) ||
+- (!src_addr && !dest_addr && !make_addr && !make_opts)) {
++ if ((src_addr && !dest_arg) ||
++ (!src_addr && !dest_arg && !make_addr && !make_opts)) {
+ show_usage(argv[0]);
+ exit(1);
+ }
+
+- if (dest_addr)
+- ret = resolve(argv[0]);
++ if (dest_arg)
++ ret = resolve(argv[0], dest_arg);
+
+ if (!ret && make_addr)
+ ret = gen_addr();