=== modified file 'plugin-runner.c' --- plugin-runner.c 2008-08-25 01:40:19 +0000 +++ plugin-runner.c 2008-08-25 07:53:43 +0000 @@ -65,7 +65,9 @@ #include /* errno, EBADF */ #define BUFFER_SIZE 256 -#define ARGFILE "/conf/conf.d/mandos/plugin-runner.conf" + +#define PDIR "/lib/mandos/plugins.d" +#define AFILE "/conf/conf.d/mandos/plugin-runner.conf" const char *argp_program_version = "plugin-runner 1.0"; const char *argp_program_bug_address = ""; @@ -263,8 +265,8 @@ } int main(int argc, char *argv[]){ - const char *plugindir = "/lib/mandos/plugins.d"; - const char *argfile = ARGFILE; + char *plugindir = NULL; + char *argfile = NULL; FILE *conffp; size_t d_name_len; DIR *dir = NULL; @@ -317,14 +319,17 @@ { .name = "plugin-dir", .key = 128, .arg = "DIRECTORY", .doc = "Specify a different plugin directory", .group = 2 }, - { .name = "userid", .key = 129, - .arg = "ID", .flags = 0, - .doc = "User ID the plugins will run as", .group = 2 }, - { .name = "groupid", .key = 130, - .arg = "ID", .flags = 0, - .doc = "Group ID the plugins will run as", .group = 2 }, - { .name = "debug", .key = 131, - .doc = "Debug mode", .group = 3 }, + { .name = "config-file", .key = 129, + .arg = "FILE", + .doc = "Specify a different configuration file", .group = 2 }, + { .name = "userid", .key = 130, + .arg = "ID", .flags = 0, + .doc = "User ID the plugins will run as", .group = 3 }, + { .name = "groupid", .key = 131, + .arg = "ID", .flags = 0, + .doc = "Group ID the plugins will run as", .group = 3 }, + { .name = "debug", .key = 132, + .doc = "Debug mode", .group = 4 }, { .name = NULL } }; @@ -414,15 +419,24 @@ } break; case 128: - plugindir = arg; + plugindir = strdup(arg); + if(plugindir == NULL){ + perror("strdup"); + } break; case 129: + argfile = strdup(arg); + if(argfile == NULL){ + perror("strdup"); + } + break; + case 130: uid = (uid_t)strtol(arg, NULL, 10); break; - case 130: + case 131: gid = (gid_t)strtol(arg, NULL, 10); break; - case 131: + case 132: debug = true; break; case ARGP_KEY_ARG: @@ -449,7 +463,12 @@ goto fallback; } - conffp = fopen(argfile, "r"); + if (argfile == NULL){ + conffp = fopen(AFILE, "r"); + } else { + conffp = fopen(argfile, "r"); + } + if(conffp != NULL){ char *org_line = NULL; char *p, *arg, *new_arg, *line; @@ -481,7 +500,13 @@ continue; } new_arg = strdup(p); - + if(new_arg == NULL){ + perror("strdup"); + exitstatus = EXIT_FAILURE; + free(org_line); + goto fallback; + } + custom_argc += 1; custom_argv = realloc(custom_argv, sizeof(char *) * ((unsigned int) custom_argc + 1)); @@ -538,8 +563,13 @@ if (ret == -1){ perror("setgid"); } + + if (plugindir == NULL){ + dir = opendir(PDIR); + } else { + dir = opendir(plugindir); + } - dir = opendir(plugindir); if(dir == NULL){ perror("Could not open plugin dir"); exitstatus = EXIT_FAILURE; @@ -795,7 +825,7 @@ } } - + free_plugin_list(plugin_list); plugin_list = NULL; @@ -970,6 +1000,9 @@ if(errno != ECHILD){ perror("wait"); } + + free(plugindir); + free(argfile); return exitstatus; }