X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/cb13abfed024d0320c0aa865ad652c946321df3c..c36cd3171366e13b6b5d50e2c3a2c7269cd8e89c:/util.c?ds=sidebyside
diff --git a/util.c b/util.c
index 974e8651..4382300e 100644
--- a/util.c
+++ b/util.c
@@ -26,33 +26,6 @@
extern int verbose;
-/****************************************************************************
-Set a fd into nonblocking mode. Uses POSIX O_NONBLOCK if available,
-else
-if SYSV use O_NDELAY
-if BSD use FNDELAY
-****************************************************************************/
-int set_nonblocking(int fd)
-{
- int val;
-#ifdef O_NONBLOCK
-#define FLAG_TO_SET O_NONBLOCK
-#else
-#ifdef SYSV
-#define FLAG_TO_SET O_NDELAY
-#else /* BSD */
-#define FLAG_TO_SET FNDELAY
-#endif
-#endif
-
- if((val = fcntl(fd, F_GETFL, 0)) == -1)
- return -1;
- val |= FLAG_TO_SET;
- return fcntl( fd, F_SETFL, val);
-#undef FLAG_TO_SET
-}
-
-
/* this is taken from CVS */
int piped_child(char **command,int *f_in,int *f_out)
{
@@ -101,9 +74,6 @@ int piped_child(char **command,int *f_in,int *f_out)
*f_in = from_child_pipe[0];
*f_out = to_child_pipe[1];
- set_nonblocking(*f_in);
- set_nonblocking(*f_out);
-
return pid;
}
@@ -282,7 +252,7 @@ int copy_file(char *source, char *dest, mode_t mode)
char buf[1024 * 8];
int len; /* Number of bytes read into `buf'. */
- ifd = open(source, O_RDONLY);
+ ifd = do_open(source, O_RDONLY, 0);
if (ifd == -1) {
rprintf(FERROR,"open %s: %s\n",
source,strerror(errno));
@@ -397,17 +367,6 @@ int robust_rename(char *from, char *to)
return -1;
return do_rename(from, to);
#endif
- }
-
-
-/* sleep for a while via select */
-void u_sleep(int usec)
-{
- struct timeval tv;
-
- tv.tv_sec = 0;
- tv.tv_usec = usec;
- select(0, NULL, NULL, NULL, &tv);
}
@@ -639,13 +598,18 @@ void clean_fname(char *name)
* 1. remove leading "/" (or replace with "." if at end)
* 2. remove leading ".." components (except those allowed by "reldir")
* 3. delete any other "
/.." (recursively)
- * If "reldir" is non-null, it is a sanitized directory that the path will be
- * relative to, so allow as many ".." at the beginning of the path as
- * there are components in reldir.
+ * Can only shrink paths, so sanitizes in place.
* While we're at it, remove double slashes and "." components like
* clean_fname does(), but DON'T remove a trailing slash because that
* is sometimes significant on command line arguments.
- * Can only shrink paths, so sanitizes in place.
+ * If "reldir" is non-null, it is a sanitized directory that the path will be
+ * relative to, so allow as many ".." at the beginning of the path as
+ * there are components in reldir. This is used for symbolic link targets.
+ * If reldir is non-null and the path began with "/", to be completely like
+ * a chroot we should add in depth levels of ".." at the beginning of the
+ * path, but that would blow the assumption that the path doesn't grow and
+ * it is not likely to end up being a valid symlink anyway, so just do
+ * the normal removal of the leading "/" instead.
* Contributed by Dave Dykstra
*/
@@ -723,6 +687,12 @@ void sanitize_path(char *p, char *reldir)
}
if ((sanp == start) && !allowdotdot) {
/* ended up with nothing, so put in "." component */
+ /*
+ * note that the !allowdotdot doesn't prevent this from
+ * happening in all allowed ".." situations, but I didn't
+ * think it was worth putting in an extra variable to ensure
+ * it since an extra "." won't hurt in those situations.
+ */
*sanp++ = '.';
}
*sanp = '\0';
@@ -797,12 +767,12 @@ int u_strcmp(const char *cs1, const char *cs2)
static OFF_T last_ofs;
-void end_progress(void)
+void end_progress(OFF_T size)
{
extern int do_progress, am_server;
if (do_progress && !am_server) {
- rprintf(FINFO,"\n");
+ rprintf(FINFO,"%.0f (100%%)\n", (double)size);
}
last_ofs = 0;
}
@@ -889,3 +859,15 @@ char *timestring(time_t t)
return(TimeBuf);
}
+
+/****************************************************************************
+ like waitpid but does the WEXITSTATUS
+****************************************************************************/
+#ifndef WEXITSTATUS
+#define WEXITSTATUS(stat) ((int)(((stat)>>8)&0xFF))
+#endif
+void wait_process(pid_t pid, int *status)
+{
+ waitpid(pid, status, 0);
+ *status = WEXITSTATUS(*status);
+}