From 55ad53d1db08c00f75f6c5100fe9ede7c5e123fe Mon Sep 17 00:00:00 2001 From: Saya Sugiura Date: Wed, 25 Sep 2019 14:42:15 +0900 Subject: shared: Read DLT header until it's found Current dlt_file_read_header() function which is used for e.g. dlt-convert, dlt-sortbytimestamp, etc. stops finding DLT header if it's not available in the next file position. It is improved to read the header in a loop until it's found. Signed-off-by: Saya Sugiura --- src/shared/dlt_common.c | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) (limited to 'src/shared') diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c index e046cc4..d2471ee 100644 --- a/src/shared/dlt_common.c +++ b/src/shared/dlt_common.c @@ -1152,22 +1152,40 @@ DltReturnValue dlt_file_read_header(DltFile *file, int verbose) if (file == NULL) return DLT_RETURN_WRONG_PARAMETER; - /* load header from file */ - if (fread(file->msg.headerbuffer, sizeof(DltStorageHeader) + sizeof(DltStandardHeader), 1, file->handle) != 1) { - if (!feof(file->handle)) - dlt_log(LOG_WARNING, "Cannot read header from file!\n"); + /* Loop until storage header is found */ + while (1) { + /* load header from file */ + if (fread(file->msg.headerbuffer, + sizeof(DltStorageHeader) + sizeof(DltStandardHeader), 1, + file->handle) != 1) { + if (!feof(file->handle)) + dlt_log(LOG_WARNING, "Cannot read header from file!\n"); + else + dlt_log(LOG_DEBUG, "Reached end of file\n"); - return DLT_RETURN_ERROR; - } - /* set ptrs to structures */ - file->msg.storageheader = (DltStorageHeader *)file->msg.headerbuffer; - file->msg.standardheader = (DltStandardHeader *)(file->msg.headerbuffer + sizeof(DltStorageHeader)); + return DLT_RETURN_ERROR; + } - /* check id of storage header */ - if (dlt_check_storageheader(file->msg.storageheader) != DLT_RETURN_TRUE) { - dlt_log(LOG_WARNING, "DLT storage header pattern not found!\n"); - return DLT_RETURN_ERROR; + /* set ptrs to structures */ + file->msg.storageheader = (DltStorageHeader *)file->msg.headerbuffer; + file->msg.standardheader = (DltStandardHeader *)(file->msg.headerbuffer + + sizeof(DltStorageHeader)); + + /* check id of storage header */ + if (dlt_check_storageheader(file->msg.storageheader) != DLT_RETURN_TRUE) { + /* Shift the position back to the place where it stared to read + 1 */ + if (fseek(file->handle, + 1 - (sizeof(DltStorageHeader) + sizeof(DltStandardHeader)), + SEEK_CUR) < 0) { + dlt_log(LOG_WARNING, "DLT storage header pattern not found!\n"); + return DLT_RETURN_ERROR; + } + } + else { + /* storage header is found */ + break; + } } /* calculate complete size of headers */ -- cgit v1.2.1