extern int am_server;
extern int am_daemon;
extern int am_sender;
+extern int am_generator;
extern int inc_recurse;
extern int do_progress;
extern int always_checksum;
rprintf(FINFO,"copying unsafe symlink \"%s\" -> \"%s\"\n",
path, linkbuf);
}
- return do_stat(path, stp);
+ return x_stat(path, stp, NULL);
}
}
return 0;
#else
- return do_stat(path, stp);
+ return x_stat(path, stp, NULL);
#endif
}
{
#ifdef SUPPORT_LINKS
if (copy_links)
- return do_stat(path, stp);
- if (do_lstat(path, stp) < 0)
+ return x_stat(path, stp, NULL);
+ if (x_lstat(path, stp, NULL) < 0)
return -1;
if (follow_dirlinks && S_ISLNK(stp->st_mode)) {
STRUCT_STAT st;
- if (do_stat(path, &st) == 0 && S_ISDIR(st.st_mode))
+ if (x_stat(path, &st, NULL) == 0 && S_ISDIR(st.st_mode))
*stp = st;
}
return 0;
#else
- return do_stat(path, stp);
+ return x_stat(path, stp, NULL);
#endif
}
return 0;
}
-static int to_wire_mode(mode_t mode)
-{
-#ifdef SUPPORT_LINKS
-#if _S_IFLNK != 0120000
- if (S_ISLNK(mode))
- return (mode & ~(_S_IFMT)) | 0120000;
-#endif
-#endif
- return mode;
-}
-
-static mode_t from_wire_mode(int mode)
-{
-#if _S_IFLNK != 0120000
- if ((mode & (_S_IFMT)) == 0120000)
- return (mode & ~(_S_IFMT)) | _S_IFLNK;
-#endif
- return mode;
-}
-
static void send_directory(int f, struct file_list *flist, int ndx,
char *fbuf, int len, int flags);
static struct file_struct *recv_file_entry(struct file_list *flist,
int flags, int f)
{
- static time_t modtime;
+ static int64 modtime;
static mode_t mode;
static int64 dev;
static dev_t rdev;
file_length = read_varlong30(f, 3);
if (!(flags & XMIT_SAME_TIME)) {
- if (protocol_version >= 30)
- modtime = (time_t)read_varlong(f, 4);
- else
- modtime = (time_t)read_int(f);
+ if (protocol_version >= 30) {
+ modtime = read_varlong(f, 4);
+#if SIZEOF_TIME_T < SIZEOF_INT64
+ if ((modtime > INT_MAX || modtime < INT_MIN) && !am_generator) {
+ rprintf(FERROR,
+ "Time value of %s truncated on receiver.\n",
+ lastname);
+ }
+#endif
+ } else
+ modtime = read_int(f);
}
if (!(flags & XMIT_SAME_MODE))
mode = from_wire_mode(read_int(f));
if (flags & XMIT_HLINKED)
file->flags |= FLAG_HLINKED;
#endif
- file->modtime = modtime;
+ file->modtime = (time_t)modtime;
file->len32 = (uint32)file_length;
if (file_length > 0xFFFFFFFFu && S_ISREG(mode)) {
file->flags |= FLAG_LENGTH64;
if (save_errno == ENOENT) {
#ifdef SUPPORT_LINKS
/* Avoid "vanished" error if symlink points nowhere. */
- if (copy_links && do_lstat(thisname, &st) == 0
+ if (copy_links && x_lstat(thisname, &st, NULL) == 0
&& S_ISLNK(st.st_mode)) {
io_error |= IOERR_GENERAL;
rprintf(FERROR, "symlink has no referent: %s\n",
int save_mode = file->mode;
file->mode = S_IFDIR; /* Find a directory with our name. */
if (flist_find(dir_flist, file) >= 0
- && do_stat(thisname, &st2) == 0 && S_ISDIR(st2.st_mode)) {
+ && x_stat(thisname, &st2, NULL) == 0 && S_ISDIR(st2.st_mode)) {
file->modtime = st2.st_mtime;
file->len32 = 0;
file->mode = st2.st_mode;
struct file_list *send_file_list(int f, int argc, char *argv[])
{
- int len;
+ static const char *lastdir;
+ static int lastdir_len = -1;
+ int len, dirlen;
STRUCT_STAT st;
char *p, *dir;
char lastpath[MAXPATHLEN] = "";
fn = ".";
}
- if (dir && *dir) {
- static const char *lastdir;
- static int lastdir_len = -1;
- int len = strlen(dir);
-
- if (len != lastdir_len || memcmp(lastdir, dir, len) != 0) {
- if (!push_flist_dir(strdup(dir), len))
- goto push_error;
- lastdir = flist_dir;
- lastdir_len = flist_dir_len;
- } else if (!push_flist_dir(lastdir, lastdir_len)) {
- push_error:
- io_error |= IOERR_GENERAL;
- rsyserr(FERROR, errno, "push_dir %s failed in %s",
- full_fname(dir), curr_dir);
- continue;
- }
+ dirlen = dir ? strlen(dir) : 0;
+ if (dirlen != lastdir_len || memcmp(lastdir, dir, dirlen) != 0) {
+ if (!push_flist_dir(dir ? strdup(dir) : NULL, dirlen))
+ goto push_error;
+ lastdir = flist_dir;
+ lastdir_len = flist_dir_len;
+ } else if (!push_flist_dir(lastdir, lastdir_len)) {
+ push_error:
+ io_error |= IOERR_GENERAL;
+ rsyserr(FERROR, errno, "push_dir %s failed in %s",
+ full_fname(dir), curr_dir);
+ continue;
}
if (fn != fbuf)