2 Copyright (C) Andrew Tridgell 1996
3 Copyright (C) Paul Mackerras 1996
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 Utilities used in rsync
27 /****************************************************************************
28 Set a fd into nonblocking mode. Uses POSIX O_NONBLOCK if available,
32 ****************************************************************************/
33 int set_nonblocking(int fd)
37 #define FLAG_TO_SET O_NONBLOCK
40 #define FLAG_TO_SET O_NDELAY
42 #define FLAG_TO_SET FNDELAY
46 if((val = fcntl(fd, F_GETFL, 0)) == -1)
49 return fcntl( fd, F_SETFL, val);
54 /* this is taken from CVS */
55 int piped_child(char **command,int *f_in,int *f_out)
59 int from_child_pipe[2];
61 if (pipe(to_child_pipe) < 0 ||
62 pipe(from_child_pipe) < 0) {
63 rprintf(FERROR,"pipe: %s\n",strerror(errno));
70 rprintf(FERROR,"fork: %s\n",strerror(errno));
76 extern int orig_umask;
77 if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 ||
78 close(to_child_pipe[1]) < 0 ||
79 close(from_child_pipe[0]) < 0 ||
80 dup2(from_child_pipe[1], STDOUT_FILENO) < 0) {
81 rprintf(FERROR,"Failed to dup/close : %s\n",strerror(errno));
84 if (to_child_pipe[0] != STDIN_FILENO) close(to_child_pipe[0]);
85 if (from_child_pipe[1] != STDOUT_FILENO) close(from_child_pipe[1]);
87 execvp(command[0], command);
88 rprintf(FERROR,"Failed to exec %s : %s\n",
89 command[0],strerror(errno));
93 if (close(from_child_pipe[1]) < 0 ||
94 close(to_child_pipe[0]) < 0) {
95 rprintf(FERROR,"Failed to close : %s\n",strerror(errno));
99 *f_in = from_child_pipe[0];
100 *f_out = to_child_pipe[1];
102 set_nonblocking(*f_in);
103 set_nonblocking(*f_out);
108 int local_child(int argc, char **argv,int *f_in,int *f_out)
111 int to_child_pipe[2];
112 int from_child_pipe[2];
114 if (pipe(to_child_pipe) < 0 ||
115 pipe(from_child_pipe) < 0) {
116 rprintf(FERROR,"pipe: %s\n",strerror(errno));
123 rprintf(FERROR,"fork: %s\n",strerror(errno));
128 extern int am_sender;
129 extern int am_server;
131 am_sender = !am_sender;
134 if (dup2(to_child_pipe[0], STDIN_FILENO) < 0 ||
135 close(to_child_pipe[1]) < 0 ||
136 close(from_child_pipe[0]) < 0 ||
137 dup2(from_child_pipe[1], STDOUT_FILENO) < 0) {
138 rprintf(FERROR,"Failed to dup/close : %s\n",strerror(errno));
141 if (to_child_pipe[0] != STDIN_FILENO) close(to_child_pipe[0]);
142 if (from_child_pipe[1] != STDOUT_FILENO) close(from_child_pipe[1]);
143 start_server(STDIN_FILENO, STDOUT_FILENO, argc, argv);
146 if (close(from_child_pipe[1]) < 0 ||
147 close(to_child_pipe[0]) < 0) {
148 rprintf(FERROR,"Failed to close : %s\n",strerror(errno));
152 *f_in = from_child_pipe[0];
153 *f_out = to_child_pipe[1];
160 void out_of_memory(char *str)
162 rprintf(FERROR,"ERROR: out of memory in %s\n",str);
166 void overflow(char *str)
168 rprintf(FERROR,"ERROR: buffer overflow in %s\n",str);
174 int set_modtime(char *fname,time_t modtime)
177 if (dry_run) return 0;
181 tbuf.actime = time(NULL);
182 tbuf.modtime = modtime;
183 return utime(fname,&tbuf);
184 #elif defined(HAVE_UTIME)
188 return utime(fname,t);
191 t[0].tv_sec = time(NULL);
193 t[1].tv_sec = modtime;
195 return utimes(fname,t);
201 /****************************************************************************
202 create any necessary directories in fname. Unfortunately we don't know
203 what perms to give the directory when this is called so we need to rely
205 ****************************************************************************/
206 int create_directory_path(char *fname)
208 extern int orig_umask;
211 while (*fname == '/') fname++;
212 while (strncmp(fname,"./",2)==0) fname += 2;
215 while ((p=strchr(p,'/'))) {
217 do_mkdir(fname,0777 & ~orig_umask);
225 /* Write LEN bytes at PTR to descriptor DESC, retrying if interrupted.
226 Return LEN upon success, write's (negative) error code otherwise.
228 derived from GNU C's cccp.c.
230 static int full_write(int desc, char *ptr, int len)
236 int written = write (desc, ptr, len);
244 total_written += written;
248 return total_written;
251 /* Read LEN bytes at PTR from descriptor DESC, retrying if interrupted.
252 Return the actual number of bytes read, zero for EOF, or negative
255 derived from GNU C's cccp.c. */
256 int safe_read(int desc, char *ptr, int len)
265 n_chars = read(desc, ptr, len);
266 } while (n_chars < 0 && errno == EINTR);
268 n_chars = read(desc, ptr, len);
275 /* copy a file - this is used in conjunction with the --temp-dir option */
276 int copy_file(char *source, char *dest, mode_t mode)
281 int len; /* Number of bytes read into `buf'. */
283 ifd = open(source, O_RDONLY);
285 rprintf(FERROR,"open %s: %s\n",
286 source,strerror(errno));
290 if (do_unlink(dest) && errno != ENOENT) {
291 rprintf(FERROR,"unlink %s: %s\n",
292 dest,strerror(errno));
296 ofd = do_open(dest, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, mode);
298 rprintf(FERROR,"open %s: %s\n",
299 dest,strerror(errno));
304 while ((len = safe_read(ifd, buf, sizeof(buf))) > 0) {
305 if (full_write(ofd, buf, len) < 0) {
306 rprintf(FERROR,"write %s: %s\n",
307 dest,strerror(errno));
318 rprintf(FERROR,"read %s: %s\n",
319 source,strerror(errno));
326 /* sleep for a while via select */
327 void u_sleep(int usec)
333 select(0, NULL, NULL, NULL, &tv);
337 static pid_t all_pids[10];
340 /* fork and record the pid of the child */
343 pid_t newpid = fork();
346 all_pids[num_pids++] = newpid;
351 /* kill all children */
352 void kill_all(int sig)
355 for (i=0;i<num_pids;i++) {
356 if (all_pids[i] != getpid())
357 kill(all_pids[i], sig);
361 /* like strncpy but does not 0 fill the buffer and always null
362 terminates (thus it can use maxlen+1 space in d) */
363 void strlcpy(char *d, char *s, int maxlen)
366 if (len > maxlen) len = maxlen;
371 /* like strncat but does not 0 fill the buffer and always null
372 terminates (thus it can use maxlen+1 space in d) */
373 void strlcat(char *d, char *s, int maxlen)
375 int len1 = strlen(d);
376 int len2 = strlen(s);
377 if (len1+len2 > maxlen) {
381 memcpy(d+len1, s, len2);
386 /* turn a user name into a uid */
387 int name_to_uid(char *name, uid_t *uid)
390 if (!name || !*name) return 0;
391 pass = getpwnam(name);
399 /* turn a group name into a gid */
400 int name_to_gid(char *name, gid_t *gid)
403 if (!name || !*name) return 0;
404 grp = getgrnam(name);
413 /****************************************************************************
414 check if a process exists.
415 ****************************************************************************/
416 int process_exists(int pid)
418 return(kill(pid,0) == 0 || errno != ESRCH);
421 /* lock a byte range in a open file */
422 int lock_range(int fd, int offset, int len)
426 lock.l_type = F_WRLCK;
427 lock.l_whence = SEEK_SET;
428 lock.l_start = offset;
432 return fcntl(fd,F_SETLK,&lock) == 0;
436 static void glob_expand_one(char *s, char **argv, int *argc, int maxargs)
440 argv[*argc] = strdup(s);
449 argv[*argc] = strdup(s);
451 memset(&globbuf, 0, sizeof(globbuf));
452 glob(argv[*argc], 0, NULL, &globbuf);
453 if (globbuf.gl_pathc == 0) {
458 for (i=0; i<(maxargs - (*argc)) && i<globbuf.gl_pathc;i++) {
459 if (i == 0) free(argv[*argc]);
460 argv[(*argc) + i] = strdup(globbuf.gl_pathv[i]);
461 if (!argv[(*argc) + i]) out_of_memory("glob_expand");
468 void glob_expand(char *base1, char **argv, int *argc, int maxargs)
470 char *s = argv[*argc];
474 if (!s || !*s) return;
476 if (strncmp(s, base, strlen(base)) == 0) {
481 if (!s) out_of_memory("glob_expand");
483 base = (char *)malloc(strlen(base1)+3);
484 if (!base) out_of_memory("glob_expand");
486 sprintf(base," %s/", base1);
489 while ((p = strstr(q,base)) && ((*argc) < maxargs)) {
490 /* split it at this point */
492 glob_expand_one(q, argv, argc, maxargs);
496 if (*q && (*argc < maxargs)) glob_expand_one(q, argv, argc, maxargs);
502 /*******************************************************************
503 convert a string to lower case
504 ********************************************************************/
505 void strlower(char *s)
508 if (isupper(*s)) *s = tolower(*s);
513 /* this is like vsnprintf but the 'n' limit does not include
514 the terminating null. So if you have a 1024 byte buffer then
516 int vslprintf(char *str, int n, const char *format, va_list ap)
518 #ifdef HAVE_VSNPRINTF
519 int ret = vsnprintf(str, n, format, ap);
520 if (ret > n || ret < 0) {
528 static int len=MAXPATHLEN*8;
531 /* this code is NOT a proper vsnprintf() implementation. It
532 relies on the fact that all calls to slprintf() in rsync
533 pass strings which have already been checked to be less
534 than MAXPATHLEN in length and never more than 2 strings are
535 concatenated. This means the above buffer is absolutely
536 ample and can never be overflowed.
538 In the future we would like to replace this with a proper
539 vsnprintf() implementation but right now we need a solution
540 that is secure and portable. This is it. */
545 /* can't call debug or we would recurse */
550 vsprintf(buf, format, ap);
558 memcpy(str, buf, ret+1);
565 /* like snprintf but always null terminates */
566 int slprintf(char *str, int n, char *format, ...)
571 va_start(ap, format);
572 ret = vslprintf(str,n,format,ap);
578 void *Realloc(void *p, int size)
580 if (!p) return (void *)malloc(size);
581 return (void *)realloc(p, size);
585 void clean_fname(char *name)
596 if ((p=strstr(name,"/./"))) {
604 if ((p=strstr(name,"//"))) {
612 if (strncmp(p=name,"./",2) == 0) {
620 if (l > 1 && p[l-1] == '/') {
628 static char curr_dir[MAXPATHLEN];
630 /* like chdir() but can be reversed with pop_dir() if save is set. It
631 is also much faster as it remembers where we have been */
632 char *push_dir(char *dir, int save)
634 char *ret = curr_dir;
635 static int initialised;
639 getcwd(curr_dir, sizeof(curr_dir)-1);
642 if (chdir(dir)) return NULL;
645 ret = strdup(curr_dir);
649 strlcpy(curr_dir, dir, sizeof(curr_dir)-1);
651 strlcat(curr_dir,"/", sizeof(curr_dir)-1);
652 strlcat(curr_dir,dir, sizeof(curr_dir)-1);
655 clean_fname(curr_dir);
660 /* reverse a push_dir call */
661 int pop_dir(char *dir)
671 strlcpy(curr_dir, dir, sizeof(curr_dir)-1);
678 /* we need to supply our own strcmp function for file list comparisons
679 to ensure that signed/unsigned usage is consistent between machines. */
680 int u_strcmp(const char *cs1, const char *cs2)
682 const uchar *s1 = (uchar *)cs1;
683 const uchar *s2 = (uchar *)cs2;
685 while (*s1 && *s2 && (*s1 == *s2)) {
689 return (int)*s1 - (int)*s2;
692 static OFF_T last_ofs;
694 void end_progress(void)
696 extern int do_progress, am_server;
698 if (do_progress && !am_server) {
704 void show_progress(OFF_T ofs, OFF_T size)
706 extern int do_progress, am_server;
708 if (do_progress && !am_server) {
709 if (ofs > last_ofs + 1000) {
710 int pct = (int)((100.0*ofs)/size);
711 rprintf(FINFO,"%.0f (%d%%)\r", (double)ofs, pct);
717 /* determine if a symlink points outside the current directory tree */
718 int unsafe_symlink(char *dest, char *src)
723 /* all absolute and null symlinks are unsafe */
724 if (!dest || !(*dest) || (*dest == '/')) return 1;
727 if (!src) out_of_memory("unsafe_symlink");
729 /* find out what our safety margin is */
730 for (tok=strtok(src,"/"); tok; tok=strtok(NULL,"/")) {
731 if (strcmp(tok,"..") == 0) {
733 } else if (strcmp(tok,".") == 0) {
741 /* drop by one to account for the filename portion */
745 if (!dest) out_of_memory("unsafe_symlink");
747 for (tok=strtok(dest,"/"); tok; tok=strtok(NULL,"/")) {
748 if (strcmp(tok,"..") == 0) {
750 } else if (strcmp(tok,".") == 0) {
755 /* if at any point we go outside the current directory then
756 stop - it is unsafe */
757 if (depth < 0) break;