diff -r d0aa9e0a6d04 -r 51905cfc2bde librazor/util.c --- a/librazor/util.c Thu Feb 09 20:42:08 2012 +0000 +++ b/librazor/util.c Mon Feb 20 19:31:07 2012 +0000 @@ -1,7 +1,7 @@ /* * Copyright (C) 2008 Kristian Høgsberg * Copyright (C) 2008 Red Hat, Inc - * Copyright (C) 2009, 2011 J. Ali Harlow + * Copyright (C) 2009, 2011, 2012 J. Ali Harlow * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -52,54 +52,70 @@ char *program_name = "librazor"; void * -razor_file_get_contents(const char *filename, size_t *length) +zalloc(size_t size) +{ + void *p; + + p = malloc(size); + memset(p, 0, size); + + return p; +} + +void * +razor_file_get_contents(const char *filename, size_t *length, int private, + struct razor_error **error) { int fd; struct stat st; - void *addr; -#if !HAVE_SYS_MMAN_H + void *addr = NULL; size_t nb; ssize_t res; -#endif fd = open(filename, O_RDONLY | O_BINARY); - if (fd < 0) + if (fd < 0) { + razor_set_error(error, filename, strerror(errno)); return NULL; + } if (fstat(fd, &st) < 0) { + razor_set_error(error, filename, strerror(errno)); close(fd); return NULL; } *length = st.st_size; #if HAVE_SYS_MMAN_H - addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); -#else - addr = malloc(st.st_size); - if (addr) { - nb = 0; - while(nb < st.st_size) { - res = read(fd, addr + nb, st.st_size - nb); - if (res <= 0) { - free(addr); - addr = NULL; - break; - } - nb += res; - } + if (!private) { + addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (addr == MAP_FAILED) + addr = NULL; } #endif + if (!addr) { + addr = malloc(st.st_size); + if (addr) { + nb = 0; + while(nb < st.st_size) { + res = read(fd, addr + nb, st.st_size - nb); + if (res <= 0) { + razor_set_error(error, filename, + strerror(errno)); + free(addr); + addr = NULL; + break; + } + nb += res; + } + } else + razor_set_error(error, NULL, "Not enough memory"); + } close(fd); -#if HAVE_SYS_MMAN_H - if (addr == MAP_FAILED) - addr = NULL; -#endif - return addr; } -razor_file_free_contents(void *addr, size_t length) +int razor_file_free_contents(void *addr, size_t length) { #if HAVE_SYS_MMAN_H return munmap(addr, length);