X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/c627d61324e9dcd5df833ee6236dd10415f5bac4..720b47f2611d277684b2ec35d11dc3feedb207fe:/util.c diff --git a/util.c b/util.c index ad4dec95..df60d0a0 100644 --- a/util.c +++ b/util.c @@ -24,86 +24,13 @@ */ #include "rsync.h" -static int total_written = 0; -static int total_read = 0; - -extern int verbose; - -int write_total(void) -{ - return total_written; -} - -int read_total(void) -{ - return total_read; -} - -void write_int(int f,int x) -{ - char b[4]; - SIVAL(b,0,x); - if (write(f,b,4) != 4) { - fprintf(stderr,"write_int failed : %s\n",strerror(errno)); - exit(1); - } - total_written += 4; -} - -void write_buf(int f,char *buf,int len) -{ - if (write(f,buf,len) != len) { - fprintf(stderr,"write_buf failed : %s\n",strerror(errno)); - exit(1); - } - total_written += len; -} - -void write_flush(int f) -{ -} - - -int readfd(int fd,char *buffer,int N) -{ - int ret; - int total=0; - - while (total < N) - { - ret = read(fd,buffer + total,N - total); - - if (ret <= 0) - return total; - total += ret; - } - return total; -} - - -int read_int(int f) -{ - char b[4]; - if (readfd(f,b,4) != 4) { - if (verbose > 1) - fprintf(stderr,"Error reading %d bytes : %s\n",4,strerror(errno)); - exit(1); - } - total_read += 4; - return IVAL(b,0); -} - -void read_buf(int f,char *buf,int len) +int num_waiting(int fd) { - if (readfd(f,buf,len) != len) { - if (verbose > 1) - fprintf(stderr,"Error reading %d bytes : %s\n",len,strerror(errno)); - exit(1); - } - total_read += len; + int len=0; + ioctl(fd,FIONREAD,&len); + return(len); } - char *map_file(int fd,off_t len) { char *ret = (char *)mmap(NULL,len,PROT_READ,MAP_SHARED,fd,0); @@ -112,33 +39,11 @@ char *map_file(int fd,off_t len) void unmap_file(char *buf,off_t len) { - if (len > 0) + if (len > 0 && buf) munmap(buf,len); } -int read_write(int fd_in,int fd_out,int size) -{ - static char *buf=NULL; - static int bufsize = WRITE_BLOCK_SIZE; - int total=0; - - if (!buf) { - buf = (char *)malloc(bufsize); - if (!buf) out_of_memory("read_write"); - } - - while (total < size) { - int n = MIN(size-total,bufsize); - read_buf(fd_in,buf,n); - if (write(fd_out,buf,n) != n) - return total; - total += n; - } - return total; -} - - /* this is taken from CVS */ int piped_child(char **command,int *f_in,int *f_out) { @@ -227,3 +132,34 @@ int set_modtime(char *fname,time_t modtime) return utimes(fname,t); #endif } + + + +/**************************************************************************** +Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available, +else +if SYSV use O_NDELAY +if BSD use FNDELAY +****************************************************************************/ +int set_blocking(int fd, int set) +{ + 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; + if(set) /* Turn blocking on - ie. clear nonblock flag */ + val &= ~FLAG_TO_SET; + else + val |= FLAG_TO_SET; + return fcntl( fd, F_SETFL, val); +#undef FLAG_TO_SET +}