fixed bugs parsing lustre mount strings.
authorChristos Zoulas <christos@zoulas.com>
Wed, 25 Jul 2012 19:38:59 +0000 (15:38 -0400)
committerChristos Zoulas <christos@zoulas.com>
Wed, 25 Jul 2012 19:38:59 +0000 (15:38 -0400)
amd/ops_lustre.c
include/am_utils.h
libamu/strutil.c

index 07f117a593974c436b160adced93c3d3737ae307..1b321ce4e8c439422c75a001d850e26741ae9e6f 100644 (file)
@@ -75,7 +75,7 @@ am_ops lustre_ops =
 static char *
 lustre_match(am_opts *fo)
 {
-  char *xmtab;
+  char *xmtab, *cp;
   size_t l;
   char *rhost, *ptr, *remhost;
   struct in_addr addr;
@@ -96,7 +96,7 @@ lustre_match(am_opts *fo)
    */
   rhost = xstrdup(fo->opt_rhost);
   remhost = NULL;
-  for (ptr = strtok(rhost, ","); ptr; ptr = strtok(NULL, ",")) {
+  for (ptr = strtok(rhost, ":"); ptr; ptr = strtok(NULL, ":")) {
     char *at = strchr(ptr, '@');
     if (at == NULL) {
       plog(XLOG_USER, "lustre: missing protocol in host `%s'", ptr);
@@ -123,10 +123,13 @@ lustre_match(am_opts *fo)
       memcpy(&addr.s_addr, hp->h_addr, sizeof(addr));
     }
     *at = '@';
+
+    cp = remhost;
     if (remhost)
-      remhost = str3cat(remhost, ",", inet_ntoa(addr), at);
+      remhost = strvcat(cp, ":", inet_ntoa(addr), at, NULL);
     else
-      remhost = str3cat(NULL, inet_ntoa(addr), at, "");
+      remhost = strvcat(inet_ntoa(addr), at, NULL);
+    XFREE(cp);
   }
   if (remhost == NULL) {
     plog(XLOG_USER, "lustre: empty host");
index 90d30b3d00ab56a6feeedc63a84c580917fcf278..d8bcd2f529ad3dc121ea68f2c3409c72d7f97ac8 100644 (file)
@@ -282,6 +282,7 @@ extern char *get_version_string(void);
 extern char *inet_dquad(char *, size_t, u_long);
 extern char *print_wires(void);
 extern char *str3cat(char *, char *, char *, char *);
+extern char *strvcat(const char *, ...);
 extern char *strealloc(char *, char *);
 extern char *strip_selectors(char *, char *);
 extern char *strnsave(const char *, int);
index 3a480c52cd94777e9092389c15401ecbc6fe49ab..8c321def6ff0fd8c0a482fdaed81dafde2eb774e 100644 (file)
@@ -268,3 +268,37 @@ xvsnprintf(char *str, size_t size, const char *format, va_list ap)
 
   return ret;
 }
+
+static size_t
+vstrlen(const char *src, va_list ap)
+{
+  size_t len = strlen(src);
+  while ((src = va_arg(ap, const char *)) != NULL)
+    len += strlen(src);
+  return len;
+}
+
+static void
+vstrcpy(char *dst, const char *src, va_list ap)
+{
+  strcpy(dst, src);
+  while ((src = va_arg(ap, const char *)) != NULL)
+    strcat(dst, src);
+}
+
+char *
+strvcat(const char *src, ...)
+{
+  size_t len;
+  char *dst;
+  va_list ap;
+
+  va_start(ap, src);
+  len = vstrlen(src, ap);
+  va_end(ap);
+  dst = xmalloc(len + 1);
+  va_start(ap, src);
+  vstrcpy(dst, src, ap);
+  va_end(ap);
+  return dst;
+}