Split various dlogutil line parsing to a separate file 24/242124/2
authorMateusz Majewski <m.majewski2@samsung.com>
Mon, 24 Aug 2020 09:04:14 +0000 (11:04 +0200)
committerMichal Bloch <m.bloch@partner.samsung.com>
Mon, 24 Aug 2020 10:33:45 +0000 (10:33 +0000)
Change-Id: I633d126554f6a9d086abd7585f25f911085b5aea

Makefile.am
src/logger/dlogutil_line.c [new file with mode: 0644]
src/logger/dlogutil_line.h [new file with mode: 0644]
src/logger/logger.c
src/logger/logger_internal.h

index d305685..89aba76 100644 (file)
@@ -125,6 +125,7 @@ dlog_logger_LDFLAGS = \
 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 \
diff --git a/src/logger/dlogutil_line.c b/src/logger/dlogutil_line.c
new file mode 100644 (file)
index 0000000..f7bcec4
--- /dev/null
@@ -0,0 +1,163 @@
+#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(&params->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(&params->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", &params->file.rotate_size_kbytes) != 1)
+                               return -EINVAL;
+                       break;
+               case 'n':
+                       if (sscanf(optarg, "%zu", &params->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);
+}
diff --git a/src/logger/dlogutil_line.h b/src/logger/dlogutil_line.h
new file mode 100644 (file)
index 0000000..490bd90
--- /dev/null
@@ -0,0 +1,18 @@
+#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);
index 19ada69..bd3d93a 100644 (file)
@@ -604,175 +604,6 @@ finish:
        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(&params->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(&params->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", &params->file.rotate_size_kbytes) != 1)
-                               return -EINVAL;
-                       break;
-               case 'n':
-                       if (sscanf(optarg, "%zu", &params->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) {
index 58146ee..8df3d22 100644 (file)
@@ -35,6 +35,7 @@
 #include "reader_logger.h"
 #include "reader_pipe.h"
 #include "socket.h"
+#include "dlogutil_line.h"
 
 #ifdef __cplusplus
 extern "C" {