Commit 087bf010 authored by Andrew Tridgell's avatar Andrew Tridgell

allow the specification of multiple filenames (with or without

wildcards) to a rsync server. For example you can do:

rsync -avz samba::'ftp/pub/samba/README ftp/pub/samba/*.gz' .
parent f240c069
......@@ -212,7 +212,7 @@ static int rsync_module(int fd, int i)
}
if (start_glob) {
glob_expand(argv, &argc, MAX_ARGS);
glob_expand(name, argv, &argc, MAX_ARGS);
} else {
argc++;
}
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment