/** => zzip_disk_mmap * * This function opens the given archive by name and turn the filehandle * to => zzip_disk_mmap for bringing it to main memory. If it can not * be => mmap(2)'ed then we slurp the whole file into a newly => malloc(2)'ed * memory block. Only if that fails too then we return null. Since handling * of disk->buffer is ambigous it should not be snatched away please. */ zzip__new__ ZZIP_DISK * zzip_disk_open(char *filename) { # ifndef O_BINARY # define O_BINARY 0 # endif struct stat st; if (stat(filename, &st) || ! st.st_size) return 0; ___ int fd = open(filename, O_RDONLY | O_BINARY); if (fd <= 0) return 0; ___ ZZIP_DISK *disk = zzip_disk_mmap(fd); if (disk) return disk; ___ zzip_byte_t *buffer = malloc(st.st_size); if (! buffer) return 0; if ((st.st_size == read(fd, buffer, st.st_size)) && (disk = zzip_disk_new())) { disk->buffer = buffer; disk->endbuf = buffer + st.st_size; disk->mapped = -1; disk->flags |= ZZIP_DISK_FLAGS_OWNED_BUFFER; } else { free(buffer); } return disk; ____; ____; ____; }
/** create new diskdir handle. * wraps underlying zzip_disk_open. */ zzip__new__ ZZIP_MEM_DISK* zzip_mem_disk_fdopen(int fd) { ZZIP_DISK* disk = zzip_disk_mmap(fd); if (! disk) { perror(error[_zzip_mem_disk_fdopen_fail]); return 0; } ___ ZZIP_MEM_DISK* dir = zzip_mem_disk_new(); zzip_mem_disk_load(dir, disk); return dir; ____; }