2 Copyright (C) Andrew Tridgell 1996
3 Copyright (C) Paul Mackerras 1996
4 Copyright (C) 2001, 2002 by Martin Pool <mbp@samba.org>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 * Generate and receive file lists
24 * @sa http://lists.samba.org/pipermail/rsync/2000-June/002351.html
36 extern int do_progress
;
37 extern int always_checksum
;
39 extern int ignore_errors
;
40 extern int numeric_ids
;
43 extern int filesfrom_fd
;
44 extern int one_file_system
;
45 extern int copy_dirlinks
;
46 extern int keep_dirlinks
;
47 extern int preserve_links
;
48 extern int preserve_hard_links
;
49 extern int preserve_devices
;
50 extern int preserve_specials
;
51 extern int preserve_uid
;
52 extern int preserve_gid
;
53 extern int relative_paths
;
54 extern int implied_dirs
;
55 extern int prune_empty_dirs
;
56 extern int copy_links
;
57 extern int copy_unsafe_links
;
58 extern int protocol_version
;
59 extern int sanitize_paths
;
60 extern const char *io_write_phase
;
61 extern struct stats stats
;
62 extern struct file_list
*the_file_list
;
64 extern char curr_dir
[MAXPATHLEN
];
66 extern struct chmod_mode_struct
*chmod_modes
;
68 extern struct filter_list_struct filter_list
;
69 extern struct filter_list_struct server_filter_list
;
73 dev_t filesystem_dev
; /* used to implement -x */
74 unsigned int file_struct_len
;
76 static char empty_sum
[MD4_SUM_LENGTH
];
77 static int flist_count_offset
;
79 static void clean_flist(struct file_list
*flist
, int strip_root
, int no_dups
);
80 static void output_flist(struct file_list
*flist
);
86 /* Figure out how big the file_struct is without trailing padding */
87 file_struct_len
= offsetof(struct file_struct
, flags
) + sizeof f
.flags
;
88 checksum_len
= protocol_version
< 21 ? 2 : MD4_SUM_LENGTH
;
91 static int show_filelist_p(void)
93 return verbose
&& xfer_dirs
&& !am_server
;
96 static void start_filelist_progress(char *kind
)
98 rprintf(FINFO
, "%s ... ", kind
);
99 if (verbose
> 1 || do_progress
)
100 rprintf(FINFO
, "\n");
104 static void emit_filelist_progress(int count
)
106 rprintf(FINFO
, " %d files...\r", count
);
109 static void maybe_emit_filelist_progress(int count
)
111 if (do_progress
&& show_filelist_p() && (count
% 100) == 0)
112 emit_filelist_progress(count
);
115 static void finish_filelist_progress(const struct file_list
*flist
)
118 /* This overwrites the progress line */
119 rprintf(FINFO
, "%d file%sto consider\n",
120 flist
->count
, flist
->count
== 1 ? " " : "s ");
122 rprintf(FINFO
, "done\n");
125 void show_flist_stats(void)
130 static void list_file_entry(struct file_struct
*f
)
132 char permbuf
[PERMSTRING_SIZE
];
135 /* this can happen if duplicate names were removed */
139 permstring(permbuf
, f
->mode
);
142 if (preserve_links
&& S_ISLNK(f
->mode
)) {
143 rprintf(FINFO
, "%s %11.0f %s %s -> %s\n",
145 (double)f
->length
, timestring(f
->modtime
),
146 f_name(f
, NULL
), f
->u
.link
);
150 rprintf(FINFO
, "%s %11.0f %s %s\n",
152 (double)f
->length
, timestring(f
->modtime
),
158 * Stat either a symlink or its referent, depending on the settings of
159 * copy_links, copy_unsafe_links, etc.
161 * @retval -1 on error
163 * @retval 0 for success
165 * @post If @p path is a symlink, then @p linkbuf (of size @c
166 * MAXPATHLEN) contains the symlink target.
168 * @post @p buffer contains information about the link or the
169 * referrent as appropriate, if they exist.
171 static int readlink_stat(const char *path
, STRUCT_STAT
*buffer
, char *linkbuf
)
175 return do_stat(path
, buffer
);
176 if (link_stat(path
, buffer
, copy_dirlinks
) < 0)
178 if (S_ISLNK(buffer
->st_mode
)) {
179 int l
= readlink((char *)path
, linkbuf
, MAXPATHLEN
- 1);
183 if (copy_unsafe_links
&& unsafe_symlink(linkbuf
, path
)) {
185 rprintf(FINFO
,"copying unsafe symlink \"%s\" -> \"%s\"\n",
188 return do_stat(path
, buffer
);
193 return do_stat(path
, buffer
);
197 int link_stat(const char *path
, STRUCT_STAT
*buffer
, int follow_dirlinks
)
201 return do_stat(path
, buffer
);
202 if (do_lstat(path
, buffer
) < 0)
204 if (follow_dirlinks
&& S_ISLNK(buffer
->st_mode
)) {
206 if (do_stat(path
, &st
) == 0 && S_ISDIR(st
.st_mode
))
211 return do_stat(path
, buffer
);
215 /* This function is used to check if a file should be included/excluded
216 * from the list of files based on its name and type etc. The value of
217 * filter_level is set to either SERVER_FILTERS or ALL_FILTERS. */
218 static int is_excluded(char *fname
, int is_dir
, int filter_level
)
220 #if 0 /* This currently never happens, so avoid a useless compare. */
221 if (filter_level
== NO_FILTERS
)
225 /* never exclude '.', even if somebody does --exclude '*' */
226 if (fname
[0] == '.' && !fname
[1])
228 /* Handle the -R version of the '.' dir. */
229 if (fname
[0] == '/') {
230 int len
= strlen(fname
);
231 if (fname
[len
-1] == '.' && fname
[len
-2] == '/')
235 if (server_filter_list
.head
236 && check_filter(&server_filter_list
, fname
, is_dir
) < 0)
238 if (filter_level
!= ALL_FILTERS
)
241 && check_filter(&filter_list
, fname
, is_dir
) < 0)
246 static int to_wire_mode(mode_t mode
)
249 if (S_ISLNK(mode
) && (_S_IFLNK
!= 0120000))
250 return (mode
& ~(_S_IFMT
)) | 0120000;
255 static mode_t
from_wire_mode(int mode
)
257 if ((mode
& (_S_IFMT
)) == 0120000 && (_S_IFLNK
!= 0120000))
258 return (mode
& ~(_S_IFMT
)) | _S_IFLNK
;
262 static void send_directory(int f
, struct file_list
*flist
,
263 char *fbuf
, int len
);
265 static char *flist_dir
;
266 static int flist_dir_len
;
270 * Make sure @p flist is big enough to hold at least @p flist->count
273 void flist_expand(struct file_list
*flist
)
275 struct file_struct
**new_ptr
;
277 if (flist
->count
< flist
->malloced
)
280 if (flist
->malloced
< FLIST_START
)
281 flist
->malloced
= FLIST_START
;
282 else if (flist
->malloced
>= FLIST_LINEAR
)
283 flist
->malloced
+= FLIST_LINEAR
;
285 flist
->malloced
*= 2;
288 * In case count jumped or we are starting the list
289 * with a known size just set it.
291 if (flist
->malloced
< flist
->count
)
292 flist
->malloced
= flist
->count
;
294 new_ptr
= realloc_array(flist
->files
, struct file_struct
*,
297 if (verbose
>= 2 && flist
->malloced
!= FLIST_START
) {
298 rprintf(FINFO
, "[%s] expand file_list to %.0f bytes, did%s move\n",
300 (double)sizeof flist
->files
[0] * flist
->malloced
,
301 (new_ptr
== flist
->files
) ? " not" : "");
304 flist
->files
= new_ptr
;
307 out_of_memory("flist_expand");
310 static void send_file_entry(struct file_struct
*file
, int f
)
312 unsigned short flags
;
313 static time_t modtime
;
317 static uint32 rdev_major
;
320 static char lastname
[MAXPATHLEN
];
321 char fname
[MAXPATHLEN
];
329 modtime
= 0, mode
= 0;
330 dev
= 0, rdev
= makedev(0, 0);
337 io_write_phase
= "send_file_entry";
341 flags
= file
->flags
& XMIT_TOP_DIR
;
343 if (file
->mode
== mode
)
344 flags
|= XMIT_SAME_MODE
;
347 if ((preserve_devices
&& IS_DEVICE(mode
))
348 || (preserve_specials
&& IS_SPECIAL(mode
))) {
349 if (protocol_version
< 28) {
350 if (file
->u
.rdev
== rdev
)
351 flags
|= XMIT_SAME_RDEV_pre28
;
356 if ((uint32
)major(rdev
) == rdev_major
)
357 flags
|= XMIT_SAME_RDEV_MAJOR
;
359 rdev_major
= major(rdev
);
360 if ((uint32
)minor(rdev
) <= 0xFFu
)
361 flags
|= XMIT_RDEV_MINOR_IS_SMALL
;
363 } else if (protocol_version
< 28)
364 rdev
= makedev(0, 0);
365 if (file
->uid
== uid
)
366 flags
|= XMIT_SAME_UID
;
369 if (file
->gid
== gid
)
370 flags
|= XMIT_SAME_GID
;
373 if (file
->modtime
== modtime
)
374 flags
|= XMIT_SAME_TIME
;
376 modtime
= file
->modtime
;
378 #ifdef SUPPORT_HARD_LINKS
379 if (file
->link_u
.idev
) {
380 if (file
->F_DEV
== dev
) {
381 if (protocol_version
>= 28)
382 flags
|= XMIT_SAME_DEV
;
385 flags
|= XMIT_HAS_IDEV_DATA
;
390 lastname
[l1
] && (fname
[l1
] == lastname
[l1
]) && (l1
< 255);
392 l2
= strlen(fname
+l1
);
395 flags
|= XMIT_SAME_NAME
;
397 flags
|= XMIT_LONG_NAME
;
399 /* We must make sure we don't send a zero flag byte or the
400 * other end will terminate the flist transfer. Note that
401 * the use of XMIT_TOP_DIR on a non-dir has no meaning, so
402 * it's harmless way to add a bit to the first flag byte. */
403 if (protocol_version
>= 28) {
404 if (!flags
&& !S_ISDIR(mode
))
405 flags
|= XMIT_TOP_DIR
;
406 if ((flags
& 0xFF00) || !flags
) {
407 flags
|= XMIT_EXTENDED_FLAGS
;
408 write_byte(f
, flags
);
409 write_byte(f
, flags
>> 8);
411 write_byte(f
, flags
);
414 flags
|= S_ISDIR(mode
) ? XMIT_LONG_NAME
: XMIT_TOP_DIR
;
415 write_byte(f
, flags
);
417 if (flags
& XMIT_SAME_NAME
)
419 if (flags
& XMIT_LONG_NAME
)
423 write_buf(f
, fname
+ l1
, l2
);
425 write_longint(f
, file
->length
);
426 if (!(flags
& XMIT_SAME_TIME
))
427 write_int(f
, modtime
);
428 if (!(flags
& XMIT_SAME_MODE
))
429 write_int(f
, to_wire_mode(mode
));
430 if (preserve_uid
&& !(flags
& XMIT_SAME_UID
)) {
435 if (preserve_gid
&& !(flags
& XMIT_SAME_GID
)) {
440 if ((preserve_devices
&& IS_DEVICE(mode
))
441 || (preserve_specials
&& IS_SPECIAL(mode
))) {
442 if (protocol_version
< 28) {
443 if (!(flags
& XMIT_SAME_RDEV_pre28
))
444 write_int(f
, (int)rdev
);
446 if (!(flags
& XMIT_SAME_RDEV_MAJOR
))
447 write_int(f
, major(rdev
));
448 if (flags
& XMIT_RDEV_MINOR_IS_SMALL
)
449 write_byte(f
, minor(rdev
));
451 write_int(f
, minor(rdev
));
456 if (preserve_links
&& S_ISLNK(mode
)) {
457 int len
= strlen(file
->u
.link
);
459 write_buf(f
, file
->u
.link
, len
);
463 #ifdef SUPPORT_HARD_LINKS
464 if (flags
& XMIT_HAS_IDEV_DATA
) {
465 if (protocol_version
< 26) {
466 /* 32-bit dev_t and ino_t */
468 write_int(f
, file
->F_INODE
);
470 /* 64-bit dev_t and ino_t */
471 if (!(flags
& XMIT_SAME_DEV
))
472 write_longint(f
, dev
);
473 write_longint(f
, file
->F_INODE
);
478 if (always_checksum
&& (S_ISREG(mode
) || protocol_version
< 28)) {
483 /* Prior to 28, we sent a useless set of nulls. */
486 write_buf(f
, sum
, checksum_len
);
489 strlcpy(lastname
, fname
, MAXPATHLEN
);
491 io_write_phase
= "unknown";
494 static struct file_struct
*receive_file_entry(struct file_list
*flist
,
495 unsigned short flags
, int f
)
497 static time_t modtime
;
501 static uint32 rdev_major
;
504 static char lastname
[MAXPATHLEN
], *lastdir
;
505 static int lastdir_depth
, lastdir_len
= -1;
506 static unsigned int del_hier_name_len
= 0;
507 static int in_del_hier
= 0;
508 char thisname
[MAXPATHLEN
];
509 unsigned int l1
= 0, l2
= 0;
510 int alloc_len
, basename_len
, dirname_len
, linkname_len
, sum_len
;
512 char *basename
, *dirname
, *bp
;
513 struct file_struct
*file
;
516 modtime
= 0, mode
= 0;
517 dev
= 0, rdev
= makedev(0, 0);
526 if (flags
& XMIT_SAME_NAME
)
529 if (flags
& XMIT_LONG_NAME
)
534 if (l2
>= MAXPATHLEN
- l1
) {
536 "overflow: flags=0x%x l1=%d l2=%d lastname=%s\n",
537 flags
, l1
, l2
, lastname
);
538 overflow_exit("receive_file_entry");
541 strlcpy(thisname
, lastname
, l1
+ 1);
542 read_sbuf(f
, &thisname
[l1
], l2
);
543 thisname
[l1
+ l2
] = 0;
545 strlcpy(lastname
, thisname
, MAXPATHLEN
);
547 clean_fname(thisname
, 0);
550 sanitize_path(thisname
, thisname
, "", 0);
552 if ((basename
= strrchr(thisname
, '/')) != NULL
) {
553 dirname_len
= ++basename
- thisname
; /* counts future '\0' */
554 if (lastdir_len
== dirname_len
- 1
555 && strncmp(thisname
, lastdir
, lastdir_len
) == 0) {
557 dirname_len
= 0; /* indicates no copy is needed */
565 basename_len
= strlen(basename
) + 1; /* count the '\0' */
567 file_length
= read_longint(f
);
568 if (!(flags
& XMIT_SAME_TIME
))
569 modtime
= (time_t)read_int(f
);
570 if (!(flags
& XMIT_SAME_MODE
))
571 mode
= from_wire_mode(read_int(f
));
573 if (chmod_modes
&& !S_ISLNK(mode
))
574 mode
= tweak_mode(mode
, chmod_modes
);
576 if (preserve_uid
&& !(flags
& XMIT_SAME_UID
))
577 uid
= (uid_t
)read_int(f
);
578 if (preserve_gid
&& !(flags
& XMIT_SAME_GID
))
579 gid
= (gid_t
)read_int(f
);
581 if ((preserve_devices
&& IS_DEVICE(mode
))
582 || (preserve_specials
&& IS_SPECIAL(mode
))) {
583 if (protocol_version
< 28) {
584 if (!(flags
& XMIT_SAME_RDEV_pre28
))
585 rdev
= (dev_t
)read_int(f
);
588 if (!(flags
& XMIT_SAME_RDEV_MAJOR
))
589 rdev_major
= read_int(f
);
590 if (flags
& XMIT_RDEV_MINOR_IS_SMALL
)
591 rdev_minor
= read_byte(f
);
593 rdev_minor
= read_int(f
);
594 rdev
= makedev(rdev_major
, rdev_minor
);
596 } else if (protocol_version
< 28)
597 rdev
= makedev(0, 0);
600 if (preserve_links
&& S_ISLNK(mode
)) {
601 linkname_len
= read_int(f
) + 1; /* count the '\0' */
602 if (linkname_len
<= 0 || linkname_len
> MAXPATHLEN
) {
603 rprintf(FERROR
, "overflow: linkname_len=%d\n",
605 overflow_exit("receive_file_entry");
612 sum_len
= always_checksum
&& S_ISREG(mode
) ? MD4_SUM_LENGTH
: 0;
614 alloc_len
= file_struct_len
+ dirname_len
+ basename_len
615 + linkname_len
+ sum_len
;
616 bp
= pool_alloc(flist
->file_pool
, alloc_len
, "receive_file_entry");
618 file
= (struct file_struct
*)bp
;
619 memset(bp
, 0, file_struct_len
);
620 bp
+= file_struct_len
;
622 file
->modtime
= modtime
;
623 file
->length
= file_length
;
629 file
->dirname
= lastdir
= bp
;
630 lastdir_len
= dirname_len
- 1;
631 memcpy(bp
, dirname
, dirname_len
- 1);
634 lastdir_depth
= count_dir_elements(lastdir
);
635 file
->dir
.depth
= lastdir_depth
+ 1;
636 } else if (dirname
) {
637 file
->dirname
= dirname
; /* we're reusing lastname */
638 file
->dir
.depth
= lastdir_depth
+ 1;
643 if (basename_len
== 1+1 && *basename
== '.') /* +1 for '\0' */
645 if (flags
& XMIT_TOP_DIR
) {
646 in_del_hier
= recurse
;
647 del_hier_name_len
= file
->dir
.depth
== 0 ? 0 : l1
+ l2
;
648 if (relative_paths
&& del_hier_name_len
> 2
649 && lastname
[del_hier_name_len
-1] == '.'
650 && lastname
[del_hier_name_len
-2] == '/')
651 del_hier_name_len
-= 2;
652 file
->flags
|= FLAG_TOP_DIR
| FLAG_DEL_HERE
;
653 } else if (in_del_hier
) {
654 if (!relative_paths
|| !del_hier_name_len
655 || (l1
>= del_hier_name_len
656 && lastname
[del_hier_name_len
] == '/'))
657 file
->flags
|= FLAG_DEL_HERE
;
664 memcpy(bp
, basename
, basename_len
);
667 if ((preserve_devices
&& IS_DEVICE(mode
))
668 || (preserve_specials
&& IS_SPECIAL(mode
)))
674 read_sbuf(f
, bp
, linkname_len
- 1);
676 sanitize_path(bp
, bp
, "", lastdir_depth
);
681 #ifdef SUPPORT_HARD_LINKS
682 if (preserve_hard_links
&& protocol_version
< 28 && S_ISREG(mode
))
683 flags
|= XMIT_HAS_IDEV_DATA
;
684 if (flags
& XMIT_HAS_IDEV_DATA
) {
686 if (protocol_version
< 26) {
690 if (!(flags
& XMIT_SAME_DEV
))
691 dev
= read_longint(f
);
692 inode
= read_longint(f
);
694 if (flist
->hlink_pool
) {
695 file
->link_u
.idev
= pool_talloc(flist
->hlink_pool
,
696 struct idev
, 1, "inode_table");
697 file
->F_INODE
= inode
;
703 if (always_checksum
&& (sum_len
|| protocol_version
< 28)) {
706 file
->u
.sum
= sum
= bp
;
709 /* Prior to 28, we get a useless set of nulls. */
712 read_buf(f
, sum
, checksum_len
);
719 * Create a file_struct for a named file by reading its stat()
720 * information and performing extensive checks against global
723 * @return the new file, or NULL if there was an error or this file
724 * should be excluded.
726 * @todo There is a small optimization opportunity here to avoid
727 * stat()ing the file in some circumstances, which has a certain cost.
728 * We are called immediately after doing readdir(), and so we may
729 * already know the d_type of the file. We could for example avoid
730 * statting directories if we're not recursing, but this is not a very
731 * important case. Some systems may not have d_type.
733 struct file_struct
*make_file(char *fname
, struct file_list
*flist
,
734 STRUCT_STAT
*stp
, unsigned short flags
,
737 static char *lastdir
;
738 static int lastdir_len
= -1;
739 struct file_struct
*file
;
741 char sum
[SUM_LENGTH
];
742 char thisname
[MAXPATHLEN
];
743 char linkname
[MAXPATHLEN
];
744 int alloc_len
, basename_len
, dirname_len
, linkname_len
, sum_len
;
745 char *basename
, *dirname
, *bp
;
747 if (!flist
|| !flist
->count
) /* Ignore lastdir when invalid. */
750 if (strlcpy(thisname
, fname
, sizeof thisname
)
751 >= sizeof thisname
- flist_dir_len
) {
752 rprintf(FINFO
, "skipping overly long name: %s\n", fname
);
755 clean_fname(thisname
, 0);
757 sanitize_path(thisname
, thisname
, "", 0);
759 memset(sum
, 0, SUM_LENGTH
);
761 if (stp
&& S_ISDIR(stp
->st_mode
))
762 st
= *stp
; /* Needed for "symlink/." with --relative. */
763 else if (readlink_stat(thisname
, &st
, linkname
) != 0) {
764 int save_errno
= errno
;
765 /* See if file is excluded before reporting an error. */
766 if (filter_level
!= NO_FILTERS
767 && is_excluded(thisname
, 0, filter_level
))
769 if (save_errno
== ENOENT
) {
771 /* Avoid "vanished" error if symlink points nowhere. */
772 if (copy_links
&& do_lstat(thisname
, &st
) == 0
773 && S_ISLNK(st
.st_mode
)) {
774 io_error
|= IOERR_GENERAL
;
775 rprintf(FERROR
, "symlink has no referent: %s\n",
776 full_fname(thisname
));
780 enum logcode c
= am_daemon
&& protocol_version
< 28
782 io_error
|= IOERR_VANISHED
;
783 rprintf(c
, "file has vanished: %s\n",
784 full_fname(thisname
));
787 io_error
|= IOERR_GENERAL
;
788 rsyserr(FERROR
, save_errno
, "readlink %s failed",
789 full_fname(thisname
));
794 /* backup.c calls us with filter_level set to NO_FILTERS. */
795 if (filter_level
== NO_FILTERS
)
798 if (S_ISDIR(st
.st_mode
) && !xfer_dirs
) {
799 rprintf(FINFO
, "skipping directory %s\n", thisname
);
803 /* We only care about directories because we need to avoid recursing
804 * into a mount-point directory, not to avoid copying a symlinked
805 * file if -L (or similar) was specified. */
806 if (one_file_system
&& st
.st_dev
!= filesystem_dev
807 && S_ISDIR(st
.st_mode
)) {
808 if (one_file_system
> 1) {
810 rprintf(FINFO
, "skipping mount-point dir %s\n",
815 flags
|= FLAG_MOUNT_POINT
;
818 if (is_excluded(thisname
, S_ISDIR(st
.st_mode
) != 0, filter_level
))
821 if (lp_ignore_nonreadable(module_id
)) {
823 if (!S_ISLNK(st
.st_mode
))
825 if (access(thisname
, R_OK
) != 0)
832 rprintf(FINFO
, "[%s] make_file(%s,*,%d)\n",
833 who_am_i(), thisname
, filter_level
);
836 if ((basename
= strrchr(thisname
, '/')) != NULL
) {
837 dirname_len
= ++basename
- thisname
; /* counts future '\0' */
838 if (lastdir_len
== dirname_len
- 1
839 && strncmp(thisname
, lastdir
, lastdir_len
) == 0) {
841 dirname_len
= 0; /* indicates no copy is needed */
849 basename_len
= strlen(basename
) + 1; /* count the '\0' */
852 linkname_len
= S_ISLNK(st
.st_mode
) ? strlen(linkname
) + 1 : 0;
857 sum_len
= always_checksum
&& am_sender
&& S_ISREG(st
.st_mode
)
858 ? MD4_SUM_LENGTH
: 0;
860 alloc_len
= file_struct_len
+ dirname_len
+ basename_len
861 + linkname_len
+ sum_len
;
863 bp
= pool_alloc(flist
->file_pool
, alloc_len
, "make_file");
865 if (!(bp
= new_array(char, alloc_len
)))
866 out_of_memory("make_file");
869 file
= (struct file_struct
*)bp
;
870 memset(bp
, 0, file_struct_len
);
871 bp
+= file_struct_len
;
874 file
->modtime
= st
.st_mtime
;
875 file
->length
= st
.st_size
;
876 file
->mode
= st
.st_mode
;
877 file
->uid
= st
.st_uid
;
878 file
->gid
= st
.st_gid
;
880 #ifdef SUPPORT_HARD_LINKS
881 if (flist
&& flist
->hlink_pool
) {
882 if (protocol_version
< 28) {
883 if (S_ISREG(st
.st_mode
))
884 file
->link_u
.idev
= pool_talloc(
885 flist
->hlink_pool
, struct idev
, 1,
888 if (!S_ISDIR(st
.st_mode
) && st
.st_nlink
> 1)
889 file
->link_u
.idev
= pool_talloc(
890 flist
->hlink_pool
, struct idev
, 1,
894 if (file
->link_u
.idev
) {
895 file
->F_DEV
= st
.st_dev
;
896 file
->F_INODE
= st
.st_ino
;
901 file
->dirname
= lastdir
= bp
;
902 lastdir_len
= dirname_len
- 1;
903 memcpy(bp
, dirname
, dirname_len
- 1);
907 file
->dirname
= dirname
;
910 memcpy(bp
, basename
, basename_len
);
913 #ifdef HAVE_STRUCT_STAT_ST_RDEV
914 if ((preserve_devices
&& IS_DEVICE(st
.st_mode
))
915 || (preserve_specials
&& IS_SPECIAL(st
.st_mode
)))
916 file
->u
.rdev
= st
.st_rdev
;
922 memcpy(bp
, linkname
, linkname_len
);
929 file_checksum(thisname
, bp
, st
.st_size
);
933 file
->dir
.root
= flist_dir
;
935 /* This code is only used by the receiver when it is building
936 * a list of files for a delete pass. */
937 if (keep_dirlinks
&& linkname_len
&& flist
) {
939 int save_mode
= file
->mode
;
940 file
->mode
= S_IFDIR
; /* Find a directory with our name. */
941 if (flist_find(the_file_list
, file
) >= 0
942 && do_stat(thisname
, &st2
) == 0 && S_ISDIR(st2
.st_mode
)) {
943 file
->modtime
= st2
.st_mtime
;
944 file
->length
= st2
.st_size
;
945 file
->mode
= st2
.st_mode
;
946 file
->uid
= st2
.st_uid
;
947 file
->gid
= st2
.st_gid
;
950 file
->mode
= save_mode
;
953 if (S_ISREG(st
.st_mode
) || S_ISLNK(st
.st_mode
))
954 stats
.total_size
+= st
.st_size
;
959 static struct file_struct
*send_file_name(int f
, struct file_list
*flist
,
960 char *fname
, STRUCT_STAT
*stp
,
961 unsigned short flags
)
963 struct file_struct
*file
;
965 file
= make_file(fname
, flist
, stp
, flags
,
966 f
== -2 ? SERVER_FILTERS
: ALL_FILTERS
);
970 if (chmod_modes
&& !S_ISLNK(file
->mode
))
971 file
->mode
= tweak_mode(file
->mode
, chmod_modes
);
973 maybe_emit_filelist_progress(flist
->count
+ flist_count_offset
);
977 if (file
->basename
[0]) {
978 flist
->files
[flist
->count
++] = file
;
979 send_file_entry(file
, f
);
984 static void send_if_directory(int f
, struct file_list
*flist
,
985 struct file_struct
*file
,
986 char *fbuf
, unsigned int ol
)
988 char is_dot_dir
= fbuf
[ol
-1] == '.' && (ol
== 1 || fbuf
[ol
-2] == '/');
990 if (S_ISDIR(file
->mode
)
991 && !(file
->flags
& FLAG_MOUNT_POINT
) && f_name(file
, fbuf
)) {
993 unsigned int len
= strlen(fbuf
);
994 if (len
> 1 && fbuf
[len
-1] == '/')
996 if (len
>= MAXPATHLEN
- 1) {
997 io_error
|= IOERR_GENERAL
;
998 rprintf(FERROR
, "skipping long-named directory: %s\n",
1002 save_filters
= push_local_filters(fbuf
, len
);
1003 send_directory(f
, flist
, fbuf
, len
);
1004 pop_local_filters(save_filters
);
1011 /* This function is normally called by the sender, but the receiving side also
1012 * calls it from get_dirlist() with f set to -1 so that we just construct the
1013 * file list in memory without sending it over the wire. Also, get_dirlist()
1014 * might call this with f set to -2, which also indicates that local filter
1015 * rules should be ignored. */
1016 static void send_directory(int f
, struct file_list
*flist
,
1017 char *fbuf
, int len
)
1023 int start
= flist
->count
;
1025 if (!(d
= opendir(fbuf
))) {
1026 io_error
|= IOERR_GENERAL
;
1027 rsyserr(FERROR
, errno
, "opendir %s failed", full_fname(fbuf
));
1032 if (len
!= 1 || *fbuf
!= '/')
1035 remainder
= MAXPATHLEN
- (p
- fbuf
);
1037 for (errno
= 0, di
= readdir(d
); di
; errno
= 0, di
= readdir(d
)) {
1038 char *dname
= d_name(di
);
1039 if (dname
[0] == '.' && (dname
[1] == '\0'
1040 || (dname
[1] == '.' && dname
[2] == '\0')))
1042 if (strlcpy(p
, dname
, remainder
) >= remainder
) {
1043 io_error
|= IOERR_GENERAL
;
1045 "cannot send long-named file %s\n",
1050 send_file_name(f
, flist
, fbuf
, NULL
, 0);
1056 io_error
|= IOERR_GENERAL
;
1057 rsyserr(FERROR
, errno
, "readdir(%s)", full_fname(fbuf
));
1063 int i
, end
= flist
->count
- 1;
1064 for (i
= start
; i
<= end
; i
++)
1065 send_if_directory(f
, flist
, flist
->files
[i
], fbuf
, len
);
1069 struct file_list
*send_file_list(int f
, int argc
, char *argv
[])
1073 char *p
, *dir
, olddir
[sizeof curr_dir
];
1074 char lastpath
[MAXPATHLEN
] = "";
1075 struct file_list
*flist
;
1076 struct timeval start_tv
, end_tv
;
1080 if (show_filelist_p())
1081 start_filelist_progress("building file list");
1083 start_write
= stats
.total_written
;
1084 gettimeofday(&start_tv
, NULL
);
1086 flist
= flist_new(WITH_HLINK
, "send_file_list");
1088 io_start_buffering_out();
1089 if (filesfrom_fd
>= 0) {
1090 if (argv
[0] && !push_dir(argv
[0])) {
1091 rsyserr(FERROR
, errno
, "push_dir %s failed",
1092 full_fname(argv
[0]));
1093 exit_cleanup(RERR_FILESELECT
);
1099 char fbuf
[MAXPATHLEN
];
1104 if (read_filesfrom_line(filesfrom_fd
, fbuf
) == 0)
1106 sanitize_path(fbuf
, fbuf
, "", 0);
1110 strlcpy(fbuf
, *argv
++, MAXPATHLEN
);
1112 sanitize_path(fbuf
, fbuf
, "", 0);
1116 if (relative_paths
) {
1117 /* We clean up fbuf below. */
1119 } else if (!len
|| fbuf
[len
- 1] == '/') {
1120 if (len
== 2 && fbuf
[0] == '.') {
1121 /* Turn "./" into just "." rather than "./." */
1124 if (len
+ 1 >= MAXPATHLEN
)
1125 overflow_exit("send_file_list");
1130 } else if (len
> 1 && fbuf
[len
-1] == '.' && fbuf
[len
-2] == '.'
1131 && (len
== 2 || fbuf
[len
-3] == '/')) {
1132 if (len
+ 2 >= MAXPATHLEN
)
1133 overflow_exit("send_file_list");
1139 is_dot_dir
= fbuf
[len
-1] == '.'
1140 && (len
== 1 || fbuf
[len
-2] == '/');
1143 if (link_stat(fbuf
, &st
, copy_dirlinks
) != 0) {
1144 io_error
|= IOERR_GENERAL
;
1145 rsyserr(FERROR
, errno
, "link_stat %s failed",
1150 if (S_ISDIR(st
.st_mode
) && !xfer_dirs
) {
1151 rprintf(FINFO
, "skipping directory %s\n", fbuf
);
1158 if (!relative_paths
) {
1159 p
= strrchr(fbuf
, '/');
1166 len
-= p
- fbuf
+ 1;
1171 if ((p
= strstr(fbuf
, "/./")) != NULL
) {
1177 len
-= p
- fbuf
+ 3;
1181 /* Get rid of trailing "/" and "/.". */
1183 if (fn
[len
- 1] == '/') {
1185 if (!--len
&& !dir
) {
1190 else if (len
>= 2 && fn
[len
- 1] == '.'
1191 && fn
[len
- 2] == '/') {
1193 if (!(len
-= 2) && !dir
) {
1201 /* Reject a ".." dir in the active part of the path. */
1202 for (p
= fn
; (p
= strstr(p
, "..")) != NULL
; p
+= 2) {
1203 if ((p
[2] == '/' || p
[2] == '\0')
1204 && (p
== fn
|| p
[-1] == '/')) {
1206 "found \"..\" dir in relative path: %s\n",
1208 exit_cleanup(RERR_SYNTAX
);
1219 static char *lastdir
;
1220 static int lastdir_len
;
1222 strlcpy(olddir
, curr_dir
, sizeof olddir
);
1224 if (!push_dir(dir
)) {
1225 io_error
|= IOERR_GENERAL
;
1226 rsyserr(FERROR
, errno
, "push_dir %s failed",
1231 if (lastdir
&& strcmp(lastdir
, dir
) == 0) {
1232 flist_dir
= lastdir
;
1233 flist_dir_len
= lastdir_len
;
1235 flist_dir
= lastdir
= strdup(dir
);
1236 flist_dir_len
= lastdir_len
= strlen(dir
);
1241 memmove(fbuf
, fn
, len
+ 1);
1243 if (implied_dirs
&& (p
=strrchr(fbuf
,'/')) && p
!= fbuf
) {
1244 /* Send the implied directories at the start of the
1245 * source spec, so we get their permissions right. */
1246 char *lp
= lastpath
, *slash
= fbuf
;
1248 /* Skip any initial directories in our path that we
1249 * have in common with lastpath. */
1250 for (fn
= fbuf
; *fn
&& *lp
== *fn
; lp
++, fn
++) {
1255 if (fn
!= p
|| (*lp
&& *lp
!= '/')) {
1256 int save_copy_links
= copy_links
;
1257 int save_xfer_dirs
= xfer_dirs
;
1258 copy_links
|= copy_unsafe_links
;
1260 while ((slash
= strchr(slash
+1, '/')) != 0) {
1262 send_file_name(f
, flist
, fbuf
, NULL
, 0);
1265 copy_links
= save_copy_links
;
1266 xfer_dirs
= save_xfer_dirs
;
1268 strlcpy(lastpath
, fbuf
, sizeof lastpath
);
1273 if (one_file_system
)
1274 filesystem_dev
= st
.st_dev
;
1276 if (recurse
|| (xfer_dirs
&& is_dot_dir
)) {
1277 struct file_struct
*file
;
1278 file
= send_file_name(f
, flist
, fbuf
, &st
, FLAG_TOP_DIR
);
1280 send_if_directory(f
, flist
, file
, fbuf
, len
);
1282 send_file_name(f
, flist
, fbuf
, &st
, 0);
1287 if (!pop_dir(olddir
)) {
1288 rsyserr(FERROR
, errno
, "pop_dir %s failed",
1289 full_fname(olddir
));
1290 exit_cleanup(RERR_FILESELECT
);
1295 gettimeofday(&end_tv
, NULL
);
1296 stats
.flist_buildtime
= (int64
)(end_tv
.tv_sec
- start_tv
.tv_sec
) * 1000
1297 + (end_tv
.tv_usec
- start_tv
.tv_usec
) / 1000;
1298 if (stats
.flist_buildtime
== 0)
1299 stats
.flist_buildtime
= 1;
1302 send_file_entry(NULL
, f
);
1304 if (show_filelist_p())
1305 finish_filelist_progress(flist
);
1307 gettimeofday(&end_tv
, NULL
);
1308 stats
.flist_xfertime
= (int64
)(end_tv
.tv_sec
- start_tv
.tv_sec
) * 1000
1309 + (end_tv
.tv_usec
- start_tv
.tv_usec
) / 1000;
1311 if (flist
->hlink_pool
) {
1312 pool_destroy(flist
->hlink_pool
);
1313 flist
->hlink_pool
= NULL
;
1316 /* Sort the list without removing any duplicates. This allows the
1317 * receiving side to ask for any name they like, which gives us the
1318 * flexibility to change the way we unduplicate names in the future
1319 * without causing a compatibility problem with older versions. */
1320 clean_flist(flist
, 0, 0);
1324 /* send the io_error flag */
1325 write_int(f
, lp_ignore_errors(module_id
) ? 0 : io_error
);
1328 stats
.flist_size
= stats
.total_written
- start_write
;
1329 stats
.num_files
= flist
->count
;
1332 output_flist(flist
);
1335 rprintf(FINFO
, "send_file_list done\n");
1340 struct file_list
*recv_file_list(int f
)
1342 struct file_list
*flist
;
1343 unsigned short flags
;
1346 if (show_filelist_p())
1347 start_filelist_progress("receiving file list");
1349 start_read
= stats
.total_read
;
1351 flist
= flist_new(WITH_HLINK
, "recv_file_list");
1354 flist
->malloced
= 1000;
1355 flist
->files
= new_array(struct file_struct
*, flist
->malloced
);
1359 while ((flags
= read_byte(f
)) != 0) {
1360 struct file_struct
*file
;
1362 flist_expand(flist
);
1364 if (protocol_version
>= 28 && (flags
& XMIT_EXTENDED_FLAGS
))
1365 flags
|= read_byte(f
) << 8;
1366 file
= receive_file_entry(flist
, flags
, f
);
1368 if (S_ISREG(file
->mode
) || S_ISLNK(file
->mode
))
1369 stats
.total_size
+= file
->length
;
1371 flist
->files
[flist
->count
++] = file
;
1373 maybe_emit_filelist_progress(flist
->count
);
1376 rprintf(FINFO
, "recv_file_name(%s)\n",
1377 f_name(file
, NULL
));
1380 receive_file_entry(NULL
, 0, 0); /* Signal that we're done. */
1383 rprintf(FINFO
, "received %d names\n", flist
->count
);
1385 if (show_filelist_p())
1386 finish_filelist_progress(flist
);
1388 clean_flist(flist
, relative_paths
, 1);
1391 recv_uid_list(f
, flist
);
1393 /* Recv the io_error flag */
1394 if (lp_ignore_errors(module_id
) || ignore_errors
)
1397 io_error
|= read_int(f
);
1401 output_flist(flist
);
1405 for (i
= 0; i
< flist
->count
; i
++)
1406 list_file_entry(flist
->files
[i
]);
1410 rprintf(FINFO
, "recv_file_list done\n");
1412 stats
.flist_size
= stats
.total_read
- start_read
;
1413 stats
.num_files
= flist
->count
;
1418 out_of_memory("recv_file_list");
1419 return NULL
; /* not reached */
1422 static int file_compare(struct file_struct
**file1
, struct file_struct
**file2
)
1424 return f_name_cmp(*file1
, *file2
);
1427 /* Search for an identically-named item in the file list. Note that the
1428 * items must agree in their directory-ness, or no match is returned. */
1429 int flist_find(struct file_list
*flist
, struct file_struct
*f
)
1431 int low
= flist
->low
, high
= flist
->high
;
1432 int diff
, mid
, mid_up
;
1434 while (low
<= high
) {
1435 mid
= (low
+ high
) / 2;
1436 if (flist
->files
[mid
]->basename
)
1439 /* Scan for the next non-empty entry using the cached
1440 * distance values. If the value isn't fully up-to-
1441 * date, update it. */
1442 mid_up
= mid
+ flist
->files
[mid
]->dir
.depth
;
1443 if (!flist
->files
[mid_up
]->basename
) {
1445 mid_up
+= flist
->files
[mid_up
]->dir
.depth
;
1446 } while (!flist
->files
[mid_up
]->basename
);
1447 flist
->files
[mid
]->dir
.depth
= mid_up
- mid
;
1449 if (mid_up
> high
) {
1450 /* If there's nothing left above us, set high to
1451 * a non-empty entry below us and continue. */
1452 high
= mid
- flist
->files
[mid
]->length
;
1453 if (!flist
->files
[high
]->basename
) {
1455 high
-= flist
->files
[high
]->length
;
1456 } while (!flist
->files
[high
]->basename
);
1457 flist
->files
[mid
]->length
= mid
- high
;
1462 diff
= f_name_cmp(flist
->files
[mid_up
], f
);
1464 if (protocol_version
< 29
1465 && S_ISDIR(flist
->files
[mid_up
]->mode
)
1466 != S_ISDIR(f
->mode
))
1479 * Free up any resources a file_struct has allocated
1480 * and clear the file.
1482 void clear_file(struct file_struct
*file
, struct file_list
*flist
)
1484 if (flist
->hlink_pool
&& file
->link_u
.idev
)
1485 pool_free(flist
->hlink_pool
, 0, file
->link_u
.idev
);
1486 memset(file
, 0, file_struct_len
);
1487 /* In an empty entry, dir.depth is an offset to the next non-empty
1488 * entry. Likewise for length in the opposite direction. We assume
1489 * that we're alone for now since flist_find() will adjust the counts
1490 * it runs into that aren't up-to-date. */
1491 file
->length
= file
->dir
.depth
= 1;
1495 * allocate a new file list
1497 struct file_list
*flist_new(int with_hlink
, char *msg
)
1499 struct file_list
*flist
;
1501 flist
= new(struct file_list
);
1505 memset(flist
, 0, sizeof (struct file_list
));
1507 if (!(flist
->file_pool
= pool_create(FILE_EXTENT
, 0,
1508 out_of_memory
, POOL_INTERN
)))
1511 #ifdef SUPPORT_HARD_LINKS
1512 if (with_hlink
&& preserve_hard_links
) {
1513 if (!(flist
->hlink_pool
= pool_create(HLINK_EXTENT
,
1514 sizeof (struct idev
), out_of_memory
, POOL_INTERN
)))
1523 * free up all elements in a flist
1525 void flist_free(struct file_list
*flist
)
1527 pool_destroy(flist
->file_pool
);
1528 pool_destroy(flist
->hlink_pool
);
1534 * This routine ensures we don't have any duplicate names in our file list.
1535 * duplicate names can cause corruption because of the pipelining
1537 static void clean_flist(struct file_list
*flist
, int strip_root
, int no_dups
)
1539 char fbuf
[MAXPATHLEN
];
1544 if (flist
->count
== 0) {
1549 qsort(flist
->files
, flist
->count
,
1550 sizeof flist
->files
[0], (int (*)())file_compare
);
1552 for (i
= no_dups
? 0 : flist
->count
; i
< flist
->count
; i
++) {
1553 if (flist
->files
[i
]->basename
) {
1558 flist
->low
= prev_i
;
1559 while (++i
< flist
->count
) {
1561 struct file_struct
*file
= flist
->files
[i
];
1563 if (!file
->basename
)
1565 if (f_name_cmp(file
, flist
->files
[prev_i
]) == 0)
1567 else if (protocol_version
>= 29 && S_ISDIR(file
->mode
)) {
1568 int save_mode
= file
->mode
;
1569 /* Make sure that this directory doesn't duplicate a
1570 * non-directory earlier in the list. */
1571 flist
->high
= prev_i
;
1572 file
->mode
= S_IFREG
;
1573 j
= flist_find(flist
, file
);
1574 file
->mode
= save_mode
;
1578 struct file_struct
*fp
= flist
->files
[j
];
1580 /* If one is a dir and the other is not, we want to
1581 * keep the dir because it might have contents in the
1583 if (S_ISDIR(file
->mode
) != S_ISDIR(fp
->mode
)) {
1584 if (S_ISDIR(file
->mode
))
1590 if (verbose
> 1 && !am_server
) {
1592 "removing duplicate name %s from file list (%d)\n",
1593 f_name(file
, fbuf
), drop
);
1595 /* Make sure we don't lose track of a user-specified
1597 flist
->files
[keep
]->flags
|= flist
->files
[drop
]->flags
1598 & (FLAG_TOP_DIR
|FLAG_DEL_HERE
);
1600 clear_file(flist
->files
[drop
], flist
);
1603 if (flist
->low
== drop
) {
1605 j
< i
&& !flist
->files
[j
]->basename
;
1614 flist
->high
= no_dups
? prev_i
: flist
->count
- 1;
1617 /* We need to strip off the leading slashes for relative
1618 * paths, but this must be done _after_ the sorting phase. */
1619 for (i
= flist
->low
; i
<= flist
->high
; i
++) {
1620 struct file_struct
*file
= flist
->files
[i
];
1624 while (*file
->dirname
== '/')
1626 if (!*file
->dirname
)
1627 file
->dirname
= NULL
;
1631 if (prune_empty_dirs
&& no_dups
) {
1632 int j
, prev_depth
= 0;
1634 prev_i
= 0; /* It's OK that this isn't really true. */
1636 for (i
= flist
->low
; i
<= flist
->high
; i
++) {
1637 struct file_struct
*fp
, *file
= flist
->files
[i
];
1639 /* This temporarily abuses the dir.depth value for a
1640 * directory that is in a chain that might get pruned.
1641 * We restore the old value if it gets a reprieve. */
1642 if (S_ISDIR(file
->mode
) && file
->dir
.depth
) {
1643 /* Dump empty dirs when coming back down. */
1644 for (j
= prev_depth
; j
>= file
->dir
.depth
; j
--) {
1645 fp
= flist
->files
[prev_i
];
1646 if (fp
->dir
.depth
>= 0)
1648 prev_i
= -fp
->dir
.depth
-1;
1649 clear_file(fp
, flist
);
1651 prev_depth
= file
->dir
.depth
;
1652 if (is_excluded(f_name(file
, fbuf
), 1,
1654 /* Keep dirs through this dir. */
1655 for (j
= prev_depth
-1; ; j
--) {
1656 fp
= flist
->files
[prev_i
];
1657 if (fp
->dir
.depth
>= 0)
1659 prev_i
= -fp
->dir
.depth
-1;
1663 file
->dir
.depth
= -prev_i
-1;
1666 /* Keep dirs through this non-dir. */
1667 for (j
= prev_depth
; ; j
--) {
1668 fp
= flist
->files
[prev_i
];
1669 if (fp
->dir
.depth
>= 0)
1671 prev_i
= -fp
->dir
.depth
-1;
1676 /* Dump empty all remaining empty dirs. */
1678 struct file_struct
*fp
= flist
->files
[prev_i
];
1679 if (fp
->dir
.depth
>= 0)
1681 prev_i
= -fp
->dir
.depth
-1;
1682 clear_file(fp
, flist
);
1685 for (i
= flist
->low
; i
<= flist
->high
; i
++) {
1686 if (flist
->files
[i
]->basename
)
1690 for (i
= flist
->high
; i
>= flist
->low
; i
--) {
1691 if (flist
->files
[i
]->basename
)
1698 static void output_flist(struct file_list
*flist
)
1700 char uidbuf
[16], gidbuf
[16], depthbuf
[16];
1701 struct file_struct
*file
;
1702 const char *who
= who_am_i();
1705 for (i
= 0; i
< flist
->count
; i
++) {
1706 file
= flist
->files
[i
];
1707 if ((am_root
|| am_sender
) && preserve_uid
)
1708 sprintf(uidbuf
, " uid=%ld", (long)file
->uid
);
1711 if (preserve_gid
&& file
->gid
!= GID_NONE
)
1712 sprintf(gidbuf
, " gid=%ld", (long)file
->gid
);
1716 sprintf(depthbuf
, "%d", file
->dir
.depth
);
1717 rprintf(FINFO
, "[%s] i=%d %s %s%s%s%s mode=0%o len=%.0f%s%s flags=%x\n",
1718 who
, i
, am_sender
? NS(file
->dir
.root
) : depthbuf
,
1719 file
->dirname
? file
->dirname
: "",
1720 file
->dirname
? "/" : "", NS(file
->basename
),
1721 S_ISDIR(file
->mode
) ? "/" : "", (int)file
->mode
,
1722 (double)file
->length
, uidbuf
, gidbuf
, file
->flags
);
1726 enum fnc_state
{ s_DIR
, s_SLASH
, s_BASE
, s_TRAILING
};
1727 enum fnc_type
{ t_PATH
, t_ITEM
};
1729 /* Compare the names of two file_struct entities, similar to how strcmp()
1730 * would do if it were operating on the joined strings.
1732 * Some differences beginning with protocol_version 29: (1) directory names
1733 * are compared with an assumed trailing slash so that they compare in a
1734 * way that would cause them to sort immediately prior to any content they
1735 * may have; (2) a directory of any name compares after a non-directory of
1736 * any name at the same depth; (3) a directory with name "." compares prior
1737 * to anything else. These changes mean that a directory and a non-dir
1738 * with the same name will not compare as equal (protocol_version >= 29).
1740 * The dirname component can be an empty string, but the basename component
1741 * cannot (and never is in the current codebase). The basename component
1742 * may be NULL (for a removed item), in which case it is considered to be
1743 * after any existing item. */
1744 int f_name_cmp(struct file_struct
*f1
, struct file_struct
*f2
)
1747 const uchar
*c1
, *c2
;
1748 enum fnc_state state1
, state2
;
1749 enum fnc_type type1
, type2
;
1750 enum fnc_type t_path
= protocol_version
>= 29 ? t_PATH
: t_ITEM
;
1752 if (!f1
|| !f1
->basename
) {
1753 if (!f2
|| !f2
->basename
)
1757 if (!f2
|| !f2
->basename
)
1760 c1
= (uchar
*)f1
->dirname
;
1761 c2
= (uchar
*)f2
->dirname
;
1765 type1
= S_ISDIR(f1
->mode
) ? t_path
: t_ITEM
;
1766 c1
= (uchar
*)f1
->basename
;
1767 if (type1
== t_PATH
&& *c1
== '.' && !c1
[1]) {
1769 state1
= s_TRAILING
;
1782 type2
= S_ISDIR(f2
->mode
) ? t_path
: t_ITEM
;
1783 c2
= (uchar
*)f2
->basename
;
1784 if (type2
== t_PATH
&& *c2
== '.' && !c2
[1]) {
1786 state2
= s_TRAILING
;
1800 return type1
== t_PATH
? 1 : -1;
1803 if ((dif
= (int)*c1
++ - (int)*c2
++) != 0)
1812 type1
= S_ISDIR(f1
->mode
) ? t_path
: t_ITEM
;
1813 c1
= (uchar
*)f1
->basename
;
1814 if (type1
== t_PATH
&& *c1
== '.' && !c1
[1]) {
1816 state1
= s_TRAILING
;
1822 state1
= s_TRAILING
;
1823 if (type1
== t_PATH
) {
1832 if (*c2
&& type1
!= type2
)
1833 return type1
== t_PATH
? 1 : -1;
1842 type2
= S_ISDIR(f2
->mode
) ? t_path
: t_ITEM
;
1843 c2
= (uchar
*)f2
->basename
;
1844 if (type2
== t_PATH
&& *c2
== '.' && !c2
[1]) {
1846 state2
= s_TRAILING
;
1852 state2
= s_TRAILING
;
1853 if (type2
== t_PATH
) {
1865 return type1
== t_PATH
? 1 : -1;
1872 /* Return a copy of the full filename of a flist entry, using the indicated
1873 * buffer or one of 5 static buffers if fbuf is NULL. No size-checking is
1874 * done because we checked the size when creating the file_struct entry.
1876 char *f_name(struct file_struct
*f
, char *fbuf
)
1878 if (!f
|| !f
->basename
)
1882 static char names
[5][MAXPATHLEN
];
1883 static unsigned int n
;
1885 n
= (n
+ 1) % (sizeof names
/ sizeof names
[0]);
1891 int len
= strlen(f
->dirname
);
1892 memcpy(fbuf
, f
->dirname
, len
);
1894 strcpy(fbuf
+ len
+ 1, f
->basename
);
1896 strcpy(fbuf
, f
->basename
);
1901 /* Do a non-recursive scan of the named directory, possibly ignoring all
1902 * exclude rules except for the daemon's. If "dlen" is >=0, it is the length
1903 * of the dirname string, and also indicates that "dirname" is a MAXPATHLEN
1904 * buffer (the functions we call will append names onto the end, but the old
1905 * dir value will be restored on exit). */
1906 struct file_list
*get_dirlist(char *dirname
, int dlen
,
1907 int ignore_filter_rules
)
1909 struct file_list
*dirlist
;
1910 char dirbuf
[MAXPATHLEN
];
1911 int save_recurse
= recurse
;
1912 int save_xfer_dirs
= xfer_dirs
;
1915 dlen
= strlcpy(dirbuf
, dirname
, MAXPATHLEN
);
1916 if (dlen
>= MAXPATHLEN
)
1921 dirlist
= flist_new(WITHOUT_HLINK
, "get_dirlist");
1925 send_directory(ignore_filter_rules
? -2 : -1, dirlist
, dirname
, dlen
);
1926 xfer_dirs
= save_xfer_dirs
;
1927 recurse
= save_recurse
;
1929 flist_count_offset
+= dirlist
->count
;
1931 clean_flist(dirlist
, 0, 0);
1934 output_flist(dirlist
);