/* * NOTE: _init needs to be idempotent when called multiple times w/o invoking _destroy * * Rationale: * - init is called from driver init (e.g. affile_sd_init), * - destroy is called from driver free method (e.g. affile_sd_free, NOT affile_sd_deinit) * * The reason: * - when initializing the reloaded configuration fails for some reason, * we have to fall back to the old configuration, thus we cannot dump * the information stored in the Options structure at deinit time, but * have to recover it when the old configuration is initialized. * * For the reasons above, init and destroy behave the following way: * * - init is idempotent, it can be called multiple times without leaking * memory, and without loss of information * - destroy is only called once, when the options are indeed to be destroyed * * Also important to note is that when init is called multiple times, the * GlobalConfig reference is the same, this means that it is enough to * remember whether init was called already and return w/o doing anything in * that case, which is actually how idempotency is implemented here. */ void log_reader_options_init(LogReaderOptions *options, GlobalConfig *cfg, const gchar *group_name) { if (options->initialized) return; log_source_options_init(&options->super, cfg, group_name); log_proto_server_options_init(&options->proto_options.super, cfg); msg_format_options_init(&options->parse_options, cfg); if (options->check_hostname == -1) options->check_hostname = cfg->check_hostname; if (options->check_hostname) { options->parse_options.flags |= LP_CHECK_HOSTNAME; } if (!options->super.keep_timestamp) { options->parse_options.flags |= LP_NO_PARSE_DATE; } if (options->parse_options.default_pri == 0xFFFF) { if (options->flags & LR_KERNEL) options->parse_options.default_pri = LOG_KERN | LOG_NOTICE; else options->parse_options.default_pri = LOG_USER | LOG_NOTICE; } if (options->proto_options.super.encoding) options->parse_options.flags |= LP_ASSUME_UTF8; if (cfg->threaded) options->flags |= LR_THREADED; options->initialized = TRUE; }
void init_proto_tests(void) { init_and_load_syslogformat_module(); log_proto_server_options_defaults(&proto_server_options); log_proto_server_options_init(&proto_server_options, configuration); }
LogProtoServer * construct_server_proto_plugin(const gchar *name, LogTransport *transport) { LogProtoServerFactory *proto_factory; log_proto_server_options_init(&proto_server_options, configuration); proto_factory = log_proto_server_get_factory(configuration, name); assert_true(proto_factory != NULL, "error looking up proto factory"); return log_proto_server_factory_construct(proto_factory, transport, &proto_server_options); }