X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/5a96ee059968da5fd2ba4fbd6321bb3ee76b3c9d..087bf010d2cd89848181e49b4ecdfd29a66353e9:/util.c?ds=sidebyside diff --git a/util.c b/util.c index ed8d34e2..1fdeee6f 100644 --- a/util.c +++ b/util.c @@ -506,15 +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; + argv[*argc] = strdup(s); + memset(&globbuf, 0, sizeof(globbuf)); glob(argv[*argc], 0, NULL, &globbuf); if (globbuf.gl_pathc == 0) { @@ -532,6 +535,32 @@ void glob_expand(char **argv, int *argc, int maxargs) #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