extern int module_id;
extern int modify_window;
extern char *partial_dir;
-extern struct exclude_list_struct server_exclude_list;
+extern struct filter_list_struct server_filter_list;
int sanitize_paths = 0;
{
int ret;
-#if HAVE_SOCKETPAIR
+#ifdef HAVE_SOCKETPAIR
ret = socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
#else
ret = pipe(fd);
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789"
",.-_=+@/") != strlen(*cmd)) {
- rprintf(FINFO, "\"%s\" ", *cmd);
+ rprintf(FINFO, "\"%s\" ", safe_fname(*cmd));
} else {
- rprintf(FINFO, "%s ", *cmd);
+ rprintf(FINFO, "%s ", safe_fname(*cmd));
}
}
rprintf(FINFO, "\n");
int set_modtime(char *fname, time_t modtime)
{
- if (dry_run)
- return 0;
-
if (verbose > 2) {
rprintf(FINFO, "set modtime of %s to (%ld) %s",
- fname, (long)modtime,
+ safe_fname(fname), (long)modtime,
asctime(localtime(&modtime)));
}
+ if (dry_run)
+ return 0;
+
{
#ifdef HAVE_UTIMBUF
struct utimbuf tbuf;
tbuf.actime = time(NULL);
tbuf.modtime = modtime;
return utime(fname,&tbuf);
-#elif defined(HAVE_UTIME)
+#elif defined HAVE_UTIME
time_t t[2];
t[0] = time(NULL);
t[1] = modtime;
if (verbose > 0) {
rprintf(FINFO,"renaming %s to %s because of text busy\n",
- fname, path);
+ safe_fname(fname), safe_fname(path));
}
/* maybe we should return rename()'s exit status? Nah. */
return fcntl(fd,F_SETLK,&lock) == 0;
}
-static int exclude_server_path(char *arg)
+static int filter_server_path(char *arg)
{
char *s;
- if (server_exclude_list.head) {
+ if (server_filter_list.head) {
for (s = arg; (s = strchr(s, '/')) != NULL; ) {
*s = '\0';
- if (check_exclude(&server_exclude_list, arg, 1) < 0) {
+ if (check_filter(&server_filter_list, arg, 1) < 0) {
/* We must leave arg truncated! */
return 1;
}
char **argv = *argv_ptr;
int argc = *argc_ptr;
int maxargs = *maxargs_ptr;
-#if !(defined(HAVE_GLOB) && defined(HAVE_GLOB_H))
+#if !defined HAVE_GLOB || !defined HAVE_GLOB_H
if (argc == maxargs) {
maxargs += MAX_ARGS;
if (!(argv = realloc_array(argv, char *, maxargs)))
if (!*s)
s = ".";
s = argv[argc++] = strdup(s);
- exclude_server_path(s);
+ filter_server_path(s);
#else
glob_t globbuf;
int i;
s = strdup(s);
memset(&globbuf, 0, sizeof globbuf);
- if (!exclude_server_path(s))
+ if (!filter_server_path(s))
glob(s, 0, NULL, &globbuf);
if (MAX((int)globbuf.gl_pathc, 1) > maxargs - argc) {
maxargs += globbuf.gl_pathc + MAX_ARGS;
**/
const char *safe_fname(const char *fname)
{
- static char fbuf1[MAXPATHLEN], fbuf2[MAXPATHLEN];
- static char *fbuf = fbuf2;
- char *nl = strchr(fname, '\n');
-
- if (!nl)
- return fname;
-
- fbuf = fbuf == fbuf1 ? fbuf2 : fbuf1;
- strlcpy(fbuf, fname, MAXPATHLEN);
- nl = fbuf + (nl - (char *)fname);
- do {
- *nl = '?';
- } while ((nl = strchr(nl+1, '\n')) != NULL);
+#define MAX_SAFE_NAMES 4
+ static char fbuf[MAX_SAFE_NAMES][MAXPATHLEN*2];
+ static int ndx = 0;
+ int limit = sizeof fbuf / MAX_SAFE_NAMES - 1;
+ char *t;
+
+ ndx = (ndx + 1) % MAX_SAFE_NAMES;
+ for (t = fbuf[ndx]; *fname; fname++) {
+ if (!isprint(*fname))
+ *t++ = '?';
+ else
+ *t++ = *fname;
+ if (--limit == 0)
+ break;
+ }
+ *t = '\0';
- return fbuf;
+ return fbuf[ndx];
}
/**
fn = fname;
if ((int)pathjoin(t, sz, partial_dir, fn) >= sz)
return NULL;
- if (server_exclude_list.head
- && check_exclude(&server_exclude_list, partial_fname, 0) < 0)
- return NULL;
+ if (server_filter_list.head) {
+ static int len;
+ if (!len)
+ len = strlen(partial_dir);
+ t[len] = '\0';
+ if (check_filter(&server_filter_list, partial_fname, 1) < 0)
+ return NULL;
+ t[len] = '/';
+ if (check_filter(&server_filter_list, partial_fname, 0) < 0)
+ return NULL;
+ }
return partial_fname;
}
dir = partial_fname;
if (create) {
STRUCT_STAT st;
-#if SUPPORT_LINKS
int statret = do_lstat(dir, &st);
-#else
- int statret = do_stat(dir, &st);
-#endif
if (statret == 0 && !S_ISDIR(st.st_mode)) {
if (do_unlink(dir) < 0)
return 0;