2 * Utility routines used in rsync.
4 * Copyright (C) 1996-2000 Andrew Tridgell
5 * Copyright (C) 1996 Paul Mackerras
6 * Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
7 * Copyright (C) 2003-2009 Wayne Davison
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, visit the http://fsf.org website.
30 extern int modify_window
;
31 extern int relative_paths
;
32 extern int preserve_times
;
33 extern int preserve_xattrs
;
34 extern char *module_dir
;
35 extern unsigned int module_dirlen
;
36 extern char *partial_dir
;
37 extern filter_rule_list daemon_filter_list
;
39 int sanitize_paths
= 0;
41 char curr_dir
[MAXPATHLEN
];
42 unsigned int curr_dir_len
;
43 int curr_dir_depth
; /* This is only set for a sanitizing daemon. */
45 /* Set a fd into nonblocking mode. */
46 void set_nonblocking(int fd
)
50 if ((val
= fcntl(fd
, F_GETFL
)) == -1)
52 if (!(val
& NONBLOCK_FLAG
)) {
54 fcntl(fd
, F_SETFL
, val
);
58 /* Set a fd into blocking mode. */
59 void set_blocking(int fd
)
63 if ((val
= fcntl(fd
, F_GETFL
)) == -1)
65 if (val
& NONBLOCK_FLAG
) {
66 val
&= ~NONBLOCK_FLAG
;
67 fcntl(fd
, F_SETFL
, val
);
72 * Create a file descriptor pair - like pipe() but use socketpair if
73 * possible (because of blocking issues on pipes).
75 * Always set non-blocking.
77 int fd_pair(int fd
[2])
81 #ifdef HAVE_SOCKETPAIR
82 ret
= socketpair(AF_UNIX
, SOCK_STREAM
, 0, fd
);
88 set_nonblocking(fd
[0]);
89 set_nonblocking(fd
[1]);
95 void print_child_argv(const char *prefix
, char **cmd
)
97 rprintf(FCLIENT
, "%s ", prefix
);
99 /* Look for characters that ought to be quoted. This
100 * is not a great quoting algorithm, but it's
101 * sufficient for a log message. */
102 if (strspn(*cmd
, "abcdefghijklmnopqrstuvwxyz"
103 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
105 ",.-_=+@/") != strlen(*cmd
)) {
106 rprintf(FCLIENT
, "\"%s\" ", *cmd
);
108 rprintf(FCLIENT
, "%s ", *cmd
);
111 rprintf(FCLIENT
, "\n");
114 NORETURN
void out_of_memory(const char *str
)
116 rprintf(FERROR
, "ERROR: out of memory in %s [%s]\n", str
, who_am_i());
117 exit_cleanup(RERR_MALLOC
);
120 NORETURN
void overflow_exit(const char *str
)
122 rprintf(FERROR
, "ERROR: buffer overflow in %s [%s]\n", str
, who_am_i());
123 exit_cleanup(RERR_MALLOC
);
126 int set_modtime(const char *fname
, time_t modtime
, uint32 mod_nsec
, mode_t mode
)
128 if (!(preserve_times
& PRESERVE_LINK_TIMES
) && S_ISLNK(mode
))
131 if (DEBUG_GTE(TIME
, 1)) {
132 rprintf(FINFO
, "set modtime of %s to (%ld) %s",
133 fname
, (long)modtime
,
134 asctime(localtime(&modtime
)));
141 #ifdef HAVE_UTIMENSAT
142 struct timespec t
[2];
144 t
[0].tv_nsec
= UTIME_NOW
;
145 t
[1].tv_sec
= modtime
;
146 t
[1].tv_nsec
= mod_nsec
;
147 return utimensat(AT_FDCWD
, fname
, t
, AT_SYMLINK_NOFOLLOW
);
148 #elif defined HAVE_UTIMES || defined HAVE_LUTIMES
150 t
[0].tv_sec
= time(NULL
);
152 t
[1].tv_sec
= modtime
;
153 t
[1].tv_usec
= mod_nsec
/ 1000;
155 return lutimes(fname
, t
);
157 return utimes(fname
, t
);
159 #elif defined HAVE_STRUCT_UTIMBUF
161 tbuf
.actime
= time(NULL
);
162 tbuf
.modtime
= modtime
;
163 return utime(fname
,&tbuf
);
164 #elif defined HAVE_UTIME
168 return utime(fname
,t
);
170 #error No file-time-modification routine found!
175 /* Create any necessary directories in fname. Any missing directories are
176 * created with default permissions. Returns < 0 on error, or the number
177 * of directories created. */
178 int make_path(char *fname
, int flags
)
183 if (flags
& MKP_SKIP_SLASH
) {
184 while (*fname
== '/')
188 while (*fname
== '.' && fname
[1] == '/')
191 if (flags
& MKP_DROP_NAME
) {
192 end
= strrchr(fname
, '/');
197 end
= fname
+ strlen(fname
);
199 /* Try to find an existing dir, starting from the deepest dir. */
201 if (do_mkdir(fname
, ACCESSPERMS
) == 0) {
205 if (errno
!= ENOENT
) {
217 ret
= -ret
- 1; /* impossible... */
227 /* Make all the dirs that we didn't find on the way here. */
231 if (ret
< 0) /* Skip mkdir on error, but keep restoring the path. */
233 if (do_mkdir(fname
, ACCESSPERMS
) < 0)
239 if (flags
& MKP_DROP_NAME
)
246 * Write @p len bytes at @p ptr to descriptor @p desc, retrying if
249 * @retval len upon success
251 * @retval <0 write's (negative) error code
253 * Derived from GNU C's cccp.c.
255 int full_write(int desc
, const char *ptr
, size_t len
)
261 int written
= write(desc
, ptr
, len
);
267 total_written
+= written
;
271 return total_written
;
275 * Read @p len bytes at @p ptr from descriptor @p desc, retrying if
278 * @retval >0 the actual number of bytes read
282 * @retval <0 for an error.
284 * Derived from GNU C's cccp.c. */
285 static int safe_read(int desc
, char *ptr
, size_t len
)
293 n_chars
= read(desc
, ptr
, len
);
294 } while (n_chars
< 0 && errno
== EINTR
);
299 /* Copy a file. If ofd < 0, copy_file unlinks and opens the "dest" file.
300 * Otherwise, it just writes to and closes the provided file descriptor.
301 * In either case, if --xattrs are being preserved, the dest file will
302 * have its xattrs set from the source file.
304 * This is used in conjunction with the --temp-dir, --backup, and
305 * --copy-dest options. */
306 int copy_file(const char *source
, const char *dest
, int ofd
, mode_t mode
)
310 int len
; /* Number of bytes read into `buf'. */
312 if ((ifd
= do_open(source
, O_RDONLY
, 0)) < 0) {
313 int save_errno
= errno
;
314 rsyserr(FERROR_XFER
, errno
, "open %s", full_fname(source
));
320 if (robust_unlink(dest
) && errno
!= ENOENT
) {
321 int save_errno
= errno
;
322 rsyserr(FERROR_XFER
, errno
, "unlink %s", full_fname(dest
));
327 #ifdef SUPPORT_XATTRS
331 mode
&= INITACCESSPERMS
;
332 if ((ofd
= do_open(dest
, O_WRONLY
| O_CREAT
| O_TRUNC
| O_EXCL
, mode
)) < 0) {
333 int save_errno
= errno
;
334 rsyserr(FERROR_XFER
, save_errno
, "open %s", full_fname(dest
));
341 while ((len
= safe_read(ifd
, buf
, sizeof buf
)) > 0) {
342 if (full_write(ofd
, buf
, len
) < 0) {
343 int save_errno
= errno
;
344 rsyserr(FERROR_XFER
, errno
, "write %s", full_fname(dest
));
353 int save_errno
= errno
;
354 rsyserr(FERROR_XFER
, errno
, "read %s", full_fname(source
));
361 if (close(ifd
) < 0) {
362 rsyserr(FWARNING
, errno
, "close failed on %s",
366 if (close(ofd
) < 0) {
367 int save_errno
= errno
;
368 rsyserr(FERROR_XFER
, errno
, "close failed on %s",
374 #ifdef SUPPORT_XATTRS
376 copy_xattrs(source
, dest
);
382 /* MAX_RENAMES should be 10**MAX_RENAMES_DIGITS */
383 #define MAX_RENAMES_DIGITS 3
384 #define MAX_RENAMES 1000
387 * Robust unlink: some OS'es (HPUX) refuse to unlink busy files, so
388 * rename to <path>/.rsyncNNN instead.
390 * Note that successive rsync runs will shuffle the filenames around a
391 * bit as long as the file is still busy; this is because this function
392 * does not know if the unlink call is due to a new file coming in, or
393 * --delete trying to remove old .rsyncNNN files, hence it renames it
396 int robust_unlink(const char *fname
)
399 return do_unlink(fname
);
401 static int counter
= 1;
403 char path
[MAXPATHLEN
];
405 rc
= do_unlink(fname
);
406 if (rc
== 0 || errno
!= ETXTBSY
)
409 if ((pos
= strlcpy(path
, fname
, MAXPATHLEN
)) >= MAXPATHLEN
)
410 pos
= MAXPATHLEN
- 1;
412 while (pos
> 0 && path
[pos
-1] != '/')
414 pos
+= strlcpy(path
+pos
, ".rsync", MAXPATHLEN
-pos
);
416 if (pos
> (MAXPATHLEN
-MAX_RENAMES_DIGITS
-1)) {
421 /* start where the last one left off to reduce chance of clashes */
424 snprintf(&path
[pos
], MAX_RENAMES_DIGITS
+1, "%03d", counter
);
425 if (++counter
>= MAX_RENAMES
)
427 } while ((rc
= access(path
, 0)) == 0 && counter
!= start
);
429 if (INFO_GTE(MISC
, 1)) {
430 rprintf(FWARNING
, "renaming %s to %s because of text busy\n",
434 /* maybe we should return rename()'s exit status? Nah. */
435 if (do_rename(fname
, path
) != 0) {
443 /* Returns 0 on successful rename, 1 if we successfully copied the file
444 * across filesystems, -2 if copy_file() failed, and -1 on other errors.
445 * If partialptr is not NULL and we need to do a copy, copy the file into
446 * the active partial-dir instead of over the destination file. */
447 int robust_rename(const char *from
, const char *to
, const char *partialptr
,
453 if (do_rename(from
, to
) == 0)
459 if (robust_unlink(to
) != 0) {
468 if (!handle_partial_dir(partialptr
,PDIR_CREATE
))
472 if (copy_file(from
, to
, -1, mode
) != 0)
483 static pid_t all_pids
[10];
486 /** Fork and record the pid of the child. **/
489 pid_t newpid
= fork();
491 if (newpid
!= 0 && newpid
!= -1) {
492 all_pids
[num_pids
++] = newpid
;
500 * @todo It would be kind of nice to make sure that they are actually
501 * all our children before we kill them, because their pids may have
502 * been recycled by some other process. Perhaps when we wait for a
503 * child, we should remove it from this array. Alternatively we could
504 * perhaps use process groups, but I think that would not work on
505 * ancient Unix versions that don't support them.
507 void kill_all(int sig
)
511 for (i
= 0; i
< num_pids
; i
++) {
512 /* Let's just be a little careful where we
513 * point that gun, hey? See kill(2) for the
514 * magic caused by negative values. */
515 pid_t p
= all_pids
[i
];
526 /** Lock a byte range in a open file */
527 int lock_range(int fd
, int offset
, int len
)
531 lock
.l_type
= F_WRLCK
;
532 lock
.l_whence
= SEEK_SET
;
533 lock
.l_start
= offset
;
537 return fcntl(fd
,F_SETLK
,&lock
) == 0;
540 #define ENSURE_MEMSPACE(buf, type, sz, req) \
541 if ((req) > sz && !(buf = realloc_array(buf, type, sz = MAX(sz * 2, req)))) \
542 out_of_memory("glob_expand")
544 static inline void call_glob_match(const char *name
, int len
, int from_glob
,
545 char *arg
, int abpos
, int fbpos
);
547 static struct glob_data
{
548 char *arg_buf
, *filt_buf
, **argv
;
549 int absize
, fbsize
, maxargs
, argc
;
552 static void glob_match(char *arg
, int abpos
, int fbpos
)
557 while (*arg
== '.' && arg
[1] == '/') {
559 ENSURE_MEMSPACE(glob
.filt_buf
, char, glob
.fbsize
, glob
.absize
);
560 memcpy(glob
.filt_buf
, glob
.arg_buf
, abpos
+ 1);
563 ENSURE_MEMSPACE(glob
.arg_buf
, char, glob
.absize
, abpos
+ 3);
564 glob
.arg_buf
[abpos
++] = *arg
++;
565 glob
.arg_buf
[abpos
++] = *arg
++;
566 glob
.arg_buf
[abpos
] = '\0';
568 if ((slash
= strchr(arg
, '/')) != NULL
) {
573 if (strpbrk(arg
, "*?[")) {
577 if (!(d
= opendir(abpos
? glob
.arg_buf
: ".")))
579 while ((di
= readdir(d
)) != NULL
) {
580 char *dname
= d_name(di
);
581 if (dname
[0] == '.' && (dname
[1] == '\0'
582 || (dname
[1] == '.' && dname
[2] == '\0')))
584 if (!wildmatch(arg
, dname
))
586 call_glob_match(dname
, strlen(dname
), 1,
587 slash
? arg
+ len
+ 1 : NULL
,
592 call_glob_match(arg
, len
, 0,
593 slash
? arg
+ len
+ 1 : NULL
,
600 static inline void call_glob_match(const char *name
, int len
, int from_glob
,
601 char *arg
, int abpos
, int fbpos
)
605 ENSURE_MEMSPACE(glob
.arg_buf
, char, glob
.absize
, abpos
+ len
+ 2);
606 memcpy(glob
.arg_buf
+ abpos
, name
, len
);
608 glob
.arg_buf
[abpos
] = '\0';
611 ENSURE_MEMSPACE(glob
.filt_buf
, char, glob
.fbsize
, fbpos
+ len
+ 2);
612 memcpy(glob
.filt_buf
+ fbpos
, name
, len
);
614 glob
.filt_buf
[fbpos
] = '\0';
615 use_buf
= glob
.filt_buf
;
617 use_buf
= glob
.arg_buf
;
619 if (from_glob
|| (arg
&& len
)) {
623 if (do_stat(glob
.arg_buf
, &st
) != 0)
625 is_dir
= S_ISDIR(st
.st_mode
) != 0;
629 if (daemon_filter_list
.head
630 && check_filter(&daemon_filter_list
, FLOG
, use_buf
, is_dir
) < 0)
635 glob
.arg_buf
[abpos
++] = '/';
636 glob
.arg_buf
[abpos
] = '\0';
638 glob
.filt_buf
[fbpos
++] = '/';
639 glob
.filt_buf
[fbpos
] = '\0';
641 glob_match(arg
, abpos
, fbpos
);
643 ENSURE_MEMSPACE(glob
.argv
, char *, glob
.maxargs
, glob
.argc
+ 1);
644 if (!(glob
.argv
[glob
.argc
++] = strdup(glob
.arg_buf
)))
645 out_of_memory("glob_match");
649 /* This routine performs wild-card expansion of the pathname in "arg". Any
650 * daemon-excluded files/dirs will not be matched by the wildcards. Returns 0
651 * if a wild-card string is the only returned item (due to matching nothing). */
652 int glob_expand(const char *arg
, char ***argv_p
, int *argc_p
, int *maxargs_p
)
661 memset(&glob
, 0, sizeof glob
);
666 s
= sanitize_path(NULL
, arg
, "", 0, SP_KEEP_DOT_DIRS
);
670 out_of_memory("glob_expand");
671 clean_fname(s
, CFN_KEEP_DOT_DIRS
672 | CFN_KEEP_TRAILING_SLASH
673 | CFN_COLLAPSE_DOT_DOT_DIRS
);
676 ENSURE_MEMSPACE(glob
.arg_buf
, char, glob
.absize
, MAXPATHLEN
);
677 *glob
.arg_buf
= '\0';
679 glob
.argc
= save_argc
= *argc_p
;
681 glob
.maxargs
= *maxargs_p
;
683 ENSURE_MEMSPACE(glob
.argv
, char *, glob
.maxargs
, 100);
685 glob_match(s
, 0, -1);
687 /* The arg didn't match anything, so add the failed arg to the list. */
688 if (glob
.argc
== save_argc
) {
689 ENSURE_MEMSPACE(glob
.argv
, char *, glob
.maxargs
, glob
.argc
+ 1);
690 glob
.argv
[glob
.argc
++] = s
;
697 *maxargs_p
= glob
.maxargs
;
704 /* This routine is only used in daemon mode. */
705 void glob_expand_module(char *base1
, char *arg
, char ***argv_p
, int *argc_p
, int *maxargs_p
)
709 int base_len
= strlen(base
);
714 if (strncmp(arg
, base
, base_len
) == 0)
717 if (!(arg
= strdup(arg
)))
718 out_of_memory("glob_expand_module");
720 if (asprintf(&base
," %s/", base1
) <= 0)
721 out_of_memory("glob_expand_module");
724 for (s
= arg
; *s
; s
= p
+ base_len
) {
725 if ((p
= strstr(s
, base
)) != NULL
)
726 *p
= '\0'; /* split it at this point */
727 glob_expand(s
, argv_p
, argc_p
, maxargs_p
);
737 * Convert a string to lower case
739 void strlower(char *s
)
748 /* Join strings p1 & p2 into "dest" with a guaranteed '/' between them. (If
749 * p1 ends with a '/', no extra '/' is inserted.) Returns the length of both
750 * strings + 1 (if '/' was inserted), regardless of whether the null-terminated
751 * string fits into destsize. */
752 size_t pathjoin(char *dest
, size_t destsize
, const char *p1
, const char *p2
)
754 size_t len
= strlcpy(dest
, p1
, destsize
);
755 if (len
< destsize
- 1) {
756 if (!len
|| dest
[len
-1] != '/')
758 if (len
< destsize
- 1)
759 len
+= strlcpy(dest
+ len
, p2
, destsize
- len
);
766 len
+= strlen(p2
) + 1; /* Assume we'd insert a '/'. */
770 /* Join any number of strings together, putting them in "dest". The return
771 * value is the length of all the strings, regardless of whether the null-
772 * terminated whole fits in destsize. Your list of string pointers must end
773 * with a NULL to indicate the end of the list. */
774 size_t stringjoin(char *dest
, size_t destsize
, ...)
780 va_start(ap
, destsize
);
782 if (!(src
= va_arg(ap
, const char *)))
789 memcpy(dest
, src
, len
);
800 int count_dir_elements(const char *p
)
802 int cnt
= 0, new_component
= 1;
805 new_component
= (*p
!= '.' || (p
[1] != '/' && p
[1] != '\0'));
806 else if (new_component
) {
814 /* Turns multiple adjacent slashes into a single slash (possible exception:
815 * the preserving of two leading slashes at the start), drops all leading or
816 * interior "." elements unless CFN_KEEP_DOT_DIRS is flagged. Will also drop
817 * a trailing '.' after a '/' if CFN_DROP_TRAILING_DOT_DIR is flagged, removes
818 * a trailing slash (perhaps after removing the aforementioned dot) unless
819 * CFN_KEEP_TRAILING_SLASH is flagged, and will also collapse ".." elements
820 * (except at the start) if CFN_COLLAPSE_DOT_DOT_DIRS is flagged. If the
821 * resulting name would be empty, returns ".". */
822 unsigned int clean_fname(char *name
, int flags
)
824 char *limit
= name
- 1, *t
= name
, *f
= name
;
830 if ((anchored
= *f
== '/') != 0) {
833 /* If there are exactly 2 slashes at the start, preserve
834 * them. Would break daemon excludes unless the paths are
835 * really treated differently, so used this sparingly. */
836 if (*f
== '/' && f
[1] != '/')
839 } else if (flags
& CFN_KEEP_DOT_DIRS
&& *f
== '.' && f
[1] == '/') {
844 /* discard extra slashes */
850 /* discard interior "." dirs */
851 if (f
[1] == '/' && !(flags
& CFN_KEEP_DOT_DIRS
)) {
855 if (f
[1] == '\0' && flags
& CFN_DROP_TRAILING_DOT_DIR
)
857 /* collapse ".." dirs */
858 if (flags
& CFN_COLLAPSE_DOT_DOT_DIRS
859 && f
[1] == '.' && (f
[2] == '/' || !f
[2])) {
861 if (s
== name
&& anchored
) {
865 while (s
> limit
&& *--s
!= '/') {}
866 if (s
!= t
- 1 && (s
< name
|| *s
== '/')) {
874 while (*f
&& (*t
++ = *f
++) != '/') {}
877 if (t
> name
+anchored
&& t
[-1] == '/' && !(flags
& CFN_KEEP_TRAILING_SLASH
))
886 /* Make path appear as if a chroot had occurred. This handles a leading
887 * "/" (either removing it or expanding it) and any leading or embedded
888 * ".." components that attempt to escape past the module's top dir.
890 * If dest is NULL, a buffer is allocated to hold the result. It is legal
891 * to call with the dest and the path (p) pointing to the same buffer, but
892 * rootdir will be ignored to avoid expansion of the string.
894 * The rootdir string contains a value to use in place of a leading slash.
895 * Specify NULL to get the default of "module_dir".
897 * The depth var is a count of how many '..'s to allow at the start of the
900 * We also clean the path in a manner similar to clean_fname() but with a
903 * Turns multiple adjacent slashes into a single slash, gets rid of "." dir
904 * elements (INCLUDING a trailing dot dir), PRESERVES a trailing slash, and
905 * ALWAYS collapses ".." elements (except for those at the start of the
906 * string up to "depth" deep). If the resulting name would be empty,
907 * change it into a ".". */
908 char *sanitize_path(char *dest
, const char *p
, const char *rootdir
, int depth
,
912 int rlen
= 0, drop_dot_dirs
= !relative_paths
|| !(flags
& SP_KEEP_DOT_DIRS
);
915 int plen
= strlen(p
);
918 rootdir
= module_dir
;
919 rlen
= strlen(rootdir
);
924 if (rlen
+ plen
+ 1 >= MAXPATHLEN
)
926 } else if (!(dest
= new_array(char, rlen
+ plen
+ 1)))
927 out_of_memory("sanitize_path");
929 memcpy(dest
, rootdir
, rlen
);
936 while (*p
== '.' && p
[1] == '/')
940 start
= sanp
= dest
+ rlen
;
941 /* This loop iterates once per filename component in p, pointing at
942 * the start of the name (past any prior slash) for each iteration. */
944 /* discard leading or extra slashes */
950 if (*p
== '.' && (p
[1] == '/' || p
[1] == '\0')) {
951 /* skip "." component */
956 if (*p
== '.' && p
[1] == '.' && (p
[2] == '/' || p
[2] == '\0')) {
957 /* ".." component followed by slash or end */
958 if (depth
<= 0 || sanp
!= start
) {
961 /* back up sanp one level */
962 --sanp
; /* now pointing at slash */
963 while (sanp
> start
&& sanp
[-1] != '/')
968 /* allow depth levels of .. at the beginning */
970 /* move the virtual beginning to leave the .. alone */
973 /* copy one component through next slash */
974 while (*p
&& (*sanp
++ = *p
++) != '/') {}
977 /* ended up with nothing, so put in "." component */
985 /* Like chdir(), but it keeps track of the current directory (in the
986 * global "curr_dir"), and ensures that the path size doesn't overflow.
987 * Also cleans the path using the clean_fname() function. */
988 int change_dir(const char *dir
, int set_path_only
)
990 static int initialised
;
995 if (getcwd(curr_dir
, sizeof curr_dir
- 1) == NULL
) {
996 rsyserr(FERROR
, errno
, "getcwd()");
997 exit_cleanup(RERR_FILESELECT
);
999 curr_dir_len
= strlen(curr_dir
);
1002 if (!dir
) /* this call was probably just to initialize */
1006 if (len
== 1 && *dir
== '.')
1010 if (len
>= sizeof curr_dir
) {
1011 errno
= ENAMETOOLONG
;
1014 if (!set_path_only
&& chdir(dir
))
1016 memcpy(curr_dir
, dir
, len
+ 1);
1018 if (curr_dir_len
+ 1 + len
>= sizeof curr_dir
) {
1019 errno
= ENAMETOOLONG
;
1022 curr_dir
[curr_dir_len
] = '/';
1023 memcpy(curr_dir
+ curr_dir_len
+ 1, dir
, len
+ 1);
1025 if (!set_path_only
&& chdir(curr_dir
)) {
1026 curr_dir
[curr_dir_len
] = '\0';
1031 curr_dir_len
= clean_fname(curr_dir
, CFN_COLLAPSE_DOT_DOT_DIRS
);
1032 if (sanitize_paths
) {
1033 if (module_dirlen
> curr_dir_len
)
1034 module_dirlen
= curr_dir_len
;
1035 curr_dir_depth
= count_dir_elements(curr_dir
+ module_dirlen
);
1038 if (DEBUG_GTE(CHDIR
, 1) && !set_path_only
)
1039 rprintf(FINFO
, "[%s] change_dir(%s)\n", who_am_i(), curr_dir
);
1044 /* This will make a relative path absolute and clean it up via clean_fname().
1045 * Returns the string, which might be newly allocated, or NULL on error. */
1046 char *normalize_path(char *path
, BOOL force_newbuf
, unsigned int *len_ptr
)
1050 if (*path
!= '/') { /* Make path absolute. */
1051 int len
= strlen(path
);
1052 if (curr_dir_len
+ 1 + len
>= sizeof curr_dir
)
1054 curr_dir
[curr_dir_len
] = '/';
1055 memcpy(curr_dir
+ curr_dir_len
+ 1, path
, len
+ 1);
1056 if (!(path
= strdup(curr_dir
)))
1057 out_of_memory("normalize_path");
1058 curr_dir
[curr_dir_len
] = '\0';
1059 } else if (force_newbuf
) {
1060 if (!(path
= strdup(path
)))
1061 out_of_memory("normalize_path");
1064 len
= clean_fname(path
, CFN_COLLAPSE_DOT_DOT_DIRS
| CFN_DROP_TRAILING_DOT_DIR
);
1073 * Return a quoted string with the full pathname of the indicated filename.
1074 * The string " (in MODNAME)" may also be appended. The returned pointer
1075 * remains valid until the next time full_fname() is called.
1077 char *full_fname(const char *fn
)
1079 static char *result
= NULL
;
1089 p1
= curr_dir
+ module_dirlen
;
1090 for (p2
= p1
; *p2
== '/'; p2
++) {}
1094 if (module_id
>= 0) {
1096 m2
= lp_name(module_id
);
1101 if (asprintf(&result
, "\"%s%s%s\"%s%s%s", p1
, p2
, fn
, m1
, m2
, m3
) <= 0)
1102 out_of_memory("full_fname");
1107 static char partial_fname
[MAXPATHLEN
];
1109 char *partial_dir_fname(const char *fname
)
1111 char *t
= partial_fname
;
1112 int sz
= sizeof partial_fname
;
1115 if ((fn
= strrchr(fname
, '/')) != NULL
) {
1117 if (*partial_dir
!= '/') {
1118 int len
= fn
- fname
;
1119 strncpy(t
, fname
, len
); /* safe */
1125 if ((int)pathjoin(t
, sz
, partial_dir
, fn
) >= sz
)
1127 if (daemon_filter_list
.head
) {
1128 t
= strrchr(partial_fname
, '/');
1130 if (check_filter(&daemon_filter_list
, FLOG
, partial_fname
, 1) < 0)
1133 if (check_filter(&daemon_filter_list
, FLOG
, partial_fname
, 0) < 0)
1137 return partial_fname
;
1140 /* If no --partial-dir option was specified, we don't need to do anything
1141 * (the partial-dir is essentially '.'), so just return success. */
1142 int handle_partial_dir(const char *fname
, int create
)
1146 if (fname
!= partial_fname
)
1148 if (!create
&& *partial_dir
== '/')
1150 if (!(fn
= strrchr(partial_fname
, '/')))
1154 dir
= partial_fname
;
1157 int statret
= do_lstat(dir
, &st
);
1158 if (statret
== 0 && !S_ISDIR(st
.st_mode
)) {
1159 if (do_unlink(dir
) < 0) {
1165 if (statret
< 0 && do_mkdir(dir
, 0700) < 0) {
1176 /* Determine if a symlink points outside the current directory tree.
1177 * This is considered "unsafe" because e.g. when mirroring somebody
1178 * else's machine it might allow them to establish a symlink to
1179 * /etc/passwd, and then read it through a web server.
1181 * Returns 1 if unsafe, 0 if safe.
1183 * Null symlinks and absolute symlinks are always unsafe.
1185 * Basically here we are concerned with symlinks whose target contains
1186 * "..", because this might cause us to walk back up out of the
1187 * transferred directory. We are not allowed to go back up and
1190 * "dest" is the target of the symlink in question.
1192 * "src" is the top source directory currently applicable at the level
1193 * of the referenced symlink. This is usually the symlink's full path
1194 * (including its name), as referenced from the root of the transfer. */
1195 int unsafe_symlink(const char *dest
, const char *src
)
1197 const char *name
, *slash
;
1200 /* all absolute and null symlinks are unsafe */
1201 if (!dest
|| !*dest
|| *dest
== '/')
1204 /* find out what our safety margin is */
1205 for (name
= src
; (slash
= strchr(name
, '/')) != 0; name
= slash
+1) {
1206 /* ".." segment starts the count over. "." segment is ignored. */
1207 if (*name
== '.' && (name
[1] == '/' || (name
[1] == '.' && name
[2] == '/'))) {
1212 while (slash
[1] == '/') slash
++; /* just in case src isn't clean */
1214 if (*name
== '.' && name
[1] == '.' && name
[2] == '\0')
1217 for (name
= dest
; (slash
= strchr(name
, '/')) != 0; name
= slash
+1) {
1218 if (*name
== '.' && (name
[1] == '/' || (name
[1] == '.' && name
[2] == '/'))) {
1219 if (name
[1] == '.') {
1220 /* if at any point we go outside the current directory
1221 then stop - it is unsafe */
1227 while (slash
[1] == '/') slash
++;
1229 if (*name
== '.' && name
[1] == '.' && name
[2] == '\0')
1235 /* Return the date and time as a string. Some callers tweak returned buf. */
1236 char *timestring(time_t t
)
1238 static char TimeBuf
[200];
1239 struct tm
*tm
= localtime(&t
);
1242 #ifdef HAVE_STRFTIME
1243 strftime(TimeBuf
, sizeof TimeBuf
- 1, "%Y/%m/%d %H:%M:%S", tm
);
1245 strlcpy(TimeBuf
, asctime(tm
), sizeof TimeBuf
);
1248 if ((p
= strchr(TimeBuf
, '\n')) != NULL
)
1255 * Sleep for a specified number of milliseconds.
1257 * Always returns TRUE. (In the future it might return FALSE if
1263 struct timeval tval
, t1
, t2
;
1265 gettimeofday(&t1
, NULL
);
1268 tval
.tv_sec
= (t
-tdiff
)/1000;
1269 tval
.tv_usec
= 1000*((t
-tdiff
)%1000);
1272 select(0,NULL
,NULL
, NULL
, &tval
);
1274 gettimeofday(&t2
, NULL
);
1275 tdiff
= (t2
.tv_sec
- t1
.tv_sec
)*1000 +
1276 (t2
.tv_usec
- t1
.tv_usec
)/1000;
1282 /* Determine if two time_t values are equivalent (either exact, or in
1283 * the modification timestamp window established by --modify-window).
1285 * @retval 0 if the times should be treated as the same
1287 * @retval +1 if the first is later
1289 * @retval -1 if the 2nd is later
1291 int cmp_time(time_t file1
, time_t file2
)
1293 if (file2
> file1
) {
1294 if (file2
- file1
<= modify_window
)
1298 if (file1
- file2
<= modify_window
)
1308 This routine is a trick to immediately catch errors when debugging
1309 with insure. A xterm with a gdb is popped up when insure catches
1310 a error. It is Linux specific.
1312 int _Insure_trap_error(int a1
, int a2
, int a3
, int a4
, int a5
, int a6
)
1318 asprintf(&cmd
, "/usr/X11R6/bin/xterm -display :0 -T Panic -n Panic -e /bin/sh -c 'cat /tmp/ierrs.*.%d ; gdb /proc/%d/exe %d'",
1319 getpid(), getpid(), getpid());
1323 h
= dlopen("/usr/local/parasoft/insure++lite/lib.linux2/libinsure.so", RTLD_LAZY
);
1324 fn
= dlsym(h
, "_Insure_trap_error");
1327 ret
= fn(a1
, a2
, a3
, a4
, a5
, a6
);
1337 #define MALLOC_MAX 0x40000000
1339 void *_new_array(unsigned long num
, unsigned int size
, int use_calloc
)
1341 if (num
>= MALLOC_MAX
/size
)
1343 return use_calloc
? calloc(num
, size
) : malloc(num
* size
);
1346 void *_realloc_array(void *ptr
, unsigned int size
, size_t num
)
1348 if (num
>= MALLOC_MAX
/size
)
1351 return malloc(size
* num
);
1352 return realloc(ptr
, size
* num
);
1355 /* Take a filename and filename length and return the most significant
1356 * filename suffix we can find. This ignores suffixes such as "~",
1357 * ".bak", ".orig", ".~1~", etc. */
1358 const char *find_filename_suffix(const char *fn
, int fn_len
, int *len_ptr
)
1360 const char *suf
, *s
;
1364 /* One or more dots at the start aren't a suffix. */
1365 while (fn_len
&& *fn
== '.') fn
++, fn_len
--;
1367 /* Ignore the ~ in a "foo~" filename. */
1368 if (fn_len
> 1 && fn
[fn_len
-1] == '~')
1369 fn_len
--, had_tilde
= True
;
1373 /* Assume we don't find an suffix. */
1377 /* Find the last significant suffix. */
1378 for (s
= fn
+ fn_len
; fn_len
> 1; ) {
1379 while (*--s
!= '.' && s
!= fn
) {}
1382 s_len
= fn_len
- (s
- fn
);
1385 if (strcmp(s
+1, "bak") == 0
1386 || strcmp(s
+1, "old") == 0)
1388 } else if (s_len
== 5) {
1389 if (strcmp(s
+1, "orig") == 0)
1391 } else if (s_len
> 2 && had_tilde
1392 && s
[1] == '~' && isDigit(s
+ 2))
1398 /* Determine if the suffix is all digits. */
1399 for (s
++, s_len
--; s_len
> 0; s
++, s_len
--) {
1403 /* An all-digit suffix may not be that signficant. */
1410 /* This is an implementation of the Levenshtein distance algorithm. It
1411 * was implemented to avoid needing a two-dimensional matrix (to save
1412 * memory). It was also tweaked to try to factor in the ASCII distance
1413 * between changed characters as a minor distance quantity. The normal
1414 * Levenshtein units of distance (each signifying a single change between
1415 * the two strings) are defined as a "UNIT". */
1417 #define UNIT (1 << 16)
1419 uint32
fuzzy_distance(const char *s1
, unsigned len1
, const char *s2
, unsigned len2
)
1421 uint32 a
[MAXPATHLEN
], diag
, above
, left
, diag_inc
, above_inc
, left_inc
;
1425 if (!len1
|| !len2
) {
1430 for (i1
= 0, cost
= 0; i1
< len1
; i1
++)
1432 return (int32
)len1
* UNIT
+ cost
;
1435 for (i2
= 0; i2
< len2
; i2
++)
1436 a
[i2
] = (i2
+1) * UNIT
;
1438 for (i1
= 0; i1
< len1
; i1
++) {
1440 above
= (i1
+1) * UNIT
;
1441 for (i2
= 0; i2
< len2
; i2
++) {
1443 if ((cost
= *((uchar
*)s1
+i1
) - *((uchar
*)s2
+i2
)) != 0) {
1449 diag_inc
= diag
+ cost
;
1450 left_inc
= left
+ UNIT
+ *((uchar
*)s1
+i1
);
1451 above_inc
= above
+ UNIT
+ *((uchar
*)s2
+i2
);
1452 a
[i2
] = above
= left
< above
1453 ? (left_inc
< diag_inc
? left_inc
: diag_inc
)
1454 : (above_inc
< diag_inc
? above_inc
: diag_inc
);
1462 #define BB_SLOT_SIZE (16*1024) /* Desired size in bytes */
1463 #define BB_PER_SLOT_BITS (BB_SLOT_SIZE * 8) /* Number of bits per slot */
1464 #define BB_PER_SLOT_INTS (BB_SLOT_SIZE / 4) /* Number of int32s per slot */
1471 struct bitbag
*bitbag_create(int max_ndx
)
1473 struct bitbag
*bb
= new(struct bitbag
);
1474 bb
->slot_cnt
= (max_ndx
+ BB_PER_SLOT_BITS
- 1) / BB_PER_SLOT_BITS
;
1476 if (!(bb
->bits
= (uint32
**)calloc(bb
->slot_cnt
, sizeof (uint32
*))))
1477 out_of_memory("bitbag_create");
1482 void bitbag_set_bit(struct bitbag
*bb
, int ndx
)
1484 int slot
= ndx
/ BB_PER_SLOT_BITS
;
1485 ndx
%= BB_PER_SLOT_BITS
;
1487 if (!bb
->bits
[slot
]) {
1488 if (!(bb
->bits
[slot
] = (uint32
*)calloc(BB_PER_SLOT_INTS
, 4)))
1489 out_of_memory("bitbag_set_bit");
1492 bb
->bits
[slot
][ndx
/32] |= 1u << (ndx
% 32);
1495 #if 0 /* not needed yet */
1496 void bitbag_clear_bit(struct bitbag
*bb
, int ndx
)
1498 int slot
= ndx
/ BB_PER_SLOT_BITS
;
1499 ndx
%= BB_PER_SLOT_BITS
;
1501 if (!bb
->bits
[slot
])
1504 bb
->bits
[slot
][ndx
/32] &= ~(1u << (ndx
% 32));
1507 int bitbag_check_bit(struct bitbag
*bb
, int ndx
)
1509 int slot
= ndx
/ BB_PER_SLOT_BITS
;
1510 ndx
%= BB_PER_SLOT_BITS
;
1512 if (!bb
->bits
[slot
])
1515 return bb
->bits
[slot
][ndx
/32] & (1u << (ndx
% 32)) ? 1 : 0;
1519 /* Call this with -1 to start checking from 0. Returns -1 at the end. */
1520 int bitbag_next_bit(struct bitbag
*bb
, int after
)
1523 int i
, ndx
= after
+ 1;
1524 int slot
= ndx
/ BB_PER_SLOT_BITS
;
1525 ndx
%= BB_PER_SLOT_BITS
;
1527 mask
= (1u << (ndx
% 32)) - 1;
1528 for (i
= ndx
/ 32; slot
< bb
->slot_cnt
; slot
++, i
= mask
= 0) {
1529 if (!bb
->bits
[slot
])
1531 for ( ; i
< BB_PER_SLOT_INTS
; i
++, mask
= 0) {
1532 if (!(bits
= bb
->bits
[slot
][i
] & ~mask
))
1534 /* The xor magic figures out the lowest enabled bit in
1535 * bits, and the switch quickly computes log2(bit). */
1536 switch (bits
^ (bits
& (bits
-1))) {
1537 #define LOG2(n) case 1u << n: return slot*BB_PER_SLOT_BITS + i*32 + n
1538 LOG2(0); LOG2(1); LOG2(2); LOG2(3);
1539 LOG2(4); LOG2(5); LOG2(6); LOG2(7);
1540 LOG2(8); LOG2(9); LOG2(10); LOG2(11);
1541 LOG2(12); LOG2(13); LOG2(14); LOG2(15);
1542 LOG2(16); LOG2(17); LOG2(18); LOG2(19);
1543 LOG2(20); LOG2(21); LOG2(22); LOG2(23);
1544 LOG2(24); LOG2(25); LOG2(26); LOG2(27);
1545 LOG2(28); LOG2(29); LOG2(30); LOG2(31);
1547 return -1; /* impossible... */
1554 void flist_ndx_push(flist_ndx_list
*lp
, int ndx
)
1556 struct flist_ndx_item
*item
;
1558 if (!(item
= new(struct flist_ndx_item
)))
1559 out_of_memory("flist_ndx_push");
1563 lp
->tail
->next
= item
;
1569 int flist_ndx_pop(flist_ndx_list
*lp
)
1571 struct flist_ndx_item
*next
;
1577 ndx
= lp
->head
->ndx
;
1578 next
= lp
->head
->next
;
1587 void *expand_item_list(item_list
*lp
, size_t item_size
,
1588 const char *desc
, int incr
)
1590 /* First time through, 0 <= 0, so list is expanded. */
1591 if (lp
->malloced
<= lp
->count
) {
1593 size_t new_size
= lp
->malloced
;
1595 new_size
+= -incr
; /* increase slowly */
1596 else if (new_size
< (size_t)incr
)
1600 if (new_size
< lp
->malloced
)
1601 overflow_exit("expand_item_list");
1602 /* Using _realloc_array() lets us pass the size, not a type. */
1603 new_ptr
= _realloc_array(lp
->items
, item_size
, new_size
);
1604 if (DEBUG_GTE(FLIST
, 3)) {
1605 rprintf(FINFO
, "[%s] expand %s to %s bytes, did%s move\n",
1606 who_am_i(), desc
, big_num(new_size
* item_size
),
1607 new_ptr
== lp
->items
? " not" : "");
1610 out_of_memory("expand_item_list");
1612 lp
->items
= new_ptr
;
1613 lp
->malloced
= new_size
;
1615 return (char*)lp
->items
+ (lp
->count
++ * item_size
);