dlog_logger_SOURCES = \
external/sd-daemon/sd-daemon.c \
src/logger/logger.c \
+ src/logger/dlogutil_line.c \
src/logger/fd_entity.c \
src/logger/log_storage.c \
src/logger/qos.c \
--- /dev/null
+#include "dlogutil_line.h"
+#include "logger_internal.h"
+#include <getopt.h>
+
+void reset_getopt_internals(void *fake)
+{
+ optarg = NULL;
+ optind = 0;
+ optopt = 0;
+}
+
+bool initialize_dlogutil_line_params(struct dlogutil_line_params *params)
+{
+ assert(params);
+
+ logfile_init(¶ms->file);
+ params->monitor = false;
+ params->is_dumping = false;
+ params->buf_id = LOG_ID_INVALID;
+ params->file_path = NULL;
+
+ params->filter = log_filter_new();
+ if (!params->filter)
+ return false;
+
+ return true;
+}
+
+void free_dlogutil_line_params(struct dlogutil_line_params *params)
+{
+ logfile_free(¶ms->file);
+ log_filter_free(params->filter);
+ free(params->file_path);
+}
+
+static int make_argc_argv_from_dlogutil_line(const char *cmdl, size_t buf_size, char buffer[buf_size], int *argc, char **argv)
+{
+ assert(cmdl);
+ assert(argc);
+ assert(argv);
+
+ snprintf(buffer, buf_size, "%s", cmdl); // strtok is destructive
+
+ char *tok_sv;
+ char *tok = strtok_r(buffer, DELIMITER, &tok_sv);
+
+ /* Legacy requirement: emulate `dlogutil`
+ * invocations right up to the binary name */
+ if (!tok || strcmp(tok, "dlogutil"))
+ return -EINVAL;
+
+ int curr_argc = 0;
+ const int argv_size = *argc - 1; // for NULL at the end
+ while (tok && (curr_argc < argv_size)) {
+ argv[curr_argc++] = tok;
+ tok = strtok_r(NULL, DELIMITER, &tok_sv);
+ }
+
+ argv[curr_argc] = NULL;
+ *argc = curr_argc;
+
+ return 0;
+}
+
+static int get_dlogutil_params_from_argc_argv(int argc, char **argv, struct dlogutil_line_params *params)
+{
+ assert(argc >= 0);
+ assert(argv);
+ assert(params);
+
+ bool silence = false;
+
+ static const struct option long_options[] = {
+ {"tid", required_argument, NULL, 0},
+ {"pid", required_argument, NULL, 1},
+ {0}
+ };
+
+ __attribute__((cleanup(reset_getopt_internals))) int option;
+ while ((option = getopt_long(argc, argv, "cdt:gsf:r:n:v:b:mu:", long_options, NULL)) != -1) {
+ switch (option) {
+ break;
+ case 'd':
+ case 't':
+ params->is_dumping = true;
+ break;
+ case 'm':
+ params->monitor = true;
+ break;
+ case 'f':
+ free(params->file_path);
+ params->file_path = strdup(optarg);
+ if (!params->file_path)
+ return -ENOMEM;
+ break;
+ case 'b':
+ params->buf_id = log_id_by_name(optarg);
+ if (params->buf_id == LOG_ID_INVALID)
+ return -EINVAL;
+ break;
+ case 'r':
+ if (sscanf(optarg, "%zu", ¶ms->file.rotate_size_kbytes) != 1)
+ return -EINVAL;
+ break;
+ case 'n':
+ if (sscanf(optarg, "%zu", ¶ms->file.max_rotated) != 1)
+ return -EINVAL;
+ break;
+ case 'v':
+ params->file.format.format = log_format_from_string(optarg);
+ break;
+ case 's':
+ silence = true;
+ dlogutil_filter_options_set_filterspec(params->filter, "*:s");
+ break;
+ case 0: {
+ pid_t tid;
+ if (sscanf(optarg, "%d", &tid) != 1 || dlogutil_filter_options_set_tid(params->filter, tid))
+ return -EINVAL;
+ break;
+ }
+ case 1: {
+ pid_t pid;
+ if (sscanf(optarg, "%d", &pid) != 1 || dlogutil_filter_options_set_pid(params->filter, pid))
+ return -EINVAL;
+ break;
+ }
+ case '?': // invalid option or missing argument
+ return -EINVAL;
+ default:
+ // everything else gets handled in util directly
+ break;
+ }
+ }
+
+ // dump + monitor = continuous
+ if (params->monitor && params->is_dumping) {
+ params->is_dumping = false;
+ params->monitor = false;
+ }
+
+ if (optind < argc)
+ while (optind < argc)
+ dlogutil_filter_options_set_filterspec(params->filter, argv[optind++]);
+ else if (!silence)
+ dlogutil_filter_options_set_filterspec(params->filter, "*:D");
+
+ return 0;
+}
+
+int get_dlogutil_line_params(const char *cmdl, struct dlogutil_line_params *params)
+{
+ assert(params);
+ assert(cmdl);
+ char buffer[1024];
+ char *argv[64]; // size arbitrary, should reasonably fit all args
+ int argc = NELEMS(argv);
+ int ret = make_argc_argv_from_dlogutil_line(cmdl, sizeof buffer, buffer, &argc, argv);
+ if (ret < 0)
+ return ret;
+
+ return get_dlogutil_params_from_argc_argv(argc, argv, params);
+}
--- /dev/null
+#pragma once
+
+#include <log_file.h>
+
+struct dlogutil_line_params {
+ bool monitor;
+ bool is_dumping;
+ struct log_file file;
+ log_id_t buf_id;
+ char *file_path;
+ struct dlogutil_filter_options *filter;
+};
+
+bool initialize_dlogutil_line_params(struct dlogutil_line_params *params);
+int get_dlogutil_line_params(const char *cmdl, struct dlogutil_line_params *params);
+void free_dlogutil_line_params(struct dlogutil_line_params *params);
+
+void reset_getopt_internals(void *fake);
return ret;
}
-static void reset_getopt_internals(void *fake)
-{
- optarg = NULL;
- optind = 0;
- optopt = 0;
-}
-
-struct dlogutil_line_params {
- bool monitor;
- bool is_dumping;
- struct log_file file;
- log_id_t buf_id;
- char *file_path;
- struct dlogutil_filter_options *filter;
-};
-
-static bool initialize_dlogutil_line_params(struct dlogutil_line_params *params)
-{
- assert(params);
-
- logfile_init(¶ms->file);
- params->monitor = false;
- params->is_dumping = false;
- params->buf_id = LOG_ID_INVALID;
- params->file_path = NULL;
-
- params->filter = log_filter_new();
- if (!params->filter)
- return false;
-
- return true;
-}
-
-static void free_dlogutil_line_params(struct dlogutil_line_params *params)
-{
- logfile_free(¶ms->file);
- log_filter_free(params->filter);
- free(params->file_path);
-}
-
-static int make_argc_argv_from_dlogutil_line(const char *cmdl, size_t buf_size, char buffer[buf_size], int *argc, char **argv)
-{
- assert(cmdl);
- assert(argc);
- assert(argv);
-
- snprintf(buffer, buf_size, "%s", cmdl); // strtok is destructive
-
- char *tok_sv;
- char *tok = strtok_r(buffer, DELIMITER, &tok_sv);
-
- /* Legacy requirement: emulate `dlogutil`
- * invocations right up to the binary name */
- if (!tok || strcmp(tok, "dlogutil"))
- return -EINVAL;
-
- int curr_argc = 0;
- const int argv_size = *argc - 1; // for NULL at the end
- while (tok && (curr_argc < argv_size)) {
- argv[curr_argc++] = tok;
- tok = strtok_r(NULL, DELIMITER, &tok_sv);
- }
-
- argv[curr_argc] = NULL;
- *argc = curr_argc;
-
- return 0;
-}
-
-static int get_dlogutil_params_from_argc_argv(int argc, char **argv, struct dlogutil_line_params *params)
-{
- assert(argc >= 0);
- assert(argv);
- assert(params);
-
- bool silence = false;
-
- static const struct option long_options[] = {
- {"tid", required_argument, NULL, 0},
- {"pid", required_argument, NULL, 1},
- {0}
- };
-
- __attribute__((cleanup(reset_getopt_internals))) int option;
- while ((option = getopt_long(argc, argv, "cdt:gsf:r:n:v:b:mu:", long_options, NULL)) != -1) {
- switch (option) {
- break;
- case 'd':
- case 't':
- params->is_dumping = true;
- break;
- case 'm':
- params->monitor = true;
- break;
- case 'f':
- free(params->file_path);
- params->file_path = strdup(optarg);
- if (!params->file_path)
- return -ENOMEM;
- break;
- case 'b':
- params->buf_id = log_id_by_name(optarg);
- if (params->buf_id == LOG_ID_INVALID)
- return -EINVAL;
- break;
- case 'r':
- if (sscanf(optarg, "%zu", ¶ms->file.rotate_size_kbytes) != 1)
- return -EINVAL;
- break;
- case 'n':
- if (sscanf(optarg, "%zu", ¶ms->file.max_rotated) != 1)
- return -EINVAL;
- break;
- case 'v':
- params->file.format.format = log_format_from_string(optarg);
- break;
- case 's':
- silence = true;
- dlogutil_filter_options_set_filterspec(params->filter, "*:s");
- break;
- case 0: {
- pid_t tid;
- if (sscanf(optarg, "%d", &tid) != 1 || dlogutil_filter_options_set_tid(params->filter, tid))
- return -EINVAL;
- break;
- }
- case 1: {
- pid_t pid;
- if (sscanf(optarg, "%d", &pid) != 1 || dlogutil_filter_options_set_pid(params->filter, pid))
- return -EINVAL;
- break;
- }
- case '?': // invalid option or missing argument
- return -EINVAL;
- default:
- // everything else gets handled in util directly
- break;
- }
- }
-
- // dump + monitor = continuous
- if (params->monitor && params->is_dumping) {
- params->is_dumping = false;
- params->monitor = false;
- }
-
- if (optind < argc)
- while (optind < argc)
- dlogutil_filter_options_set_filterspec(params->filter, argv[optind++]);
- else if (!silence)
- dlogutil_filter_options_set_filterspec(params->filter, "*:D");
-
- return 0;
-}
-
-static int get_dlogutil_line_params(const char *cmdl, struct dlogutil_line_params *params)
-{
- assert(params);
- assert(cmdl);
- char buffer[1024];
- char *argv[64]; // size arbitrary, should reasonably fit all args
- int argc = NELEMS(argv);
- int ret = make_argc_argv_from_dlogutil_line(cmdl, sizeof buffer, buffer, &argc, argv);
- if (ret < 0)
- return ret;
-
- return get_dlogutil_params_from_argc_argv(argc, argv, params);
-}
-
static int create_logger_subreader_from_dlogutil_line(struct dlogutil_line_params *params)
{
if (params->file_path) {
#include "reader_logger.h"
#include "reader_pipe.h"
#include "socket.h"
+#include "dlogutil_line.h"
#ifdef __cplusplus
extern "C" {