--- /dev/null
+Bottom: 0218356f965d42baf54706b73dc0b362b11d4d6f
+Top: 16e9ccf5f15fb3b0f38df9b8f54df71a05372f49
+Author: Sean Hefty <sean.hefty@intel.com>
+Date: 2010-12-07 10:59:22 -0800
+
+Refresh of mult_dest
+
+---
+
+diff --git a/Makefile.am b/Makefile.am
+index 957b016..dfe955e 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -5,7 +5,7 @@ AM_CFLAGS = -g -Wall -D_GNU_SOURCE
+ bin_PROGRAMS = util/ib_acme
+ sbin_PROGRAMS = svc/ib_acm
+ svc_ib_acm_SOURCES = src/acm.c
+-util_ib_acme_SOURCES = src/acme.c linux/acme_linux.c src/libacm.c linux/libacm_linux.c
++util_ib_acme_SOURCES = src/acme.c linux/acme_linux.c src/libacm.c linux/libacm_linux.c src/parse.c
+ svc_ib_acm_CFLAGS = $(AM_CFLAGS)
+ util_ib_acme_CFLAGS = $(AM_CFLAGS)
+
+diff --git a/src/parse.c b/src/parse.c
+new file mode 100644
+index 0000000..e90fb09
+--- /dev/null
++++ b/src/parse.c
+@@ -0,0 +1,108 @@
++/*
++ * Copyright (c) 2009-2010 Intel Corporation. All rights reserved.
++ *
++ * This software is available to you under the OpenIB.org BSD license
++ * below:
++ *
++ * Redistribution and use in source and binary forms, with or
++ * without modification, are permitted provided that the following
++ * conditions are met:
++ *
++ * - Redistributions of source code must retain the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer.
++ *
++ * - Redistributions in binary form must reproduce the above
++ * copyright notice, this list of conditions and the following
++ * disclaimer in the documentation and/or other materials
++ * provided with the distribution.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
++ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
++ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
++ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
++ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++ * SOFTWARE.
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++static char *expand(char *basename, char *args, int *str_cnt, int *str_size)
++{
++ char buf[256];
++ char *str_buf = NULL;
++ char *token, *tmp;
++ int from, to, width;
++ int size = 0, cnt = 0;
++
++ token = strtok(args, ",");
++ do {
++ from = atoi(token);
++ tmp = index(token, '-');
++ if (tmp) {
++ to = atoi(tmp+1);
++ width = tmp - token;
++ } else {
++ to = from;
++ width = strlen(token);
++ }
++
++ while (from <= to) {
++ sprintf(buf, "%s%0*d", basename, width, from);
++ str_buf = realloc(str_buf, size + strlen(buf)+1);
++ strcpy(&str_buf[size], buf);
++
++ from++;
++ cnt++;
++ size += strlen(buf)+1;
++ }
++
++ token = strtok(NULL, ",");
++ } while (token);
++
++ *str_size = size;
++ *str_cnt = cnt;
++ return str_buf;
++}
++
++char **parse(char *args, int *count)
++{
++ char **ptrs;
++ char *str_buf, *cpy, *token, *next;
++ int cnt = 0, str_size = 0;
++ int i;
++
++ /* make a copy that strtok can modify */
++ cpy = malloc(strlen(args) + 1);
++ strcpy(cpy, args);
++
++ token = strtok(cpy, "[");
++ next = strtok(NULL, "]");
++ if (!next) {
++ str_size = strlen(token) + 1;
++ str_buf = malloc(str_size);
++ strcpy(str_buf, token);
++ cnt = 1;
++ } else {
++ str_buf = expand(cpy, next, &cnt, &str_size);
++ }
++
++ ptrs = malloc((sizeof str_buf * (cnt + 1)) + str_size);
++ memcpy(&ptrs[cnt + 1], str_buf, str_size);
++
++ ptrs[0] = (char*) &ptrs[cnt + 1];
++ for (i = 1; i < cnt; i++)
++ ptrs[i] = index(ptrs[i - 1], 0) + 1;
++ ptrs[i] = NULL;
++
++ free(cpy);
++ free(str_buf);
++
++ if (count)
++ *count = cnt;
++ return ptrs;
++}