extern int dry_run;
extern int module_id;
extern int modify_window;
+extern int relative_paths;
extern char *partial_dir;
extern struct filter_list_struct server_filter_list;
-int set_modtime(char *fname, time_t modtime)
+int set_modtime(char *fname, time_t modtime, mode_t mode)
{
+#if !defined HAVE_LUTIMES || !defined HAVE_UTIMES
+ if (S_ISLNK(mode))
+ return 1;
+#endif
+
if (verbose > 2) {
rprintf(FINFO, "set modtime of %s to (%ld) %s",
safe_fname(fname), (long)modtime,
return 0;
{
-#ifdef HAVE_UTIMBUF
+#ifdef HAVE_UTIMES
+ struct timeval t[2];
+ t[0].tv_sec = time(NULL);
+ t[0].tv_usec = 0;
+ t[1].tv_sec = modtime;
+ t[1].tv_usec = 0;
+# ifdef HAVE_LUTIMES
+ if (S_ISLNK(mode))
+ return lutimes(fname, t);
+# endif
+ return utimes(fname, t);
+#elif defined HAVE_UTIMBUF
struct utimbuf tbuf;
tbuf.actime = time(NULL);
tbuf.modtime = modtime;
t[1] = modtime;
return utime(fname,t);
#else
- struct timeval t[2];
- t[0].tv_sec = time(NULL);
- t[0].tv_usec = 0;
- t[1].tv_sec = modtime;
- t[1].tv_usec = 0;
- return utimes(fname,t);
+#error No file-time-modification routine found!
#endif
}
}
filter_server_path(s);
#else
glob_t globbuf;
- int i;
if (maxargs <= argc)
return;
if (globbuf.gl_pathc == 0)
argv[argc++] = s;
else {
- int j = globbuf.gl_pathc;
+ int i;
free(s);
- for (i = 0; i < j; i++) {
+ for (i = 0; i < (int)globbuf.gl_pathc; i++) {
if (!(argv[argc++] = strdup(globbuf.gl_pathv[i])))
out_of_memory("glob_expand_one");
}
char *sanitize_path(char *dest, const char *p, const char *rootdir, int depth)
{
char *start, *sanp;
- int rlen = 0;
+ int rlen = 0, leave_one_dotdir = relative_paths;
if (dest != p) {
int plen = strlen(p);
* always be left pointing after a slash
*/
if (*p == '.' && (p[1] == '/' || p[1] == '\0')) {
- /* skip "." component */
- p++;
- continue;
+ if (leave_one_dotdir && p[1])
+ leave_one_dotdir = 0;
+ else {
+ /* skip "." component */
+ p++;
+ continue;
+ }
}
if (*p == '.' && p[1] == '.' && (p[2] == '/' || p[2] == '\0')) {
/* ".." component followed by slash or end */