util: change enabled buffer list to bitflags 89/149889/6
authorMichal Bloch <m.bloch@samsung.com>
Wed, 27 Sep 2017 16:42:05 +0000 (18:42 +0200)
committerMichal Bloch <m.bloch@samsung.com>
Fri, 29 Sep 2017 16:35:32 +0000 (18:35 +0200)
Fixes a crash when >16 -b options are specified.

Change-Id: I39a487e80d25127515b98a39bfaa20a0f0d88310
Signed-off-by: Michal Bloch <m.bloch@samsung.com>
include/logcommon.h
src/logutil/logutil.c

index d0d4b03..802742a 100644 (file)
@@ -64,6 +64,11 @@ static inline int max_int(int a, int b) { return a > b ? a : b; }
 static inline int min_int(int a, int b) { return a < b ? a : b; }
 static inline int clamp_int(int i, int min, int max) { return min_int(max, max_int(min, i)); }
 
+static inline void bit_set(int *bitset, int index) { *bitset |= (1 << index); }
+static inline void bit_clear(int *bitset, int index) { *bitset &= ~(1 << index); }
+static inline int bit_test(int bitset, int index) { return bitset & (1 << index); }
+static inline int bit_count(int bitset) { return __builtin_popcount(bitset); }
+
 /**
  * @brief Set FD flags
  * @details Set a file descriptor's flags
index 51804a2..8f0c5ba 100755 (executable)
 
 #define IS_VECTOR_SIZE_SORTABLE(x) (x > 1)
 
-static int default_buffers[] = // Buffers to use by default, when there is no -b option specified
-       { LOG_ID_MAIN
-       , LOG_ID_SYSTEM
-       , LOG_ID_APPS
-};
+// buffers to use by default, when nothing specified
+static const int default_buffers = (1 << LOG_ID_MAIN) | (1 << LOG_ID_SYSTEM) | (1 << LOG_ID_APPS);
 
 struct sorting_vector {
        struct logger_entry **data;
@@ -311,19 +308,22 @@ void clear_log_logger(int fd)
  * @param[in] cnt Buffer count
  * @return 0 on success, 1 on failure
  */
-static int do_getsize(struct log_config * conf, char ** names, int cnt)
+static int do_getsize(struct log_config *conf, int enabled_buffers)
 {
-       while (cnt--) {
+       for (log_id_t i = 0; i < LOG_ID_MAX; ++i) {
+               if (!bit_test(enabled_buffers, i))
+                       continue;
+
                char conf_key[MAX_CONF_KEY_LEN];
-               snprintf(conf_key, MAX_CONF_KEY_LEN, "%s_size", names[cnt]);
-               const char * conf_value = log_config_get(conf, conf_key);
+               const char *const bufname = log_name_by_id(i);
+               snprintf(conf_key, MAX_CONF_KEY_LEN, "%s_size", bufname);
+               const char *conf_value = log_config_get(conf, conf_key);
                if (!conf_value) {
-                       printf("Error: could not get size of buffer #%d (%s); it has no config entry\n", log_id_by_name(names[cnt]), names[cnt]);
+                       printf("Error: could not get size of buffer #%d (%s); it has no config entry\n", i, bufname);
                        return 1;
                }
 
-               printf("Buffer #%d (%s) has size %d KB\n", log_id_by_name(names[cnt]),
-                               names[cnt], BtoKiB(atoi(conf_value)));
+               printf("Buffer #%d (%s) has size %d KB\n", i, bufname, BtoKiB(atoi(conf_value)));
        }
        return 0;
 }
@@ -652,7 +652,7 @@ closefile:
  * @param[in] argv Argument values
  * @return FD wrapper structure to read from
  */
-struct fd_info * process_buffer_nonpipe(char * buffer_name, int clear, struct log_config * conf, int argc, char ** argv)
+struct fd_info *process_buffer_nonpipe(const char *buffer_name, int clear, struct log_config *conf, int argc, char **argv)
 {
        char const * dev_path;
        dev_path = log_config_get(conf, buffer_name);
@@ -693,7 +693,7 @@ cleanup:
  * @param[in] argv Argument values
  * @return FD wrapper structure of a pipe if we are to read from one, else NULL
  */
-struct fd_info * process_buffer_pipe(char * buffer_name, int clear, struct log_config * conf, int argc, char ** argv)
+struct fd_info *process_buffer_pipe(const char *buffer_name, int clear, struct log_config *conf, int argc, char **argv)
 {
        char conf_key[MAX_CONF_KEY_LEN];
        int argc_processed = 0;
@@ -759,28 +759,24 @@ cleanup:
        return ret;
 }
 
-static int validate_buffer_set(char **buffer_names, int *buffer_cnt, int *files_cnt)
+static int validate_buffer_set(int *enabled_buffers, int files_cnt)
 {
-       assert(buffer_names);
-       assert(buffer_cnt);
-       assert(files_cnt);
+       assert(enabled_buffers);
 
-       if (*files_cnt != 0 && *buffer_cnt != 0) {
+       if (files_cnt != 0 && *enabled_buffers != 0) {
                printf("Mixing --dumpfile and -b not allowed!\n");
                return 0;
        }
 
-       if (*files_cnt == 0 && *buffer_cnt == 0)
-               for (unsigned i = 0; i < NELEMS(default_buffers); ++i)
-                       buffer_names[(*buffer_cnt)++] = log_name_by_id(default_buffers[i]);
+       if (files_cnt == 0 && *enabled_buffers == 0)
+               *enabled_buffers = default_buffers;
 
        return 1;
 }
 
 int main(int argc, char **argv)
 {
-       char* buffer_names[SIMULTANEOUS_BUFFERS];
-       int buffer_cnt = 0;
+       int enabled_buffers = 0; // bitset
        char* file_input_names[SIMULTANEOUS_BUFFERS];
        int files_cnt = 0;
        const char * conf_value;
@@ -844,7 +840,7 @@ int main(int argc, char **argv)
                                printf("There is no buffer \"%s\"\n", optarg);
                                return 1;
                        }
-                       buffer_names[buffer_cnt++] = optarg;
+                       bit_set(&enabled_buffers, id);
                        break;
                }
                case 'u':
@@ -894,14 +890,14 @@ int main(int argc, char **argv)
        else if (!silence)
                log_add_filter_string(l_file.format, "*:D");
 
-       if (!validate_buffer_set(buffer_names, &buffer_cnt, &files_cnt))
+       if (!validate_buffer_set(&enabled_buffers, files_cnt))
                return 1;
 
        if (!sorting_vector_finalize(&logs))
                goto err_nomem;
 
        if (should_getsize)
-               return do_getsize(&conf, buffer_names, buffer_cnt);
+               return do_getsize(&conf, enabled_buffers);
 
        conf_value = log_config_get(&conf, "backend");
        if (!conf_value) {
@@ -915,17 +911,21 @@ int main(int argc, char **argv)
                return 1;
        }
 
-       for (i = 0; i < buffer_cnt; ++i) {
-               struct fd_info * fdi;
+       for (i = 0; i < LOG_ID_MAX; ++i) {
+               if (!bit_test(enabled_buffers, i))
+                       continue;
+
+               struct fd_info *fdi;
+               const char *const bufname = log_name_by_id(i);
                if (!strcmp(conf_value, "pipe")
-                       || !strcmp(buffer_names[i], "syslog")
-                       || !strcmp(buffer_names[i], "kmsg"))
-                       fdi = process_buffer_pipe(buffer_names[i], should_clear, &conf, argc, argv);
+                       || !strcmp(bufname, "syslog")
+                       || !strcmp(bufname, "kmsg"))
+                       fdi = process_buffer_pipe(bufname, should_clear, &conf, argc, argv);
                else
-                       fdi = process_buffer_nonpipe(buffer_names[i], should_clear, &conf, argc, argv);
+                       fdi = process_buffer_nonpipe(bufname, should_clear, &conf, argc, argv);
                if (fdi) {
                        fdi_ptrs[fdi_cnt++] = fdi;
-                       if (buffer_cnt == 1 || tag_cnt == 1 || !IS_VECTOR_SIZE_SORTABLE(logs.size))
+                       if (bit_count(enabled_buffers) == 1 || tag_cnt == 1 || !IS_VECTOR_SIZE_SORTABLE(logs.size))
                                fdi->do_sorting = 0;
                }
        }