allow the specification of multiple filenames (with or without
[rsync/rsync.git] / util.c
diff --git a/util.c b/util.c
index 8546e4a..1fdeee6 100644 (file)
--- a/util.c
+++ b/util.c
@@ -506,16 +506,18 @@ int lock_range(int fd, int offset, int len)
 }
 
 
-void glob_expand(char **argv, int *argc, int maxargs)
+static void glob_expand_one(char *s, char **argv, int *argc, int maxargs)
 {
 #ifndef HAVE_GLOB
+       argv[*argc] = strdup(s);
        (*argc)++;
        return;
 #else
        glob_t globbuf;
        int i;
 
-       rprintf(FINFO,"glob(%s) -> %d\n", argv[*argc], globbuf.gl_pathc);
+       argv[*argc] = strdup(s);
+
        memset(&globbuf, 0, sizeof(globbuf));
        glob(argv[*argc], 0, NULL, &globbuf);
        if (globbuf.gl_pathc == 0) {
@@ -532,3 +534,41 @@ void glob_expand(char **argv, int *argc, int maxargs)
        (*argc) += i;
 #endif
 }
+
+void glob_expand(char *base, char **argv, int *argc, int maxargs)
+{
+       char *s = argv[*argc];
+       char *p, *q;
+
+       if (!s || !*s) return;
+
+       s = strdup(s);
+       if (!s) out_of_memory("glob_expand");
+
+       q = s;
+       while ((p = strstr(q,base)) && ((*argc) < maxargs)) {
+               if (p != q && *(p-1) == ' ' && p[strlen(base)] == '/') {
+                       /* split it at this point */
+                       *(p-1) = 0;
+                       glob_expand_one(q, argv, argc, maxargs);
+                       q = p+strlen(base);
+               } else {
+                       q++;
+               }
+       }
+
+       if (*q && (*argc < maxargs)) glob_expand_one(q, argv, argc, maxargs);
+
+       free(s);
+}
+
+/*******************************************************************
+  convert a string to lower case
+********************************************************************/
+void strlower(char *s)
+{
+       while (*s) {
+               if (isupper(*s)) *s = tolower(*s);
+               s++;
+       }
+}