From ff4b714a9b4401206d1a046b42dd5d3afdf356d8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Petr=20P=C3=ADsa=C5=99?= Date: Sat, 17 Apr 2010 15:30:37 +0200 Subject: [PATCH] test: Add file loading support --- test/test.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ test/test.h | 4 ++++ 2 files changed, 71 insertions(+) diff --git a/test/test.c b/test/test.c index a415ed7..6ff2301 100644 --- a/test/test.c +++ b/test/test.c @@ -6,6 +6,13 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include /* Print formated string into automtically reallocated @uffer. @@ -71,4 +78,64 @@ int test_asprintf(char **buffer, const char *format, ...) { } +int test_mmap_file(const char *file, int *fd, void **buffer, size_t *length) { + struct stat file_info; + + if (!file || !fd || !buffer || !length) return -1; + + + *fd = open(file, O_RDONLY); + if (*fd == -1) { + fprintf(stderr, "%s: Could not open file: %s\n", file, strerror(errno)); + return -1; + } + + if (-1 == fstat(*fd, &file_info)) { + fprintf(stderr, "%s: Could not get file size: %s\n", file, + strerror(errno)); + close(*fd); + return -1; + } + if (file_info.st_size < 0) { + fprintf(stderr, "File `%s' has negative size: %jd\n", file, + (intmax_t) file_info.st_size); + close(*fd); + return -1; + } + *length = file_info.st_size; + + *buffer = mmap(NULL, *length, PROT_READ, MAP_PRIVATE, *fd, 0); + if (*buffer == MAP_FAILED) { + fprintf(stderr, "%s: Could not map file to memory: %s\n", file, + strerror(errno)); + close(*fd); + return -1; + } + + return 0; +} + + +int test_munmap_file(int fd, void *buffer, size_t length) { + int err = 0; + long int page_size = sysconf(_SC_PAGE_SIZE); + size_t pages = (length % page_size) ? + ((length / page_size) + 1) * page_size: + length; + + err = munmap(buffer, pages); + if (err) { + fprintf(stderr, "Could not unmap memory at %p and length %zu: %s\n", + buffer, pages, strerror(errno)); + } + + err = close(fd); + if (err) { + fprintf(stderr, "Could close file descriptor %d: %s\n", fd, + strerror(errno)); + } + + return err; +} + #endif diff --git a/test/test.h b/test/test.h index 076fcc0..df7261d 100644 --- a/test/test.h +++ b/test/test.h @@ -29,6 +29,10 @@ int test_vasprintf(char **buffer, const char *format, va_list ap); int test_asprintf(char **buffer, const char *format, ...); +/* I/O. Return 0, in case of error -1. */ +int test_mmap_file(const char *file, int *fd, void **buffer, size_t *length); +int test_munmap_file(int fd, void *buffer, size_t length); + #define INIT_TEST(name) { \ setlocale(LC_ALL, "C"); \ unit_name = name; \ -- 2.11.4.GIT