X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/3e607d23543f0f3fb7b72953b89334071540667f..79a51e7ee68097b98bc2234b70d16c011bdc3608:/util.c diff --git a/util.c b/util.c index d9c87ece..6470bf97 100644 --- a/util.c +++ b/util.c @@ -32,90 +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 HAVE_MMAP - if (len < MAX_MAP_SIZE) { - ret->map = (char *)mmap(NULL,len,PROT_READ,MAP_SHARED,fd,0); - if (ret->map == (char *)-1) { - ret->map = NULL; - } - } -#endif - return ret; -} - - -char *map_ptr(struct map_struct *map,OFF_T offset,int len) -{ - int nread; - - if (map->map) - return map->map+offset; - - if (len == 0) - return NULL; - - if (len > (map->size-offset)) - len = map->size-offset; - - 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 HAVE_MMAP - if (map->map) - munmap(map->map,map->size); -#endif - if (map->p) free(map->p); - free(map); -} - /* this is taken from CVS */ int piped_child(char **command,int *f_in,int *f_out) @@ -261,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 @@ -558,10 +444,11 @@ static void glob_expand_one(char *s, char **argv, int *argc, int maxargs) #endif } -void glob_expand(char *base, char **argv, int *argc, int maxargs) +void glob_expand(char *base1, char **argv, int *argc, int maxargs) { char *s = argv[*argc]; char *p, *q; + char *base = base1; if (!s || !*s) return; @@ -572,21 +459,23 @@ void glob_expand(char *base, char **argv, int *argc, int maxargs) s = strdup(s); if (!s) out_of_memory("glob_expand"); + base = (char *)malloc(strlen(base1)+3); + if (!base) out_of_memory("glob_expand"); + + sprintf(base," %s/", base1); + q = s; while ((p = strstr(q,base)) && ((*argc) < maxargs)) { - if (p != q && *(p-1) == ' ' && p[strlen(base)] == '/') { - /* split it at this point */ - *(p-1) = 0; - glob_expand_one(q, argv, argc, maxargs); - q = p+strlen(base)+1; - } else { - q++; - } + /* split it at this point */ + *p = 0; + glob_expand_one(q, argv, argc, maxargs); + q = p+strlen(base); } if (*q && (*argc < maxargs)) glob_expand_one(q, argv, argc, maxargs); free(s); + free(base); } /******************************************************************* @@ -633,26 +522,19 @@ int vslprintf(char *str, int n, const char *format, va_list ap) buf = malloc(len); if (!buf) { /* can't call debug or we would recurse */ - exit(1); + exit_cleanup(1); } } - ret = vsprintf(buf, format, ap); - - if (ret < 0) { - str[0] = 0; - return -1; - } - - if (ret < n) { - n = ret; - } else if (ret > n) { - ret = -1; + vsprintf(buf, format, ap); + ret = strlen(buf); + if (ret > n) { + /* yikes! */ + exit_cleanup(1); } - - buf[n] = 0; + buf[ret] = 0; - memcpy(str, buf, n+1); + memcpy(str, buf, ret+1); return ret; #endif @@ -670,3 +552,10 @@ int slprintf(char *str, int n, char *format, ...) va_end(ap); return ret; } + + +void *Realloc(void *p, int size) +{ + if (!p) return (void *)malloc(size); + return (void *)realloc(p, size); +}