static int lull_mod;
static int dir_tweaking;
static int need_retouch_dir_times;
+static int need_retouch_dir_perms;
static const char *solo_file = NULL;
/* For calling delete_item() and delete_dir_contents(). */
dirlist = get_dirlist(fname, dlen, 0);
ret = non_perishable_cnt ? DR_NOT_EMPTY : DR_SUCCESS;
- if (!dirlist->count)
+ if (!dirlist->used)
goto done;
if (!(flags & DEL_RECURSE)) {
/* We do our own recursion, so make delete_item() non-recursive. */
flags = (flags & ~DEL_RECURSE) | DEL_DIR_IS_EMPTY;
- for (j = dirlist->count; j--; ) {
+ for (j = dirlist->used; j--; ) {
struct file_struct *fp = dirlist->files[j];
if (fp->flags & FLAG_MOUNT_DIR) {
/* If an item in dirlist is not found in flist, delete it
* from the filesystem. */
- for (i = dirlist->count; i--; ) {
+ for (i = dirlist->used; i--; ) {
struct file_struct *fp = dirlist->files[i];
if (!F_IS_ACTIVE(fp))
continue;
if (dry_run > 1 || list_only)
return;
- for (j = 0; j < cur_flist->count; j++) {
+ for (j = 0; j < cur_flist->used; j++) {
struct file_struct *file = cur_flist->sorted[j];
if (!(file->flags & FLAG_XFER_DIR))
fname_len = strlen(fname);
fname_suf = find_filename_suffix(fname, fname_len, &fname_suf_len);
- for (j = 0; j < dirlist->count; j++) {
+ for (j = 0; j < dirlist->used; j++) {
struct file_struct *fp = dirlist->files[j];
const char *suf, *name;
int len, suf_len;
if (set_file_attrs(fname, file, real_ret ? NULL : &real_sx, NULL, 0)
&& verbose && code != FNONE && f_out != -1)
rprintf(code, "%s/\n", fname);
+
+ /* We need to ensure that the dirs in the transfer have writable
+ * permissions during the time we are putting files within them.
+ * This is then fixed after the transfer is done. */
+#ifdef HAVE_CHMOD
+ if (!am_root && !(file->mode & S_IWUSR) && dir_tweaking) {
+ mode_t mode = file->mode | S_IWUSR;
+ if (do_chmod(fname, mode) < 0) {
+ rsyserr(FERROR, errno,
+ "failed to modify permissions on %s",
+ full_fname(fname));
+ }
+ need_retouch_dir_perms = 1;
+ }
+#endif
+
if (real_ret != 0 && one_file_system)
real_sx.st.st_dev = filesystem_dev;
if (inc_recurse) {
if (ndx < 0) {
start = 0;
- end = flist->count - 1;
+ end = flist->used - 1;
} else
start = end = ndx;
char fbuf[MAXPATHLEN];
int itemizing;
enum logcode code;
- int need_retouch_dir_perms = 0;
int save_do_progress = do_progress;
if (protocol_version >= 29) {
if (verbose > 2)
rprintf(FINFO, "generator starting pid=%ld\n", (long)getpid());
- if (delete_before && !solo_file && cur_flist->count > 0)
+ if (delete_before && !solo_file && cur_flist->used > 0)
do_delete_pass();
if (delete_during == 2) {
deldelay_size = BIGPATHBUFLEN * 4;
dflt_perms = (ACCESSPERMS & ~orig_umask);
do {
- if (inc_recurse && delete_during && cur_flist->ndx_start) {
+ if (inc_recurse && cur_flist->ndx_start) {
struct file_struct *fp = dir_flist->files[cur_flist->parent_ndx];
- if (BITS_SETnUNSET(fp->flags, FLAG_XFER_DIR, FLAG_MISSING_DIR)) {
- dev_t dirdev;
- if (one_file_system) {
- uint32 *devp = F_DIRDEV_P(fp);
- dirdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp));
- } else
- dirdev = MAKEDEV(0, 0);
- delete_in_dir(f_name(fp, fbuf), fp, &dirdev);
+ f_name(fp, fbuf);
+ ndx = cur_flist->ndx_start - 1;
+ recv_generator(fbuf, fp, ndx, itemizing, code, f_out);
+ if (delete_during) {
+ if (BITS_SETnUNSET(fp->flags, FLAG_XFER_DIR, FLAG_MISSING_DIR)) {
+ dev_t dirdev;
+ if (one_file_system) {
+ uint32 *devp = F_DIRDEV_P(fp);
+ dirdev = MAKEDEV(DEV_MAJOR(devp), DEV_MINOR(devp));
+ } else
+ dirdev = MAKEDEV(0, 0);
+ delete_in_dir(f_name(fp, fbuf), fp, &dirdev);
+ }
}
}
for (i = cur_flist->low; i <= cur_flist->high; i++) {
if (!F_IS_ACTIVE(file))
continue;
+ if (inc_recurse && S_ISDIR(file->mode)) {
+ /* Regular dirs are at the end, so we can stop. */
+ if (F_DEPTH(file))
+ break;
+ /* A dot-dir is at the start, so just skip it. */
+ continue;
+ }
+
#ifdef ICONV_OPTION
if (ic_ndx)
ndx = F_NDX(file);
f_name(file, fbuf);
recv_generator(fbuf, file, ndx, itemizing, code, f_out);
- /* We need to ensure that any dirs we create have
- * writeable permissions during the time we are putting
- * files within them. This is then fixed after the
- * transfer is done. */
-#ifdef HAVE_CHMOD
- if (!am_root && S_ISDIR(file->mode)
- && !(file->mode & S_IWUSR) && dir_tweaking) {
- mode_t mode = file->mode | S_IWUSR;
- const char *fname = solo_file ? solo_file : fbuf;
- if (do_chmod(fname, mode) < 0) {
- rsyserr(FERROR, errno,
- "failed to modify permissions on %s",
- full_fname(fname));
- }
- need_retouch_dir_perms = 1;
- }
-#endif
-
check_for_finished_files(itemizing, code, 0);
if (allowed_lull && !(i % lull_mod))