1 #include "dlogutil_line.h"
2 #include "logger_internal.h"
5 void reset_getopt_internals(void *fake)
12 bool initialize_dlogutil_line_params(struct dlogutil_line_params *params)
16 logfile_init(¶ms->file);
17 params->monitor = false;
18 params->is_dumping = false;
19 params->buf_id = LOG_ID_INVALID;
20 params->file_path = NULL;
22 params->filter = log_filter_new();
29 void free_dlogutil_line_params(struct dlogutil_line_params *params)
31 logfile_free(¶ms->file);
32 log_filter_free(params->filter);
33 free(params->file_path);
36 static int make_argc_argv_from_dlogutil_line(const char *cmdl, size_t buf_size, char buffer[buf_size], int *argc, char **argv)
42 snprintf(buffer, buf_size, "%s", cmdl); // strtok is destructive
45 char *tok = strtok_r(buffer, DELIMITER, &tok_sv);
47 /* Legacy requirement: emulate `dlogutil`
48 * invocations right up to the binary name */
49 if (!tok || strcmp(tok, "dlogutil"))
53 const int argv_size = *argc - 1; // for NULL at the end
54 while (tok && (curr_argc < argv_size)) {
55 argv[curr_argc++] = tok;
56 tok = strtok_r(NULL, DELIMITER, &tok_sv);
59 argv[curr_argc] = NULL;
65 static int get_dlogutil_params_from_argc_argv(int argc, char **argv, struct dlogutil_line_params *params)
73 static const struct option long_options[] = {
74 {"tid", required_argument, NULL, 0},
75 {"pid", required_argument, NULL, 1},
79 __attribute__((cleanup(reset_getopt_internals))) int option;
80 while ((option = getopt_long(argc, argv, "cdt:gsf:r:n:v:b:mu:", long_options, NULL)) != -1) {
85 params->is_dumping = true;
88 params->monitor = true;
91 free(params->file_path);
92 params->file_path = strdup(optarg);
93 if (!params->file_path)
97 params->buf_id = log_id_by_name(optarg);
98 if (params->buf_id == LOG_ID_INVALID)
102 if (sscanf(optarg, "%zu", ¶ms->file.rotate_size_kbytes) != 1)
106 if (sscanf(optarg, "%zu", ¶ms->file.max_rotated) != 1)
110 params->file.format.format = log_format_from_string(optarg);
114 dlogutil_filter_options_set_filterspec(params->filter, "*:s");
118 if (sscanf(optarg, "%d", &tid) != 1 || dlogutil_filter_options_set_tid(params->filter, tid))
124 if (sscanf(optarg, "%d", &pid) != 1 || dlogutil_filter_options_set_pid(params->filter, pid))
128 case '?': // invalid option or missing argument
131 // everything else gets handled in util directly
136 // dump + monitor = continuous
137 if (params->monitor && params->is_dumping) {
138 params->is_dumping = false;
139 params->monitor = false;
143 while (optind < argc)
144 dlogutil_filter_options_set_filterspec(params->filter, argv[optind++]);
146 dlogutil_filter_options_set_filterspec(params->filter, "*:D");
151 int get_dlogutil_line_params(const char *cmdl, struct dlogutil_line_params *params)
156 char *argv[64]; // size arbitrary, should reasonably fit all args
157 int argc = NELEMS(argv);
158 int ret = make_argc_argv_from_dlogutil_line(cmdl, sizeof buffer, buffer, &argc, argv);
162 return get_dlogutil_params_from_argc_argv(argc, argv, params);