logger: use reader callback in case of reader type 72/129972/4
authorRafal Pietruch <r.pietruch@samsung.com>
Wed, 17 May 2017 11:10:30 +0000 (13:10 +0200)
committerRafal Pietruch <r.pietruch@samsung.com>
Tue, 23 May 2017 12:48:46 +0000 (14:48 +0200)
Change-Id: Ia894f31cacd0e2d8c831396c8a6c5309e44bb711

src/logger/logger.c

index f0a4c32..2244739 100644 (file)
@@ -69,25 +69,23 @@ enum { FALSE = 0, TRUE };
 enum { INTERVAL_MIN = 0, INTERVAL_MAX = 3600 };
 enum { BUFFER_MIN = 0, BUFFER_MAX = 65535 };
 
-enum reader_type {
-       READER_BUFFER = 0,
-       READER_LOGGER
-};
-
 struct logger;
+struct writer;
+struct reader;
+
+/**
+ * @brief Event handler
+ * @details Receives and handles an event
+ * @param[in] server The logger server
+ * @param[in] event The received event
+ */
+typedef void (*dispatch_event_t)(struct logger *server, struct epoll_event *event);
 
 struct fd_entity {
-       /**
-        * @brief Event handler
-        * @details Receives and handles an event
-        * @param[in] server The logger server
-        * @param[in] event The received event
-        */
-       void (*dispatch_event)(struct logger *server, struct epoll_event *event);
+       dispatch_event_t dispatch_event;
+       struct epoll_event event;
 };
 
-struct writer;
-
 /**
  * @brief Service a writer
  * @details Specific handler that event is delegated to, according to writers type
@@ -119,8 +117,16 @@ struct writer {
        char               buffer[LOG_MAX_SIZE];
 };
 
+/**
+ * @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);
+
 struct reader {
-       enum reader_type   type;
        struct log_file    file;
        int                current;
        int                bytes_to_read;
@@ -129,6 +135,7 @@ struct reader {
        int                dumpcount;
        int                partial_log_size;
        char               partial_log[LOG_MAX_SIZE];
+       service_reader_t   service_reader;
 };
 
 struct log_buffer;
@@ -986,27 +993,6 @@ static int service_reader_file(struct logger * server, struct reader* reader)
 }
 
 /**
- * @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
- */
-static int service_reader(struct logger* server, struct reader* reader)
-{
-       assert(reader);
-
-       switch (reader->type) {
-       case READER_BUFFER:
-               return print_out_logs(server, reader);
-       case READER_LOGGER:
-               return service_reader_file(server, reader);
-       default:
-               return -1;
-       }
-}
-
-/**
  * @brief Add reader to log buffer
  * @details Adds a reader to the log buffers reader list
  * @param[in] log_buffer The buffer whither to add the reader
@@ -1017,7 +1003,6 @@ static int add_buffer_reader(struct log_buffer *buffer, struct reader *reader)
 {
        assert(reader);
        assert(buffer);
-       assert(reader->type == READER_BUFFER);
 
        reader->current = buffer->head;
        reader->bytes_to_read = buffer_used_space(buffer);
@@ -1038,20 +1023,16 @@ static int add_reader(struct logger *server, struct reader *reader)
        assert(server);
 
        int ret;
-       switch (reader->type) {
-       case READER_BUFFER:
+
+       if (reader->buf_id != LOG_ID_INVALID) {
                assert(reader->buf_id >= 0 && reader->buf_id < NELEMS(server->buffers));
                if (server->buffers[reader->buf_id])
                        ret = add_buffer_reader(server->buffers[reader->buf_id], reader);
                else
                        ret = -EINVAL;
-               break;
-       case READER_LOGGER:
+       } else {
+               assert(reader->read_fd >= 0);
                ret = list_add(&server->extra_readers, reader) ? 0 : -ENOMEM;
-               break;
-       default:
-               ret = -EINVAL;
-               break;
        }
        return ret;
 }
@@ -1110,6 +1091,7 @@ static int parse_command_line(const char* cmdl, struct writer* wr, struct reader
        reader->read_fd = -1;
        reader->dumpcount = 0;
        reader->partial_log_size = 0;
+       reader->service_reader = NULL;
 
        retval = log_config_read(&conf);
        if (retval < 0)
@@ -1145,11 +1127,10 @@ static int parse_command_line(const char* cmdl, struct writer* wr, struct reader
                                goto cleanup;
                        }
                        if (!strcmp(conf_val, "pipe") || (optarg && (!strcmp(optarg, "kmsg") || !strcmp(optarg, "syslog")))) {
-                               reader->type = READER_BUFFER;
+                               reader->service_reader = print_out_logs;
                                reader->buf_id = log_id_by_name(optarg);
                        } else if (!strcmp(conf_val, "logger")) {
-                               reader->type = READER_LOGGER;
-
+                               reader->service_reader = service_reader_file;
                                conf_val = log_config_get(&conf, optarg);
                                if (!conf_val) {
                                        retval = -ENOENT;
@@ -1196,8 +1177,11 @@ static int parse_command_line(const char* cmdl, struct writer* wr, struct reader
                }
        }
 
-       if (reader->type != READER_BUFFER &&
-           reader->type != READER_LOGGER) {
+       if (wr && wr->buf_ptr) {
+               reader->service_reader = print_out_logs;
+               reader->buf_id = wr->buf_ptr->id;
+       }
+       if (reader->service_reader == NULL) {
                retval = -EINVAL;
                goto cleanup;
        }
@@ -1208,9 +1192,6 @@ static int parse_command_line(const char* cmdl, struct writer* wr, struct reader
        else if (!silence)
                log_add_filter_string(reader->file.format, "*:D");
 
-       if (wr && wr->buf_ptr)
-               reader->buf_id = wr->buf_ptr->id;
-
        if ((reader->read_fd < 0) && ((reader->buf_id >= LOG_ID_MAX) || (reader->buf_id < 0))) {
                retval = -EINVAL;
                goto cleanup;
@@ -1587,8 +1568,11 @@ static int service_writer_kmsg(struct logger* server, struct writer* wr, struct
 
 static int cond_service_reader(void *ptr, void *user_data)
 {
+       assert(ptr);
        struct reader* reader = (struct reader*)ptr;
-       int r = service_reader((struct logger*)user_data, reader);
+
+       assert(reader->service_reader);
+       int r = reader->service_reader((struct logger*)user_data, reader);
        if (r > 0) {
                reader_free(reader);
                return TRUE;