#ifndef __CONF_YAML_LOADER_H__
#define __CONF_YAML_LOADER_H__
+#include "conf.h"
+
int ConfYamlLoadFile(const char *);
int ConfYamlLoadString(const char *, size_t);
int ConfYamlLoadFileWithPrefix(const char *filename, const char *prefix);
+int ConfYamlHandleInclude(ConfNode *parent, const char *filename);
void ConfYamlRegisterTests(void);
if (suri->conf_filename != NULL) {
snprintf(prefix, sizeof(prefix), "detect-engine-reloads.%d", reloads++);
+ SCLogConfig("Reloading %s", suri->conf_filename);
if (ConfYamlLoadFileWithPrefix(suri->conf_filename, prefix) != 0) {
SCLogError("failed to load yaml %s", suri->conf_filename);
return -1;
SCLogError("failed to properly setup yaml %s", suri->conf_filename);
return -1;
}
+
+ if (suri->additional_configs) {
+ for (int i = 0; suri->additional_configs[i] != NULL; i++) {
+ SCLogConfig("Reloading %s", suri->additional_configs[i]);
+ ConfYamlHandleInclude(node, suri->additional_configs[i]);
+ }
+ }
+
#if 0
ConfDump();
#endif
#ifdef HAVE_LIBNET11
printf("\t--reject-dev <dev> : send reject packets from this interface\n");
#endif
+ printf("\t--include <path> : additonal configuration file\n");
printf("\t--set name=value : set a configuration value\n");
printf("\n");
printf("\nTo run the engine with default configuration on "
SCReturnInt(TM_ECODE_FAILED);
}
+ if (suri->additional_configs) {
+ for (int i = 0; suri->additional_configs[i] != NULL; i++) {
+ SCLogConfig("Loading additional configuration file %s", suri->additional_configs[i]);
+ ConfYamlHandleInclude(ConfGetRootNode(), suri->additional_configs[i]);
+ }
+ }
+
SCReturnInt(TM_ECODE_OK);
}
{"simulate-packet-tcp-ssn-memcap", required_argument, 0, 0},
{"simulate-packet-defrag-memcap", required_argument, 0, 0},
{"simulate-alert-queue-realloc-failure", 0, 0, 0},
+ {"include", required_argument, 0, 0},
{NULL, 0, NULL, 0}
};
if (suri->strict_rule_parsing_string == NULL) {
FatalError("failed to duplicate 'strict' string");
}
+ } else if (strcmp((long_opts[option_index]).name, "include") == 0) {
+ if (suri->additional_configs == NULL) {
+ suri->additional_configs = SCCalloc(2, sizeof(char **));
+ if (suri->additional_configs == NULL) {
+ FatalError(
+ "Failed to allocate memory for additional configuration files: %s",
+ strerror(errno));
+ }
+ suri->additional_configs[0] = optarg;
+ } else {
+ for (int i = 0;; i++) {
+ if (suri->additional_configs[i] == NULL) {
+ const char **additional_configs =
+ SCRealloc(suri->additional_configs, (i + 2) * sizeof(char **));
+ if (additional_configs == NULL) {
+ FatalError("Failed to allocate memory for additional configuration "
+ "files: %s",
+ strerror(errno));
+ } else {
+ suri->additional_configs = additional_configs;
+ }
+ suri->additional_configs[i] = optarg;
+ suri->additional_configs[i + 1] = NULL;
+ break;
+ }
+ }
+ }
} else {
int r = ExceptionSimulationCommandlineParser(
(long_opts[option_index]).name, optarg);