char* log_buffer_get_message(const struct logger_entry *entry);
/**
- * Returns priority of a log entry
- *
- * Finds the priority in entry's payload and returns it
- */
-log_priority log_buffer_get_priority(const struct logger_entry *entry);
-
-/**
* Formats a log message into a buffer
*
* Uses defaultBuffer if it can, otherwise malloc()'s a new buffer
struct logger_entry {
uint16_t len; /* length of the payload */
- uint16_t padding;/* padding for alignment */
+ uint8_t priority; /* entry's priority*/
+ uint8_t padding;/* padding for alignment */
int32_t pid; /* generating process's pid */
int32_t tid; /* generating process's tid */
int32_t sec; /* seconds since Epoch, time sent */
log_priority prio;
tag = log_buffer_get_tag(entry);
- prio = log_buffer_get_priority(entry);
+ prio = (log_priority)entry->priority;
for (p_curFilter = p_format->filters; p_curFilter != NULL; p_curFilter = p_curFilter->p_next) {
switch (p_curFilter->type) {
*/
char* log_buffer_get_tag(const struct logger_entry *entry)
{
- if (entry->len - sizeof(struct logger_entry) < 3) {
+ if (entry->len - sizeof(struct logger_entry) < 2) {
fprintf(stderr, "Entry too small\n");
return NULL;
}
- return (char*)entry->msg + 1; /* tag is right after priority byte */
+ return (char*)entry->msg;
}
-
/**
* @brief Return pointer to log entry message
* @details Finds the beginning of a log message in entry's payload and returns it
*/
char* log_buffer_get_message(const struct logger_entry *entry)
{
- if (entry->len - sizeof(struct logger_entry) < 3) {
+ if (entry->len - sizeof(struct logger_entry) < 2) {
fprintf(stderr, "Entry too small\n");
return NULL;
}
- return (char*)entry->msg + 1 /* prio */ + entry->tag_len + 1 /* NULL delimiter */;
-}
-
-/**
- * @brief Return priority of a log entry
- * @details Finds the priority in entry's payload and returns it
- * @param[in] entry The log entry
- * @return Priority of a log entry
- */
-log_priority log_buffer_get_priority(const struct logger_entry *entry)
-{
- const unsigned char pri = entry->msg[0]; // cannot cast to log_priority directly because then the compiler is allowed to optimize the below check out
-
- if (entry->len - sizeof(struct logger_entry) < 3) {
- fprintf(stderr, "Entry too small\n");
- return DLOG_UNKNOWN;
- }
-
- if (pri > DLOG_SILENT) {
- fprintf(stderr, "Wrong priority message, %u but should be <%u\n", pri, DLOG_SILENT);
- return DLOG_UNKNOWN;
- }
- return (log_priority)pri;
+ return (char*)entry->msg + entry->tag_len + 1 /* NULL delimiter */;
}
/**
char *tag, *msg;
char * ret = NULL;
- priChar = filter_pri_to_char(log_buffer_get_priority(entry));
+ priChar = filter_pri_to_char((log_priority)entry->priority);
tag = log_buffer_get_tag(entry);
msg = log_buffer_get_message(entry);
char *p;
size_t bufferSize;
const char *pm;
- int message_len = entry->len - sizeof(struct logger_entry) - entry->tag_len - 1 /* prio */ - 2 /* tag and msg delimiters */;
+ int message_len = entry->len - sizeof(struct logger_entry) - entry->tag_len - 2 /* tag and msg delimiters */;
// odd-length messages get an extra byte of padding, get rid of that
if (*(msg + message_len - 1) == '\0')
--message_len;
lem->header.pid = 0;
lem->header.tid = 0;
- 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.priority = 6;
+ lem->header.tag_len = snprintf(lem->msg, sizeof lem->msg - 1, "%s", "DEVKMSG");
+ lem->header.len = lem->header.tag_len + 1; // plus 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);
assert(payload_size <= LOG_MAX_PAYLOAD_SIZE);
le->tag_len = -1;
+ le->priority = ale->msg[0];
for (int i = 1 /* 0 is prio */; i < payload_size; ++i) {
if (ale->msg[i] != '\0')
continue;
le->tid = ale->tid;
le->sec = ale->sec_sent;
le->nsec = ale->nsec_sent;
- memmove(le->msg, ale->msg, payload_size);
+ memmove(le->msg, ale->msg + 1, payload_size - 1);
}
void parse_pipe_message(struct pipe_logger_entry *ple, struct logger_entry *le, size_t msg_size)
le->tag_len = strlen(tag);
const int msg_len = strlen(msg) + 1;
- le->len = sizeof(struct logger_entry) + le->tag_len + 1 + msg_len + 1;
+ le->len = sizeof(struct logger_entry) + le->tag_len + 1 + msg_len;
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;
+ le->priority = priority;
- 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);
+ char *const msg_begin = le->msg + le->tag_len + 1;
+ memcpy(le->msg, tag, le->tag_len + 1);
memcpy(msg_begin, msg, msg_len);
}
{
struct logger_entry_with_msg entry;
- entry.msg[1] = '\0'; /* empty tag */
- entry.msg[2] = '\0'; /* empty msg */
+ entry.msg[0] = '\0'; /* empty tag */
+ entry.msg[1] = '\0'; /* empty msg */
+ entry.header.tag_len = 0;
entry.header.pid = 0;
entry.header.tid = tid;
- entry.header.len = sizeof(struct logger_entry) + 3;
+ entry.header.priority = DLOG_DEBUG; // priority, for unmatched entries that have to face the global filter
+ entry.header.len = sizeof(struct logger_entry) + 2;
- entry.msg[0] = DLOG_DEBUG; // priority, for unmatched entries that have to face the global filter
if (expected != log_should_print_line(p_format, &entry.header)) {
printf("Check in line %d for tid %lu failed to return %d \n", line, tid,
expected);
{
struct logger_entry_with_msg entry;
- entry.msg[1] = '\0'; /* empty tag */
- entry.msg[2] = '\0'; /* empty msg */
+ entry.msg[0] = '\0'; /* empty tag */
+ entry.msg[1] = '\0'; /* empty msg */
+ entry.header.tag_len = 0;
entry.header.tid = 0;
entry.header.pid = pid;
- entry.header.len = sizeof(struct logger_entry) + 3;
+ entry.header.priority = DLOG_DEBUG; // priority, for unmatched entries that have to face the global filter
+ entry.header.len = sizeof(struct logger_entry) + 2;
- entry.msg[0] = DLOG_DEBUG; // priority, for unmatched entries that have to face the global filter
if (expected != log_should_print_line(p_format, &entry.header)) {
printf("Check in line %d for pid %d failed to return %d \n", line, pid,
expected);
entry.header.tid = 0;
entry.header.pid = 0;
- entry.msg[0] = priority;
- strncpy(entry.msg + 1, tag, strlen(tag));
- entry.msg[strlen(tag) + 1] = '\0'; /* tag delimiter */
- entry.msg[strlen(tag) + 2] = '\0'; /* empty msg */
- entry.header.len = sizeof(struct logger_entry) + strlen(tag) + 3;
+ entry.header.priority = priority;
+ strncpy(entry.msg, tag, strlen(tag));
+ entry.msg[strlen(tag)] = '\0'; /* tag delimiter */
+ entry.msg[strlen(tag) + 1] = '\0'; /* empty msg */
+ entry.header.len = sizeof(struct logger_entry) + strlen(tag) + 2;
if (expected != log_should_print_line(p_format, &entry.header)) {
printf("Check in line %d for tag %s and priority %c failed to return %d \n", line, tag,
const size_t taglen = strlen("crap");
- entry.msg[0] = DLOG_VERBOSE;
- strncpy(entry.msg + 1, "crap", taglen);
- entry.msg[taglen + 1] = '\0'; /* tag delimiter */
- entry.msg[taglen + 2] = '\0'; /* empty msg */
- entry.header.len = sizeof(struct logger_entry) + taglen + 3;
+ entry.header.priority = DLOG_VERBOSE;
+ strncpy(entry.msg, "crap", taglen);
+ entry.msg[taglen] = '\0'; /* tag delimiter */
+ entry.msg[taglen + 1] = '\0'; /* empty msg */
+ entry.header.len = sizeof(struct logger_entry) + taglen + 2;
assert(log_should_print_line(p_format, &entry.header));
result += check_print_line_tag(__LINE__, p_format, "crap", verbose | debug | info | warn | error | fatal);
assert(le->pid == getpid());
assert(le->tid == gettid());
- assert(le->msg[0] == prio);
- assert(!strcmp(le->msg + 1, tag));
- assert(!strcmp(le->msg + sizeof(tag) + 1, msg));
+ assert(le->priority == prio);
+ assert(!strcmp(le->msg, tag));
+ assert(!strcmp(le->msg + sizeof(tag), msg));
assert(time_cmp(ts_pre, le->sec, le->nsec) <= 0);
assert(time_cmp(ts_post, le->sec, le->nsec) >= 0);
create_pipe_message(ple, prio, random_tag, random_msg);
parse_pipe_message(ple, le, ple->len);
clock_gettime(CLOCK_MONOTONIC, &ts_post);
- assert(le->msg[0] == prio);
- assert(!strcmp(le->msg + 1, random_tag));
- assert(!strcmp(le->msg + strlen(random_tag) + 2, random_msg));
+ assert(le->priority == prio);
+ assert(!strcmp(le->msg, random_tag));
+ assert(!strcmp(le->msg + strlen(random_tag) + 1, random_msg));
assert(le->pid == getpid());
assert(le->tid == gettid());
assert(time_cmp(ts_pre, le->sec, le->nsec) <= 0);
assert(!parse_syslog_datagram(buffer, len, sle));
assert(sle->pid == 678);
- assert(log_buffer_get_priority(sle) == DLOG_FATAL);
+ assert(sle->priority == DLOG_FATAL);
assert(!strcmp("SYSLOG_USER", log_buffer_get_tag(sle)));
assert(!strcmp("msg", log_buffer_get_message(sle)));
assert(!parse_syslog_datagram(buffer, len, sle));
assert(sle->pid == 0);
- assert(log_buffer_get_priority(sle) == DLOG_FATAL);
+ assert(sle->priority == DLOG_FATAL);
assert(!strcmp("SYSLOG_USER", log_buffer_get_tag(sle)));
assert(!strcmp("msg", log_buffer_get_message(sle)));
#define STR1 "a"
-#define LE(str, tsec, tnsec) {{sizeof(struct logger_entry)+sizeof(str)+1, 0, 1, 1, (tsec), (tnsec), 0U, 0U, 0U, 0U}, str}
+#define LE(str, tsec, tnsec) {{sizeof(struct logger_entry)+sizeof(str)+1, 0, 0, 1, 1, (tsec), (tnsec), 0U, 0U, 0U, 0U, 0U}, str}
void dont_call_this_callback(const struct logger_entry *le, void *user_data)
{