#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;
* @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;
}
* @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);
* @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;
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;
printf("There is no buffer \"%s\"\n", optarg);
return 1;
}
- buffer_names[buffer_cnt++] = optarg;
+ bit_set(&enabled_buffers, id);
break;
}
case 'u':
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) {
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;
}
}