diff options
author | Andrew Tridgell <tridge@samba.org> | 1998-05-27 12:37:22 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 1998-05-27 12:37:22 +0000 |
commit | 4c36ddbeecdde407c870109d70527640ca127ace (patch) | |
tree | 40c6f7c9e288d48045d2b2959943cf976a584c22 /util.c | |
parent | 2b6b4d539b0aab98b1cbb9d8c639cb12473aae94 (diff) | |
download | rsync-4c36ddbeecdde407c870109d70527640ca127ace.tar.gz rsync-4c36ddbeecdde407c870109d70527640ca127ace.tar.bz2 rsync-4c36ddbeecdde407c870109d70527640ca127ace.zip |
heaps of cleanup in the io code.
we no longer use non-blocking IO, instead it uses select a lot more,
being careful to always allow for reading whenever a valid read fd is
available and chcking timeouts.
also split the file io calls into fileio.c
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 155 |
1 files changed, 0 insertions, 155 deletions
@@ -32,131 +32,6 @@ int num_waiting(int fd) } -struct map_struct *map_file(int fd,OFF_T len) -{ - struct map_struct *ret; - ret = (struct map_struct *)malloc(sizeof(*ret)); - if (!ret) out_of_memory("map_file"); - - ret->map = NULL; - ret->fd = fd; - ret->size = len; - ret->p = NULL; - ret->p_size = 0; - ret->p_offset = 0; - ret->p_len = 0; - -#ifdef USE_MMAP - len = MIN(len, MAX_MAP_SIZE); - ret->map = (char *)do_mmap(NULL,len,PROT_READ,MAP_SHARED,fd,0); - if (ret->map == (char *)-1) { - ret->map = NULL; - } else { - ret->p_len = len; - } -#endif - return ret; -} - - -char *map_ptr(struct map_struct *map,OFF_T offset,int len) -{ - int nread; - - if (len == 0) - return NULL; - - if (len > (map->size-offset)) - len = map->size-offset; - -#ifdef USE_MMAP - if (map->map) { - if (offset >= map->p_offset && - offset+len <= map->p_offset+map->p_len) { - return (map->map + (offset - map->p_offset)); - } - if (munmap(map->map, map->p_len) != 0) { - rprintf(FERROR,"munmap failed : %s\n", strerror(errno)); - exit_cleanup(1); - } - - /* align the mmap region on a nice boundary back a bit from - where it is asked for to allow for some seeking */ - if (offset > 2*CHUNK_SIZE) { - map->p_offset = offset - 2*CHUNK_SIZE; - map->p_offset &= ~((OFF_T)(CHUNK_SIZE-1)); - } else { - map->p_offset = 0; - } - - /* map up to MAX_MAP_SIZE */ - map->p_len = MAX(len, MAX_MAP_SIZE); - map->p_len = MIN(map->p_len, map->size - map->p_offset); - - map->map = (char *)do_mmap(NULL,map->p_len,PROT_READ, - MAP_SHARED,map->fd,map->p_offset); - - if (map->map == (char *)-1) { - map->map = NULL; - map->p_len = 0; - map->p_offset = 0; - } else { - return (map->map + (offset - map->p_offset)); - } - } -#endif - - if (offset >= map->p_offset && - offset+len <= map->p_offset+map->p_len) { - return (map->p + (offset - map->p_offset)); - } - - len = MAX(len,CHUNK_SIZE); - if (len > (map->size-offset)) - len = map->size-offset; - - if (len > map->p_size) { - if (map->p) free(map->p); - map->p = (char *)malloc(len); - if (!map->p) out_of_memory("map_ptr"); - map->p_size = len; - } - - map->p_offset = offset; - map->p_len = len; - - if (do_lseek(map->fd,offset,SEEK_SET) != offset) { - rprintf(FERROR,"lseek failed in map_ptr\n"); - exit_cleanup(1); - } - - if ((nread=read(map->fd,map->p,len)) != len) { - if (nread < 0) nread = 0; - /* the best we can do is zero the buffer - the file - has changed mid transfer! */ - memset(map->p+nread, 0, len - nread); - } - - return map->p; -} - - -void unmap_file(struct map_struct *map) -{ -#ifdef USE_MMAP - if (map->map) { - munmap(map->map,map->p_len); - map->map = NULL; - } -#endif - if (map->p) { - free(map->p); - map->p = NULL; - } - memset(map, 0, sizeof(*map)); - free(map); -} - /* this is taken from CVS */ int piped_child(char **command,int *f_in,int *f_out) @@ -302,36 +177,6 @@ int set_modtime(char *fname,time_t modtime) } - -/**************************************************************************** -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 -} - /**************************************************************************** create any necessary directories in fname. Unfortunately we don't know what perms to give the directory when this is called so we need to rely |