extern int do_progress;
extern int am_root;
extern int am_server;
+extern int am_daemon;
extern int always_checksum;
extern int module_id;
extern int ignore_errors;
extern int filesfrom_fd;
extern int one_file_system;
-extern int make_backups;
extern int preserve_links;
extern int preserve_hard_links;
extern int preserve_perms;
extern int read_batch;
extern int write_batch;
-extern struct exclude_struct **exclude_list;
-extern struct exclude_struct **server_exclude_list;
-extern struct exclude_struct **local_exclude_list;
+extern struct exclude_list_struct exclude_list;
+extern struct exclude_list_struct server_exclude_list;
+extern struct exclude_list_struct local_exclude_list;
int io_error;
return 0;
}
}
- if (server_exclude_list
- && check_exclude(server_exclude_list, fname, is_dir))
+ if (server_exclude_list.head
+ && check_exclude(&server_exclude_list, fname, is_dir,
+ "server pattern"))
return 1;
if (exclude_level != ALL_EXCLUDES)
return 0;
- if (exclude_list && check_exclude(exclude_list, fname, is_dir))
+ if (exclude_list.head
+ && check_exclude(&exclude_list, fname, is_dir, "pattern"))
return 1;
- if (local_exclude_list
- && check_exclude(local_exclude_list, fname, is_dir))
+ if (local_exclude_list.head
+ && check_exclude(&local_exclude_list, fname, is_dir,
+ "local-cvsignore"))
return 1;
return 0;
}
unsigned short flags;
static time_t modtime;
static mode_t mode;
- static DEV64_T rdev, rdev_high;
- static DEV64_T dev;
+ static dev_t dev, rdev;
+ static uint32 rdev_major;
static uid_t uid;
static gid_t gid;
static char lastname[MAXPATHLEN];
if (!file) {
write_byte(f, 0);
modtime = 0, mode = 0;
- rdev = 0, rdev_high = 0, dev = 0;
+ dev = rdev = makedev(0, 0);
+ rdev_major = 0;
uid = 0, gid = 0;
*lastname = '\0';
return;
if (preserve_devices) {
if (protocol_version < 28) {
if (IS_DEVICE(mode)) {
- if (file->u.rdev == rdev) {
- /* Set both flags to simplify the test
- * when writing the data. */
- flags |= XMIT_SAME_RDEV_pre28
- | XMIT_SAME_HIGH_RDEV;
- } else
+ if (file->u.rdev == rdev)
+ flags |= XMIT_SAME_RDEV_pre28;
+ else
rdev = file->u.rdev;
} else
- rdev = 0;
+ rdev = makedev(0, 0);
} else if (IS_DEVICE(mode)) {
- if ((file->u.rdev & ~0xFF) == rdev_high)
- flags |= XMIT_SAME_HIGH_RDEV;
- else {
- rdev = file->u.rdev;
- rdev_high = rdev & ~0xFF;
- }
+ rdev = file->u.rdev;
+ if ((uint32)major(rdev) == rdev_major)
+ flags |= XMIT_SAME_RDEV_MAJOR;
+ else
+ rdev_major = major(rdev);
+ if ((uint32)minor(rdev) <= 0xFFu)
+ flags |= XMIT_RDEV_MINOR_IS_SMALL;
}
}
if (file->uid == uid)
write_int(f, gid);
}
if (preserve_devices && IS_DEVICE(mode)) {
- /* If XMIT_SAME_HIGH_RDEV is off, XMIT_SAME_RDEV_pre28 is
- * also off. */
- if (!(flags & XMIT_SAME_HIGH_RDEV))
- write_int(f, rdev);
- else if (protocol_version >= 28)
- write_byte(f, rdev);
+ if (protocol_version < 28) {
+ if (!(flags & XMIT_SAME_RDEV_pre28))
+ write_int(f, (int)rdev);
+ } else {
+ if (!(flags & XMIT_SAME_RDEV_MAJOR))
+ write_int(f, major(rdev));
+ if (flags & XMIT_RDEV_MINOR_IS_SMALL)
+ write_byte(f, minor(rdev));
+ else
+ write_int(f, minor(rdev));
+ }
}
#if SUPPORT_LINKS
#if SUPPORT_HARD_LINKS
if (flags & XMIT_HAS_IDEV_DATA) {
- if (protocol_version < 26) {
+ if (protocol_version >= 28) {
+ /* major/minor dev_t and 64-bit ino_t */
+ if (!(flags & XMIT_SAME_DEV)) {
+ write_int(f, major(dev));
+ write_int(f, minor(dev));
+ }
+ write_longint(f, file->F_INODE);
+ } else if (protocol_version < 26) {
/* 32-bit dev_t and ino_t */
write_int(f, dev);
write_int(f, file->F_INODE);
} else {
/* 64-bit dev_t and ino_t */
- if (!(flags & XMIT_SAME_DEV))
- write_longint(f, dev);
+ write_longint(f, dev);
write_longint(f, file->F_INODE);
}
}
{
static time_t modtime;
static mode_t mode;
- static DEV64_T rdev, rdev_high;
- static DEV64_T dev;
+ static dev_t dev, rdev;
+ static uint32 rdev_major;
static uid_t uid;
static gid_t gid;
static char lastname[MAXPATHLEN], *lastdir;
if (!fptr) {
modtime = 0, mode = 0;
- rdev = 0, rdev_high = 0, dev = 0;
+ dev = rdev = makedev(0, 0);
+ rdev_major = 0;
uid = 0, gid = 0;
*lastname = '\0';
return;
if (protocol_version < 28) {
if (IS_DEVICE(mode)) {
if (!(flags & XMIT_SAME_RDEV_pre28))
- rdev = (DEV64_T)read_int(f);
+ rdev = (dev_t)read_int(f);
} else
- rdev = 0;
+ rdev = makedev(0, 0);
} else if (IS_DEVICE(mode)) {
- if (!(flags & XMIT_SAME_HIGH_RDEV)) {
- rdev = (DEV64_T)read_int(f);
- rdev_high = rdev & ~0xFF;
- } else
- rdev = rdev_high | (DEV64_T)read_byte(f);
+ uint32 rdev_minor;
+ if (!(flags & XMIT_SAME_RDEV_MAJOR))
+ rdev_major = read_int(f);
+ if (flags & XMIT_RDEV_MINOR_IS_SMALL)
+ rdev_minor = read_byte(f);
+ else
+ rdev_minor = read_int(f);
+ rdev = makedev(rdev_major, rdev_minor);
}
}
#if SUPPORT_HARD_LINKS
if (preserve_hard_links && protocol_version < 28 && S_ISREG(mode))
flags |= XMIT_HAS_IDEV_DATA;
- if (flags & XMIT_HAS_IDEV_DATA && flist->hlink_pool) {
+ if (flags & XMIT_HAS_IDEV_DATA) {
INO64_T inode;
- file->link_u.idev = pool_talloc(flist->hlink_pool,
- struct idev, 1, "inode_table");
- if (protocol_version < 26) {
- dev = read_int(f);
+ if (protocol_version >= 28) {
+ if (!(flags & XMIT_SAME_DEV)) {
+ uint32 dev_major = read_int(f);
+ uint32 dev_minor = read_int(f);
+ dev = makedev(dev_major, dev_minor);
+ }
+ inode = read_longint(f);
+ } else if (protocol_version < 26) {
+ dev = (dev_t)read_int(f);
inode = read_int(f);
} else {
- if (!(flags & XMIT_SAME_DEV))
- dev = read_longint(f);
+ dev = (dev_t)read_longint(f);
inode = read_longint(f);
}
if (flist->hlink_pool) {
+ file->link_u.idev = pool_talloc(flist->hlink_pool,
+ struct idev, 1, "inode_table");
file->F_INODE = inode;
file->F_DEV = dev;
}
char *basename, *dirname, *bp;
unsigned short flags = 0;
+ if (!flist) /* lastdir isn't valid if flist is NULL */
+ lastdir_len = -1;
if (strlcpy(thisname, fname, sizeof thisname)
>= sizeof thisname - flist_dir_len) {
if (readlink_stat(thisname, &st, linkname) != 0) {
int save_errno = errno;
- if (errno == ENOENT && exclude_level != NO_EXCLUDES) {
+ if (errno == ENOENT) {
+ enum logcode c = am_daemon && protocol_version < 28
+ ? FERROR : FINFO;
/* either symlink pointing nowhere or file that
* was removed during rsync run; see if excluded
* before reporting an error */
- if (check_exclude_file(thisname, 0, exclude_level)) {
+ if (exclude_level != NO_EXCLUDES
+ && check_exclude_file(thisname, 0, exclude_level)) {
/* file is excluded anyway, ignore silently */
return NULL;
}
+ io_error |= IOERR_VANISHED;
+ rprintf(c, "file has vanished: %s\n",
+ full_fname(thisname));
+ }
+ else {
+ io_error |= IOERR_GENERAL;
+ rprintf(FERROR, "readlink %s failed: %s\n",
+ full_fname(thisname), strerror(save_errno));
}
- io_error |= IOERR_GENERAL;
- rprintf(FERROR, "readlink %s failed: %s\n",
- full_fname(thisname), strerror(save_errno));
return NULL;
}
if (recursive && S_ISDIR(file->mode)
&& !(file->flags & FLAG_MOUNT_POINT)) {
- struct exclude_struct **last_exclude_list = local_exclude_list;
+ struct exclude_list_struct last_list = local_exclude_list;
+ memset(&local_exclude_list, 0, sizeof local_exclude_list);
send_directory(f, flist, f_name_to(file, fbuf));
- local_exclude_list = last_exclude_list;
- return;
+ free_exclude_list(&local_exclude_list);
+ local_exclude_list = last_list;
}
}
offset++;
}
- local_exclude_list = NULL;
-
if (cvs_exclude) {
if (strlcpy(p, ".cvsignore", MAXPATHLEN - offset)
- < MAXPATHLEN - offset)
- add_exclude_file(&local_exclude_list,fname,MISSING_OK,ADD_EXCLUDE);
- else {
+ < MAXPATHLEN - offset) {
+ add_exclude_file(&local_exclude_list, fname,
+ XFLG_WORD_SPLIT | XFLG_NO_PREFIXES);
+ } else {
io_error |= IOERR_GENERAL;
rprintf(FINFO,
"cannot cvs-exclude in long-named directory %s\n",
dir, errno, strerror(errno));
}
- if (local_exclude_list)
- free_exclude_list(&local_exclude_list); /* Zeros pointer too */
-
closedir(d);
}