added the --safe-links option to disallow symlinks outside the
[rsync/rsync.git] / util.c
diff --git a/util.c b/util.c
index 11e4a9d..15ab69d 100644 (file)
--- a/util.c
+++ b/util.c
   */
 #include "rsync.h"
 
-int num_waiting(int fd)
+/****************************************************************************
+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 len=0;
-  ioctl(fd,FIONREAD,&len);
-  return(len);
+       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)
 {
@@ -206,7 +224,7 @@ int create_directory_path(char *fname)
 
    derived from GNU C's cccp.c.
 */
-int full_write(int desc, char *ptr, int len)
+static int full_write(int desc, char *ptr, int len)
 {
        int total_written;
        
@@ -653,3 +671,42 @@ int pop_dir(char *dir)
 
        return 0;
 }
+
+/* we need to supply our own strcmp function for file list comparisons
+   to ensure that signed/unsigned usage is consistent between machines. */
+int u_strcmp(const char *cs1, const char *cs2)
+{
+       const uchar *s1 = (uchar *)cs1;
+       const uchar *s2 = (uchar *)cs2;
+
+       while (*s1 && *s2 && (*s1 == *s2)) {
+               s1++; s2++;
+       }
+       
+       return (int)*s1 - (int)*s2;
+}
+
+static OFF_T last_ofs;
+
+void end_progress(void)
+{
+       extern int do_progress, am_server;
+
+       if (do_progress && !am_server) {
+               rprintf(FINFO,"\n");
+       }
+       last_ofs = 0;
+}
+
+void show_progress(OFF_T ofs, OFF_T size)
+{
+       extern int do_progress, am_server;
+
+       if (do_progress && !am_server) {
+               if (ofs > last_ofs + 1000) {
+                       int pct = (int)((100.0*ofs)/size);
+                       rprintf(FINFO,"%.0f (%d%%)\r", (double)ofs, pct);
+                       last_ofs = ofs;
+               }
+       }
+}