aheinecke@4: #include "listutil.h" aheinecke@4: aheinecke@4: #include aheinecke@4: #include aheinecke@4: #include aheinecke@4: #include aheinecke@4: #include aheinecke@4: #include aheinecke@4: #include aheinecke@7: #include aheinecke@4: aheinecke@4: #define MAX_FILESIZE_KB 1024 aheinecke@4: aheinecke@4: void handle_errno() aheinecke@4: { aheinecke@4: printf("Error: %s \n", strerror(errno)); aheinecke@4: } aheinecke@4: aheinecke@7: list_status_t readList(const char *fileName, char **data, size_t *size) aheinecke@4: { aheinecke@4: int fd = -1; aheinecke@4: struct stat fileStat; aheinecke@4: int rc = 0; aheinecke@4: ssize_t bRead = 0; aheinecke@7: aheinecke@7: memset(&fileStat, 0, sizeof(fileStat)); aheinecke@7: aheinecke@4: list_status_t retval = UnknownError; aheinecke@4: aheinecke@4: fd = open(fileName, O_RDONLY); aheinecke@4: if (fd == -1) { aheinecke@4: handle_errno(); aheinecke@4: retval = StatFailed; aheinecke@7: goto cleanup; aheinecke@4: } aheinecke@4: aheinecke@4: rc = fstat(fd, &fileStat); aheinecke@4: if (rc < 0) { aheinecke@4: printf ("Stat failed with rc: %i\n", rc); aheinecke@4: retval = StatFailed; aheinecke@7: goto cleanup; aheinecke@4: } aheinecke@4: aheinecke@4: // Check the size of the file aheinecke@7: if (!fileStat.st_size) { aheinecke@4: printf("Size zero\n"); aheinecke@4: retval = StatFailed; aheinecke@7: goto cleanup; aheinecke@4: } aheinecke@4: aheinecke@7: if (fileStat.st_size / 1024 > MAX_FILESIZE_KB && aheinecke@7: fileStat.st_size > 0) { aheinecke@4: printf("File too large\n"); aheinecke@4: retval = TooLarge; aheinecke@7: goto cleanup; aheinecke@4: } aheinecke@4: aheinecke@4: *size = (size_t) fileStat.st_size; aheinecke@4: aheinecke@7: *data = (char*) malloc(*size); aheinecke@4: aheinecke@4: if (data == NULL) { aheinecke@4: printf("Malloc failed\n"); aheinecke@4: retval = UnknownError; aheinecke@7: goto cleanup; aheinecke@4: } aheinecke@4: aheinecke@7: bRead = read(fd, *data, *size); aheinecke@4: aheinecke@7: if (bRead < 0 || (size_t) bRead != *size) { aheinecke@7: printf("Read failed\n"); aheinecke@4: if (bRead == -1) { aheinecke@4: handle_errno(); aheinecke@4: } aheinecke@4: retval = UnknownError; aheinecke@4: *size = 0; aheinecke@7: if (*data) { aheinecke@7: free(*data); aheinecke@7: printf("Nulling data\n"); aheinecke@7: *data = NULL; aheinecke@4: } aheinecke@7: goto cleanup; aheinecke@4: } aheinecke@4: aheinecke@4: retval = Unknown; aheinecke@7: cleanup: aheinecke@4: aheinecke@4: if (fd && fd != -1) { aheinecke@4: close(fd); aheinecke@4: fd = -1; aheinecke@4: } aheinecke@4: aheinecke@4: return retval; aheinecke@4: } aheinecke@4: aheinecke@7: list_status_t readAndVerifyList(const char *fileName, char **data, size_t *size) aheinecke@4: { aheinecke@7: // int validSig = 0; aheinecke@7: char ** firstChar = NULL; aheinecke@4: aheinecke@4: list_status_t retval = UnknownError; aheinecke@7: *data = NULL; aheinecke@7: *size = 0; aheinecke@4: aheinecke@4: retval = readList(fileName, data, size); aheinecke@4: aheinecke@4: if (retval != Unknown) { aheinecke@7: printf ("Readlist failed\n"); aheinecke@4: return retval; aheinecke@4: } aheinecke@4: aheinecke@7: if (!data || !*size) { aheinecke@4: // should not have happend if readList works as specified aheinecke@7: printf ("No data or no size\n"); aheinecke@7: printf ("%ld\n", (long)data); aheinecke@4: return UnknownError; aheinecke@4: } aheinecke@4: aheinecke@7: firstChar = (char**) data; aheinecke@4: aheinecke@7: if (**firstChar != 'S') { aheinecke@4: printf("Does not start with S\n"); aheinecke@4: retval = InvalidFormat; aheinecke@7: goto cleanup; aheinecke@4: } aheinecke@4: aheinecke@7: // TODO VERIFIY aheinecke@7: retval = Valid; aheinecke@4: aheinecke@7: cleanup: aheinecke@7: if (retval != Valid && *data) { aheinecke@7: free(*data); aheinecke@7: *data = NULL; aheinecke@4: *size = 0; aheinecke@4: } aheinecke@4: return retval; aheinecke@4: } aheinecke@4: