|
@@ -122,7 +122,7 @@ static void verify_document_root(const char *root) {
|
|
|
path = buf;
|
|
|
}
|
|
|
|
|
|
- if (stat(path, &st) != 0) {
|
|
|
+ if (stat(path, &st) != 0 || !S_ISDIR(st.st_mode)) {
|
|
|
fprintf(stderr, "Invalid root directory: \"%s\"\n", root);
|
|
|
exit(EXIT_FAILURE);
|
|
|
}
|
|
@@ -139,7 +139,7 @@ static char *sdup(const char *str) {
|
|
|
static void set_option(char **options, const char *name, const char *value) {
|
|
|
int i;
|
|
|
|
|
|
- if (!strcmp(name, "document_root")) {
|
|
|
+ if (!strcmp(name, "document_root") || !(strcmp(name, "r"))) {
|
|
|
verify_document_root(value);
|
|
|
}
|
|
|
|
|
@@ -159,46 +159,30 @@ static void set_option(char **options, const char *name, const char *value) {
|
|
|
}
|
|
|
|
|
|
static void process_command_line_arguments(char *argv[], char **options) {
|
|
|
- const char *config_file = CONFIG_FILE;
|
|
|
- char line[512], opt[512], *vals[100], val[512], path[FILENAME_MAX], *p;
|
|
|
- FILE *fp;
|
|
|
+ const char *config_file = NULL;
|
|
|
+ char line[512], opt[512], val[512], path[PATH_MAX], *p;
|
|
|
+ FILE *fp = NULL;
|
|
|
size_t i, line_no = 0;
|
|
|
|
|
|
- /* First find out, which config file to open */
|
|
|
- for (i = 1; argv[i] != NULL && argv[i][0] == '-'; i += 2)
|
|
|
- if (argv[i + 1] == NULL)
|
|
|
- show_usage_and_exit();
|
|
|
-
|
|
|
- if (argv[i] != NULL && argv[i + 1] != NULL) {
|
|
|
- /* More than one non-option arguments are given */
|
|
|
- show_usage_and_exit();
|
|
|
- } else if (argv[i] != NULL) {
|
|
|
- /* Just one non-option argument is given, this is config file */
|
|
|
- config_file = argv[i];
|
|
|
- } else {
|
|
|
- /* No config file specified. Look for one where binary lives */
|
|
|
+ /* Should we use a config file ? */
|
|
|
+ if (argv[1] != NULL && argv[2] == NULL) {
|
|
|
+ config_file = argv[1];
|
|
|
+ } else if (argv[1] == NULL) {
|
|
|
+ /* No command line flags specified. Look where binary lives */
|
|
|
if ((p = strrchr(argv[0], DIRSEP)) != 0) {
|
|
|
snprintf(path, sizeof(path), "%.*s%s",
|
|
|
- (int) (p - argv[0]) + 1, argv[0], config_file);
|
|
|
- config_file = path;
|
|
|
+ (int) (p - argv[0]) + 1, argv[0], CONFIG_FILE);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- fp = fopen(config_file, "r");
|
|
|
-
|
|
|
/* If config file was set in command line and open failed, exit */
|
|
|
- if (fp == NULL && argv[i] != NULL) {
|
|
|
+ if (config_file != NULL && (fp = fopen(config_file, "r")) == NULL) {
|
|
|
fprintf(stderr, "cannot open config file %s: %s\n",
|
|
|
config_file, strerror(errno));
|
|
|
exit(EXIT_FAILURE);
|
|
|
}
|
|
|
|
|
|
- /* Reset temporary value holders */
|
|
|
- (void) memset(vals, 0, sizeof(vals));
|
|
|
-
|
|
|
if (fp != NULL) {
|
|
|
- printf("Loading config file %s, ignoring command line arguments\n",
|
|
|
- config_file);
|
|
|
+ fprintf(stderr, "Loading config file %s\n", config_file);
|
|
|
|
|
|
/* Loop over the lines in config file */
|
|
|
while (fgets(line, sizeof(line), fp) != NULL) {
|
|
@@ -219,8 +203,12 @@ static void process_command_line_arguments(char *argv[], char **options) {
|
|
|
|
|
|
(void) fclose(fp);
|
|
|
} else {
|
|
|
- for (i = 1; argv[i] != NULL && argv[i][0] == '-'; i += 2)
|
|
|
+ for (i = 1; argv[i] != NULL; i += 2) {
|
|
|
+ if (argv[i][0] != '-' || argv[i + 1] == NULL || argv[i + 1][0] == '-') {
|
|
|
+ show_usage_and_exit();
|
|
|
+ }
|
|
|
set_option(options, &argv[i][1], argv[i + 1]);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|