Ejemplo n.º 1
0
/** => 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;
    ____;
    ____;
    ____;
}
Ejemplo n.º 2
0
/** 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; ____;
}