return ret;
}
-static struct reader_pipe *reader_pipe_alloc(dlogutil_filter_options_s *filter, struct log_file file, struct timespec ts,
+static struct reader_pipe *reader_pipe_alloc(dlogutil_filter_options_s *filter, struct log_file *file, struct timespec ts,
bool monitor, bool is_dumping)
{
struct reader_pipe *ret = calloc(1, sizeof(*ret));
if (!ret)
return NULL;
- ret->filter = filter;
+ ret->filter = log_filter_move(filter);
ret->monitor = monitor;
ret->is_dumping = is_dumping;
- ret->file = file;
+ logfile_move(&ret->file, file);
ret->buf_ptr = NULL;
ret->log_storage_reader = NULL;
ret->last_read_time = ts;
return ret;
}
-static struct reader_logger *reader_logger_alloc(dlogutil_filter_options_s *filter, struct log_file file)
+static struct reader_logger *reader_logger_alloc(dlogutil_filter_options_s *filter, struct log_file *file)
{
struct reader_logger *const ret = calloc(1, sizeof *ret);
struct subreader_logger *const srl = malloc(sizeof *srl);
return NULL;
}
- srlf->file = file;
+ logfile_move(&srlf->file, file);
srl->sub_userdata = srlf;
srl->sub_destroy = subreader_logger_file_free;
srl->sub_apply_log = subreader_logger_file_apply_log;
- srl->filter = filter;
+ srl->filter = log_filter_move(filter);
list_add(&ret->subs, srl);
}
static int reader_pipe_init(struct reader_pipe **reader, log_id_t buf_id, struct logger *server,
- dlogutil_filter_options_s *filter, struct log_file file, bool monitor, bool is_dumping)
+ dlogutil_filter_options_s *filter, struct log_file *file, bool monitor, bool is_dumping)
{
assert(reader);
assert(buf_id > LOG_ID_INVALID);
}
static int reader_pipe_init_with_writer(struct reader_pipe **reader, struct writer *writer, struct logger *server,
- dlogutil_filter_options_s *filter, struct log_file file, bool monitor, bool is_dumping)
+ dlogutil_filter_options_s *filter, struct log_file *file, bool monitor, bool is_dumping)
{
assert(reader);
assert(writer);
}
static int reader_logger_init(struct reader_logger **reader, log_id_t buf_id, struct logger *server,
- dlogutil_filter_options_s *filter, struct log_file file, bool monitor, bool is_dumping)
+ dlogutil_filter_options_s *filter, struct log_file *file, bool monitor, bool is_dumping)
{
assert(reader);
assert(buf_id > LOG_ID_INVALID);
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);
static int get_dlogutil_line_params(const char *cmdl, struct dlogutil_line_params *params)
{
assert(params);
- if (!initialize_dlogutil_line_params(params))
- return -ENOMEM;
-
assert(cmdl);
char buffer[1024];
char *argv[64]; // size arbitrary, should reasonably fit all args
return get_dlogutil_params_from_argc_argv(argc, argv, params);
}
-static int create_reader_logger_from_dlogutil_line(struct dlogutil_line_params params, struct logger *server, struct reader_logger **rd)
+static int create_reader_logger_from_dlogutil_line(struct dlogutil_line_params *params, struct logger *server, struct reader_logger **rd)
{
assert(server);
assert(rd);
__attribute__((cleanup(reader_logger_cleanup))) struct reader_logger *reader = NULL;
int retval;
- if (params.file_path) {
- retval = logfile_set_path(¶ms.file, params.file_path);
+ if (params->file_path) {
+ retval = logfile_set_path(¶ms->file, params->file_path);
if (retval < 0)
- goto cleanup;
+ return retval;
- retval = logfile_open(¶ms.file);
+ retval = logfile_open(¶ms->file);
if (retval < 0)
- goto cleanup;
+ return retval;
}
- if (params.buf_id == LOG_ID_INVALID) {
- retval = -EINVAL;
- goto cleanup;
- }
+ if (params->buf_id == LOG_ID_INVALID)
+ return -EINVAL;
- retval = reader_logger_init(&reader, params.buf_id, server, params.filter, params.file, params.monitor, params.is_dumping);
- if (retval != 0)
- goto cleanup;
+ if (params->file.path == NULL)
+ return -EINVAL;
- if (reader->common.fd_entity_source.fd < 0) {
- retval = -EINVAL;
- goto cleanup;
- }
+ retval = reader_logger_init(&reader, params->buf_id, server, params->filter, ¶ms->file, params->monitor, params->is_dumping);
+ if (retval != 0)
+ return retval;
- if (params.file.path == NULL) {
- retval = -EINVAL;
- goto cleanup;
- }
+ if (reader->common.fd_entity_source.fd < 0)
+ return -EINVAL;
*rd = reader;
reader = NULL;
- return 0;
-cleanup:
- if (!reader) {
- // TODO: Free this in a reasonable way
- logfile_free(¶ms.file);
- log_filter_free(params.filter);
- }
- free(params.file_path);
- return retval;
+ return 0;
}
-static int create_reader_pipe_from_dlogutil_line(struct dlogutil_line_params params, struct logger *server, struct reader_pipe **rd)
+static int create_reader_pipe_from_dlogutil_line(struct dlogutil_line_params *params, struct logger *server, struct reader_pipe **rd)
{
assert(server);
assert(rd);
__attribute__((cleanup(reader_pipe_cleanup))) struct reader_pipe *reader = NULL;
int retval;
- if (params.file_path) {
- retval = logfile_set_path(¶ms.file, params.file_path);
+ if (params->file_path) {
+ retval = logfile_set_path(¶ms->file, params->file_path);
if (retval < 0)
- goto cleanup;
+ return retval;
- retval = logfile_open(¶ms.file);
+ retval = logfile_open(¶ms->file);
if (retval < 0)
- goto cleanup;
+ return retval;
}
- if (params.buf_id == LOG_ID_INVALID) {
- retval = -EINVAL;
- goto cleanup;
- }
+ if (params->buf_id == LOG_ID_INVALID)
+ return -EINVAL;
- retval = reader_pipe_init(&reader, params.buf_id, server, params.filter, params.file, params.monitor, params.is_dumping);
- if (retval != 0)
- goto cleanup;
+ if (params->file.path == NULL)
+ return -EINVAL;
- if (params.file.path == NULL) {
- retval = -EINVAL;
- goto cleanup;
- }
+ retval = reader_pipe_init(&reader, params->buf_id, server, params->filter, ¶ms->file, params->monitor, params->is_dumping);
+ if (retval != 0)
+ return retval;
*rd = reader;
reader = NULL;
- return 0;
-cleanup:
- if (!reader) {
- // TODO: Free this in a reasonable way
- logfile_free(¶ms.file);
- log_filter_free(params.filter);
- }
- free(params.file_path);
- return retval;
+ return 0;
}
/**
__attribute__((cleanup(reader_pipe_cleanup))) struct reader_pipe *reader = NULL;
- struct dlogutil_line_params params;
- int retval = get_dlogutil_line_params(msg->data, ¶ms);
- if (retval < 0)
+ int retval;
+ __attribute__((cleanup(free_dlogutil_line_params))) struct dlogutil_line_params params;
+ if (!initialize_dlogutil_line_params(¶ms)) {
+ retval = -ENOMEM;
+ goto cleanup;
+ }
+
+ retval = get_dlogutil_line_params(msg->data, ¶ms);
+ if (retval < 0) {
+ retval = -ENOMEM;
goto cleanup;
+ }
if (params.file_path) {
/* Do not trust writer-based readers (only config-based).
goto cleanup;
}
- retval = reader_pipe_init_with_writer(&reader, wr, server, params.filter, params.file, params.monitor, params.is_dumping);
+ retval = reader_pipe_init_with_writer(&reader, wr, server, params.filter, ¶ms.file, params.monitor, params.is_dumping);
if (retval != 0)
goto cleanup;
if (retval < 0)
printf("ERROR: both create_reader_from_dlogutil_line() and send_dlog_reply() failed\n");
- // TODO: Free this in a reasonable way
- if (!reader) {
- logfile_free(¶ms.file);
- log_filter_free(params.filter);
- }
- free(params.file_path);
-
return retval;
}
struct logger *server = (struct logger *) userdata;
char *configline = (char *) value;
- struct dlogutil_line_params params;
+ __attribute__((cleanup(free_dlogutil_line_params))) struct dlogutil_line_params params;
+ if (!initialize_dlogutil_line_params(¶ms))
+ return;
+
get_dlogutil_line_params(configline, ¶ms);
int r;
if (g_backend.use_logger_by_default && params.buf_id != LOG_ID_KMSG && params.buf_id != LOG_ID_SYSLOG) {
struct reader_logger *reader = NULL;
- r = create_reader_logger_from_dlogutil_line(params, server, &reader);
- params = (struct dlogutil_line_params){}; // We no longer can use this struct
+ r = create_reader_logger_from_dlogutil_line(¶ms, server, &reader);
if (r == 0)
add_reader_logger(server, reader);
- }
- else {
+ } else {
struct reader_pipe *reader = NULL;
- r = create_reader_pipe_from_dlogutil_line(params, server, &reader);
- params = (struct dlogutil_line_params){}; // We no longer can use this struct
+ r = create_reader_pipe_from_dlogutil_line(¶ms, server, &reader);
if (r == 0)
add_reader_pipe(server, reader);
}