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;
+}
+

http://wald.intevation.org/projects/trustbridge/