From ff9511c1fa21a15adf8243b0f493ee1ac397b9cb Mon Sep 17 00:00:00 2001 From: Michal Bloch Date: Tue, 20 Mar 2018 12:08:01 +0100 Subject: [PATCH] Storage format keeps cached tag length It has to be done at some point anyway, so do it once and be done with it forever (previously each util reparsed the message on its own). It's also progress towards unifying the two "entry" structures. Change-Id: I17f7ef2675070c228c764743a53e0a64892dd2cb Signed-off-by: Michal Bloch --- include/queued_entry.h | 1 + src/shared/logprint.c | 28 +++++++--------------------- src/shared/queued_entry.c | 26 ++++++++++++++++++++------ 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/include/queued_entry.h b/include/queued_entry.h index e38554a..083369e 100644 --- a/include/queued_entry.h +++ b/include/queued_entry.h @@ -33,6 +33,7 @@ struct logger_entry { int32_t nsec_recv_mono; /* time received, nanoseconds, monotonic */ int32_t sec_recv_real; /* time received, seconds, realtime */ int32_t nsec_recv_real; /* time received, nanoseconds, realtime*/ + int32_t tag_len; char msg[]; /* the entry's payload */ }; diff --git a/src/shared/logprint.c b/src/shared/logprint.c index e2e07c1..e1d1537 100644 --- a/src/shared/logprint.c +++ b/src/shared/logprint.c @@ -558,8 +558,6 @@ int log_add_filter_tid(log_format *p_format, pthread_t tid) int log_process_log_buffer(const struct logger_entry *entry_raw, log_entry *entry) { //TODO: remove and make log_format_log_line just use raw entry directly - int i, start = -1, end = -1; - if (entry_raw->len - sizeof(struct logger_entry) < 3) { fprintf(stderr, "Entry too small\n"); return -1; @@ -580,30 +578,18 @@ int log_process_log_buffer(const struct logger_entry *entry_raw, log_entry *entr entry->priority = (log_priority)pri; entry->tag = entry_raw->msg + 1; - if (!strlen(entry->tag)) { + if (entry_raw->tag_len <= 0) { fprintf(stderr, "No tag message\n"); return -1; } - for (i = 0; i < entry_raw->len; i++) { - if (entry_raw->msg[i] == '\0') { - if (start == -1) { - start = i + 1; - } else { - end = i; - break; - } - } - } - if (start == -1) { - fprintf(stderr, "Malformed log message\n"); - return -1; - } - if (end == -1) - end = entry_raw->len - 1; + const int message_offset = 1 /* prio */ + entry_raw->tag_len + 1 /* NULL delimiter */; + entry->message = entry_raw->msg + message_offset; + entry->messageLen = entry_raw->len - sizeof(struct logger_entry) - message_offset - 1; - entry->message = entry_raw->msg + start; - entry->messageLen = end - start; + // odd-length messages get an extra byte of padding, get rid of that + if (entry->message[entry->messageLen - 1] == '\0') + --entry->messageLen; return 0; } diff --git a/src/shared/queued_entry.c b/src/shared/queued_entry.c index 66f4885..b282907 100644 --- a/src/shared/queued_entry.c +++ b/src/shared/queued_entry.c @@ -135,11 +135,13 @@ int parse_kmsg_message(char *buffer, struct logger_entry_with_msg *lem, int buff lem->header.pid = 0; lem->header.tid = 0; - lem->header.len = 1 + snprintf(lem->msg, sizeof lem->msg - 1, "%c%s", 6, "DEVKMSG"); + lem->header.tag_len = snprintf(lem->msg, sizeof lem->msg - 1, "%c%s", 6, "DEVKMSG") - 1; // minus prio + lem->header.len = lem->header.tag_len + 2; // plus prio and NULL delimiter lem->header.len += 1 + snprintf(lem->msg + lem->header.len, sizeof lem->msg - 1 - lem->header.len, "%s", msg_begin); lem->header.len += sizeof(struct logger_entry); lem->header.padding = 0; + return 0; } @@ -155,6 +157,18 @@ void parse_androidlogger_message(struct android_logger_entry *ale, struct logger const size_t payload_size = dgram_size - sizeof *ale; assert(payload_size <= LOG_MAX_PAYLOAD_SIZE); + le->tag_len = -1; + for (int i = 1 /* 0 is prio */; i < payload_size; ++i) { + if (ale->msg[i] != '\0') + continue; + + le->tag_len = i - 1; + break; + } + if (le->tag_len == -1) + ; // ignore for now + + le->len = sizeof *le + payload_size; le->pid = ale->pid; le->tid = ale->tid; @@ -290,19 +304,19 @@ static void construct_logger_entry_from_syslog(struct logger_entry *le, int prio assert(timestamp); assert(msg); - const int tag_len = strlen(tag) + 1; + le->tag_len = strlen(tag); const int msg_len = strlen(msg) + 1; - le->len = sizeof(struct logger_entry) + tag_len + msg_len + 1; + le->len = sizeof(struct logger_entry) + le->tag_len + 1 + msg_len + 1; le->pid = pid; le->tid = 0; // could be set to PID but this way it's explicit the TID is not known le->sec = mktime(timestamp); le->nsec = 0; // the timestamp does not have such precision le->msg[0] = priority; - char * const tag_begin = le->msg + 1; - char * const msg_begin = tag_begin + tag_len; - memcpy(tag_begin, tag, tag_len); + char *const tag_begin = le->msg + 1; + char *const msg_begin = tag_begin + le->tag_len + 1; + memcpy(tag_begin, tag, le->tag_len + 1); memcpy(msg_begin, msg, msg_len); } -- 2.7.4