view ui/listutil.c @ 4:9849250f50f2

Start implementation of certificatelist parser
author Andre Heinecke <aheinecke@intevation.de>
date Tue, 11 Feb 2014 16:46:02 +0000
parents
children 992c0ec57660
line wrap: on
line source
#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>

#define MAX_FILESIZE_KB 1024

void handle_errno()
{
    printf("Error: %s \n", strerror(errno));
}

list_status_t readList(char *fileName, void *data, size_t *size)
{
    int fd = -1;
    struct stat fileStat;
    int rc = 0;
    ssize_t bRead = 0;
    list_status_t retval = UnknownError;

    fd = open(fileName, O_RDONLY);
    if (fd == -1) {
        handle_errno();
        retval = StatFailed;
        goto failure;
    }

    rc = fstat(fd, &fileStat);
    if (rc < 0) {
        printf ("Stat failed with rc: %i\n", rc);
        retval = StatFailed;
        goto failure;
    }

    // Check the size of the file
    if (fileStat.st_size) {
        printf("Size zero\n");
        retval = StatFailed;
        goto failure;
    }

    if (fileStat.st_size / 1024 > MAX_FILESIZE_KB ||
            fileStat.st_size >= (size_t)-1) {
        printf("File too large\n");
        retval = TooLarge;
        goto failure;
    }

    // We can cast here as we already checked
    // that this size is not too large for size_t
    *size = (size_t) fileStat.st_size;

    data = malloc(*size);

    if (data == NULL) {
        printf("Malloc failed\n");
        retval = UnknownError;
        goto failure;
    }

    bRead = read(fd, data, *size);

    if (bRead != *size) {
        printf("Read failed");
        if (bRead == -1) {
            handle_errno();
        }
        retval = UnknownError;
        *size = 0;
        if (data) {
            free(data);
            data = NULL;
        }
        goto failure;
    }

    retval = Unknown;
failure:

    if (fd && fd != -1) {
        close(fd);
        fd = -1;
    }

    return retval;
}

list_status_t readAndVerifyList(char *fileName, void *data, size_t *size)
{
    int validSig = 0;
    char * firstChar = NULL;
    int i = 0;

    list_status_t retval = UnknownError;
    data = NULL;
    size = NULL;

    retval = readList(fileName, data, size);

    if (retval != Unknown) {
        return retval;
    }

    if (!data || !size) {
        // should not have happend if readList works as specified
        return UnknownError;
    }

    firstChar = (char*) data;

    if (*firstChar != 'S') {
        printf("Does not start with S\n");
        retval = InvalidFormat;
    }

    for (i=0; i < *size; i++) {
        printf("%c", firstChar + i);
    }

failure:
    if (retval != Valid && data) {
        free(data);
        data = NULL;
        *size = 0;
    }
    return retval;
}

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