X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/d7761c14803aea387fec917a6081721b3bf5fb7f..e72b18a9bd9f89847e49e87c1159c74d7bf0fbf3:/exclude.c diff --git a/exclude.c b/exclude.c index ffcd0a76..d5680ea1 100644 --- a/exclude.c +++ b/exclude.c @@ -1,22 +1,23 @@ /* -*- c-file-style: "linux" -*- - - Copyright (C) 1996-2001 by Andrew Tridgell - Copyright (C) 1996 by Paul Mackerras - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ + * + * Copyright (C) 1996-2001 by Andrew Tridgell + * Copyright (C) 1996 by Paul Mackerras + * Copyright (C) 2002 by Martin Pool + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ /* a lot of this stuff was originally derived from GNU tar, although it has now changed so much that it is hard to tell :) */ @@ -30,7 +31,7 @@ extern int delete_mode; static struct exclude_struct **exclude_list; -/* build an exclude structure given a exclude pattern */ +/** Build an exclude structure given a exclude pattern */ static struct exclude_struct *make_exclude(const char *pattern, int include) { struct exclude_struct *ret; @@ -131,11 +132,6 @@ static void report_exclude_result(char const *name, /* If a trailing slash is present to match only directories, * then it is stripped out by make_exclude. So as a special * case we add it back in here. */ - - /* FIXME: At the moment if you don't specify --recursive, this - * seems to give messages like "excluding file - * mbpconfig/.Xresources because of pattern /*""/*", which is - * a bit confusing. See Rusty's gross hack below. */ if (verbose >= 2) rprintf(FINFO, "%s %s %s because of pattern %s%s\n", @@ -224,9 +220,16 @@ struct exclude_struct **make_exclude_list(const char *fname, int fatal, int include) { struct exclude_struct **list=list1; - FILE *f = fopen(fname,"r"); + int fd; char line[MAXPATHLEN]; - if (!f) { + char *eob = line + MAXPATHLEN - 1; + extern int eol_nulls; + + if (strcmp(fname, "-") != 0) + fd = open(fname, O_RDONLY|O_BINARY); + else + fd = 0; + if (fd < 0) { if (fatal) { rsyserr(FERROR, errno, "failed to open %s file %s", @@ -237,18 +240,31 @@ struct exclude_struct **make_exclude_list(const char *fname, return list; } - while (fgets(line,MAXPATHLEN,f)) { - int l = strlen(line); - if (l && line[l-1] == '\n') l--; - line[l] = 0; - if (line[0] && (line[0] != ';') && (line[0] != '#')) { + while (1) { + char ch, *s = line; + int cnt; + while (1) { + if ((cnt = read(fd, &ch, 1)) <= 0) { + if (cnt < 0 && errno == EINTR) + continue; + break; + } + if (eol_nulls? !ch : (ch == '\n' || ch == '\r')) + break; + if (s < eob) + *s++ = ch; + } + *s = '\0'; + if (*line && *line != ';' && *line != '#') { /* Skip lines starting with semicolon or pound. - It probably wouldn't cause any harm to not skip - them but there's no need to save them. */ + * It probably wouldn't cause any harm to not skip + * them but there's no need to save them. */ add_exclude_list(line,&list,include); } + if (cnt <= 0) + break; } - fclose(f); + close(fd); return list; } @@ -267,7 +283,10 @@ void send_exclude_list(int f) extern int remote_version; extern int list_only, recurse; - /* this is a complete hack - blame Rusty */ + /* This is a complete hack - blame Rusty. + * + * FIXME: This pattern shows up in the output of + * report_exclude_result(), which is not ideal. */ if (list_only && !recurse) { add_exclude("/*/*", 0); } @@ -336,7 +355,7 @@ char *get_exclude_tok(char *p) return(NULL); /* Skip over any initial spaces */ - while(isspace(*s)) + while (isspace(* (unsigned char *) s)) s++; /* Are we at the end of the string? */ @@ -349,7 +368,7 @@ char *get_exclude_tok(char *p) s+=2; /* Skip to the next space or the end of the string */ - while(!isspace(*s) && *s!='\0') + while (!isspace(* (unsigned char *) s) && *s != '\0') s++; } else { t=NULL; @@ -388,12 +407,11 @@ void add_include_line(char *p) static char *cvs_ignore_list[] = { - "RCS","SCCS","CVS","CVS.adm","RCSLOG","cvslog.*", - "tags","TAGS",".make.state",".nse_depinfo", - "*~", "#*", ".#*", ",*", "*.old", "*.bak", "*.BAK", "*.orig", + "RCS/", "SCCS/", "CVS/", ".svn/", "CVS.adm", "RCSLOG", "cvslog.*", + "tags", "TAGS", ".make.state", ".nse_depinfo", + "*~", "#*", ".#*", ", *", "*.old", "*.bak", "*.BAK", "*.orig", "*.rej", ".del-*", "*.a", "*.o", "*.obj", "*.so", "*.Z", "*.elc", "*.ln", - "core",NULL}; - + "core", NULL}; void add_cvs_excludes(void)