From 651443a7ffd889f6c2092587b940ed369c9e99d0 Mon Sep 17 00:00:00 2001 From: David Dykstra Date: Fri, 12 Mar 1999 21:42:51 +0000 Subject: [PATCH] Allow + and - in the "include" and "exclude" directives in rsyncd.conf. Patch submitted by Damian A Ivereigh --- exclude.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++-- rsyncd.conf.yo | 20 +++++++++++-------- 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/exclude.c b/exclude.c index ae9f8b17..444a2b48 100644 --- a/exclude.c +++ b/exclude.c @@ -303,14 +303,62 @@ void recv_exclude_list(int f) } } +/* Get the next include/exclude arg from the string. It works in a similar way +** to strtok - initially an arg is sent over, from then on NULL. This +** routine takes into account any +/- in the strings and does not +** consider the space following it as a delimeter. +*/ +char *get_exclude_tok(char *p) +{ + static char *s; + static int more; + char *t; + + if (p) { + s=p; + if (*p) + more=1; + } + + if (!more) + return(NULL); + /* Skip over any initial spaces */ + while(isspace(*s)) + s++; + + /* Are we at the end of the string? */ + if (*s) { + /* remember the beginning of the token */ + t=s; + + /* Is this a '+' or '-' followed by a space (not whitespace)? */ + if ((*s=='+' || *s=='-') && *(s+1)==' ') + s+=2; + + /* Skip to the next space or the end of the string */ + while(!isspace(*s) && *s!='\0') + s++; + } else { + t=NULL; + } + + /* Have we reached the end of the string? */ + if (*s) + *s++='\0'; + else + more=0; + return(t); +} + + void add_exclude_line(char *p) { char *tok; if (!p || !*p) return; p = strdup(p); if (!p) out_of_memory("add_exclude_line"); - for (tok=strtok(p," "); tok; tok=strtok(NULL," ")) + for (tok=get_exclude_tok(p); tok; tok=get_exclude_tok(NULL)) add_exclude(tok, 0); free(p); } @@ -321,7 +369,7 @@ void add_include_line(char *p) if (!p || !*p) return; p = strdup(p); if (!p) out_of_memory("add_include_line"); - for (tok=strtok(p," "); tok; tok=strtok(NULL," ")) + for (tok=get_exclude_tok(p); tok; tok=get_exclude_tok(NULL)) add_exclude(tok, 1); free(p); } diff --git a/rsyncd.conf.yo b/rsyncd.conf.yo index 5634d9e7..6931960e 100644 --- a/rsyncd.conf.yo +++ b/rsyncd.conf.yo @@ -1,5 +1,5 @@ mailto(rsync-bugs@samba.org) -manpage(rsyncd.conf)(5)(9 Feb 1999)()() +manpage(rsyncd.conf)(5)(12 Feb 1999)()() manpagename(rsyncd.conf)(configuration file for rsync server) manpagesynopsis() @@ -163,9 +163,12 @@ was run as root. This complements the "uid" option. The default is the group "nobody". dit(bf(exclude)) The "exclude" option allows you to specify a space -separated list of patterns to add to the exclude list. This is -equivalent to the client specifying these patterns with the --exclude -option. Note that this option is not designed with strong security in +separated list of patterns to add to the exclude list. This is equivalent +to the client specifying these patterns with the --exclude option. Only +one "exclude" option may be specified, but you can use "-" and "+" before +patterns to specify exclude/include. + +Note that this option is not designed with strong security in mind, it is quite possible that a client may find a way to bypass this exclude list. If you want to absolutely ensure that certain files cannot be accessed then use the uid/gid options in combination with @@ -180,11 +183,12 @@ option above. dit(bf(include)) The "include" option allows you to specify a space separated list of patterns which rsync should not exclude. This is equivalent to the client specifying these patterns with the --include -option. This is useful as it allows you to build up quite complex -exclude/include rules. +option. This is useful as it allows you to build up quite complex +exclude/include rules. Only one "include" option may be specified, but you +can use "+" and "-" before patterns to switch include/exclude. -See the section of exclude patterns for information on the syntax of -this option. +See the section of exclude patterns in the rsync man page for information +on the syntax of this option. dit(bf(include from)) The "include from" option specifies a filename on the server that contains include patterns, one per line. This is -- 2.34.1