Mercurial > trustbridge
diff common/listutil.c @ 22:bc302bbceaf5
Move listutil again
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Thu, 20 Feb 2014 15:44:09 +0000 |
parents | cinst/listutil.c@f4f957c58e0a |
children | e783fd99a9eb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/listutil.c Thu Feb 20 15:44:09 2014 +0000 @@ -0,0 +1,138 @@ +#include "listutil.h" + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <string.h> + +#define MAX_FILESIZE_KB 1024 + +void handle_errno() +{ + printf("Error: %s \n", strerror(errno)); +} + +list_status_t readList(const char *fileName, char **data, size_t *size) +{ + int fd = -1; + struct stat fileStat; + int rc = 0; + ssize_t bRead = 0; + + memset(&fileStat, 0, sizeof(fileStat)); + + list_status_t retval = UnknownError; + + fd = open(fileName, O_RDONLY); + if (fd == -1) { + handle_errno(); + retval = StatFailed; + goto cleanup; + } + + rc = fstat(fd, &fileStat); + if (rc < 0) { + printf ("Stat failed with rc: %i\n", rc); + retval = StatFailed; + goto cleanup; + } + + // Check the size of the file + if (!fileStat.st_size) { + printf("Size zero\n"); + retval = StatFailed; + goto cleanup; + } + + if (fileStat.st_size / 1024 > MAX_FILESIZE_KB && + fileStat.st_size > 0) { + printf("File too large\n"); + retval = TooLarge; + goto cleanup; + } + + *size = (size_t) fileStat.st_size; + + *data = (char*) malloc(*size); + + if (*data == NULL) { + printf("Malloc failed\n"); + retval = UnknownError; + goto cleanup; + } + + bRead = read(fd, *data, *size); + + if (bRead < 0 || (size_t) bRead != *size) { + printf("Read failed\n"); + if (bRead == -1) { + handle_errno(); + } + retval = UnknownError; + *size = 0; + if (*data) { + free(*data); + printf("Nulling data\n"); + *data = NULL; + } + goto cleanup; + } + + retval = UnknownValidity; +cleanup: + + if (fd && fd != -1) { + close(fd); + fd = -1; + } + + return retval; +} + +list_status_t readAndVerifyList(const char *fileName, char **data, size_t *size) +{ +// int validSig = 0; + char * signature = NULL; + + list_status_t retval = UnknownError; + *data = NULL; + *size = 0; + + retval = readList(fileName, data, size); + + if (retval != UnknownValidity) { + printf ("Readlist failed\n"); + return retval; + } + + if (!data || !*size) { + // should not have happend if readList works as specified + return UnknownError; + } + + signature = *data; + + if (*signature != 'S') { + printf("Does not start with S\n"); + retval = InvalidFormat; + goto cleanup; + } + +// TODO VERIFIY +retval = Valid; + +// Maybe check if all bytes are < 127 and > 0 + +cleanup: + if (retval != Valid && *data) { + free(*data); + *data = NULL; + *size = 0; + } + return retval; +} +