From 5e7a3b32b27195b56cbe332df3757b779e4bd30b Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 16 Mar 2018 14:35:32 +0100 Subject: [PATCH] logger: refactor print_out_logs - extracted for single log This patch extracts printing out of a single log entry from print_out_logs() to a separate function reader_print_out_single_log(). This is going to be used in further development. Change-Id: I5ca8290e15bbda1b3512e5ac508b8d94827303eb --- src/logger/logger.c | 79 +++++++++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/src/logger/logger.c b/src/logger/logger.c index ac585c8..ace536e 100755 --- a/src/logger/logger.c +++ b/src/logger/logger.c @@ -116,15 +116,6 @@ typedef int (*service_writer_t)(struct logger* server, struct writer* wr, struct */ typedef int (*service_socket_t)(struct logger *server, struct writer *wr, struct dlog_control_msg *msg); -/** - * @brief Service reader - * @details Passes the reader to a more specific servicing handler - * @param[in] server The logger server - * @param[in] reader The reader being serviced - * @return Positive integer if the reader is to be removed, else a nonpositive one - */ -typedef int (*service_reader_t)(struct logger *server, struct reader *reader); - #define LARGEST_STRUCT(a, b) (sizeof(struct a) > sizeof(struct b) ? sizeof(struct a) : sizeof(struct b)) struct writer { struct fd_entity fd_entity; @@ -855,6 +846,44 @@ int buf_writes_to_plaintext(log_id_t id) return id == LOG_ID_KMSG || id == LOG_ID_SYSLOG; } +static int reader_print_out_single_log(struct reader *reader, struct logger_entry *logger_entry) +{ + assert(reader); + assert(reader->buf_ptr); + assert(logger_entry); + + if (reader->file.path && buf_writes_to_plaintext(reader->buf_ptr->id)) { + logfile_write_with_rotation(logger_entry, &reader->file); + return 0; + } + + const char *tag = logger_entry->msg + 1; + if (!strlen(tag)) + return 0; + + log_entry entry; + if (log_process_log_buffer(logger_entry, &entry) || !log_should_print_line(reader->file.format, &entry)) + return 0; + + int r = write(reader->file.path ? reader->file.fd : reader->fd_entity.fd, logger_entry, logger_entry->len); + if (r < 0) { + if (errno == EPIPE) + return 1; + return -1; + } + + reader->file.size += r; + if (r < logger_entry->len) { + reader->partial_log_size = logger_entry->len - r; + memcpy(reader->partial_log, ((char *)logger_entry) + r, reader->partial_log_size); + return -1; + } else if (logfile_rotate_needed(&reader->file) > 0) { + logfile_do_rotate(&reader->file); + } + + return 0; +} + /** * @brief Print out logs * @details Make sure the reader is up to date on printed logs @@ -871,11 +900,7 @@ static int print_out_logs(struct logger *server, struct reader *reader) int r, ret = 0; struct logger_entry_with_msg lem; - char * tag; unsigned from = reader->current; - log_entry entry; - - int plaintext = reader->file.path && buf_writes_to_plaintext(reader->buf_ptr->id); if (reader->partial_log_size) { r = write(reader->fd_entity.fd, reader->partial_log, reader->partial_log_size); @@ -907,32 +932,16 @@ static int print_out_logs(struct logger *server, struct reader *reader) reader->bytes_to_read = 0; } - if (plaintext) { - logfile_write_with_rotation(&lem.header, &reader->file); - continue; - } - - tag = lem.msg + 1; - if (!strlen(tag)) - continue; - - if (log_process_log_buffer(&lem.header, &entry) || !log_should_print_line(reader->file.format, &entry)) - continue; + switch (reader_print_out_single_log(reader, &lem.header)) { + case 0: /* nothing more to do, let's do next iteration */ + break; - r = write(reader->file.path ? reader->file.fd : reader->fd_entity.fd, &lem, lem.header.len); - if (r < 0) { - if (errno == EPIPE) - ret = 1; + case 1: /* error after which we need to end the reader */ + ret = 1; goto cleanup; - } - reader->file.size += r; - if (r < lem.header.len) { - reader->partial_log_size = lem.header.len - r; - memcpy(reader->partial_log, ((char *)&lem) + r, reader->partial_log_size); + default: /* writing error, bounce out */ goto cleanup; - } else if (logfile_rotate_needed(&reader->file) > 0) { - logfile_do_rotate(&reader->file); } } -- 2.7.4