logger: enable specific buffers according to config 69/121969/11
authorRafal Pietruch <r.pietruch@samsung.com>
Wed, 29 Mar 2017 14:09:14 +0000 (16:09 +0200)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Fri, 21 Apr 2017 10:51:24 +0000 (03:51 -0700)
use buffer enabled flags in case of first_buffer number
check if buffer created when adding reader

Change-Id: Ib316d32e8a8b4287ef2a49a70a0644c2836766cc

src/logger/logger.c

index 4e9cd37..bb8e5e1 100644 (file)
@@ -212,8 +212,8 @@ struct buffer_config_data {
 
 struct logger_config_data {
        struct buffering buffering;
-       int first_buffer;
        struct reader* readers;
+       int is_buffer_enabled[LOG_ID_MAX];
        struct buffer_config_data buffers[LOG_ID_MAX];
 };
 
@@ -689,6 +689,9 @@ static int write_blob_to_file(struct reader* reader, struct file_buffer* buffer)
  */
 static int print_out_logs(struct reader* reader, struct log_buffer* buffer)
 {
+       assert(reader);
+       assert(buffer);
+
        int r, ret = 0;
        struct logger_entry* ple;
        char tmp[LOG_MAX_SIZE];
@@ -957,20 +960,30 @@ static int service_reader(struct logger* server, struct reader* reader)
  * @details Adds a reader to the server's reader list
  * @param[in] server The server whither to add the reader
  * @param[in] reader The reader to add to the server
+ * @return 0 on success, -EINVAL if related buffer not enabled or invalid reader type given
  */
-static void add_reader(struct logger * server, struct reader * reader)
+static int add_reader(struct logger * server, struct reader * reader)
 {
+       assert(reader);
+       assert(server);
+
+       int ret = 0;
        switch (reader->type) {
        case READER_BUFFER:
-               reader->current = server->buffers[reader->buf_id]->head;
-               LIST_ADD(server->buffers[reader->buf_id]->readers, reader);
+               if (server->buffers[reader->buf_id]) {
+                       reader->current = server->buffers[reader->buf_id]->head;
+                       LIST_ADD(server->buffers[reader->buf_id]->readers, reader);
+               } else
+                       ret = -EINVAL;
                break;
        case READER_LOGGER:
                LIST_ADD(server->extra_readers, reader);
                break;
        default:
+               ret = -EINVAL;
                break;
        }
+       return ret;
 }
 
 /**
@@ -1229,7 +1242,9 @@ static int service_writer_handle_req_util(struct logger* server, struct writer*
                return -EINVAL;
        }
 
-       add_reader(server, rd);
+       r = add_reader(server, rd);
+       if (r < 0)
+               return r;
 
        if (wr->readed > msg->length) {
                wr->readed -= msg->length;
@@ -1550,10 +1565,12 @@ static int logger_create(struct logger_config_data *data, struct logger *l)
        l->buffering = data->buffering;
 
        int i;
-       for (i = data->first_buffer; i < LOG_ID_MAX; i++) {
-               int r = buffer_create(l->buffers + i, i, data->buffers + i, l->epollfd);
-               if (r < 0)
-                       return r;
+       for (i = 0; i < LOG_ID_MAX; i++) {
+               if (data->is_buffer_enabled[i]) {
+                       int r = buffer_create(l->buffers + i, i, data->buffers + i, l->epollfd);
+                       if (r < 0)
+                               return r;
+               }
        }
 
        /* TODO: make writers creation optional/configurable */
@@ -1561,7 +1578,7 @@ static int logger_create(struct logger_config_data *data, struct logger *l)
                [LOG_ID_KMSG] = create_kmsg_writer,
        };
        for (i = 0; i < NELEMS(writers_factories); ++i)
-               if (writers_factories[i]) {
+               if (writers_factories[i] && data->is_buffer_enabled[i]) {
                        struct writer *wr;
                        int r = writers_factories[i](&wr, l->buffers[i]);
                        if (r < 0)
@@ -1813,13 +1830,22 @@ int prepare_config_data(struct logger_config_data *data, int argc, char ** argv)
                goto end;
        }
 
-       data->first_buffer = !strcmp(backend, "pipe") ? 0 : LOG_ID_KMSG;
+       memset(data->is_buffer_enabled, 0, sizeof(data->is_buffer_enabled));
+       if (!strcmp(backend, "pipe")) {
+               data->is_buffer_enabled[LOG_ID_MAIN] =
+                       data->is_buffer_enabled[LOG_ID_RADIO] =
+                       data->is_buffer_enabled[LOG_ID_SYSTEM] =
+                       data->is_buffer_enabled[LOG_ID_APPS] = 1;
+       }
+       data->is_buffer_enabled[LOG_ID_KMSG] = 1;
 
        int buf_id;
-       for (buf_id = data->first_buffer; buf_id < LOG_ID_MAX; ++buf_id) {
-               ret = prepare_buffer_data(&conf, data->buffers + buf_id, buf_id);
-               if (ret < 0)
-                       goto end;
+       for (buf_id = 0; buf_id < LOG_ID_MAX; ++buf_id) {
+               if (data->is_buffer_enabled[buf_id]) {
+                       ret = prepare_buffer_data(&conf, data->buffers + buf_id, buf_id);
+                       if (ret < 0)
+                               goto end;
+               }
        }
 
        ret = logger_parse_configs(data, &conf);