On Tue, Nov 19, 2019 at 03:53:16AM +0100, Florian Obser wrote:
> I think the file doesn't exist but it's fine check is in the wrong
> place. It's also stupid that it doesn't fatal(!) for unwind -f
> nonexistent. I think this needs to be handled further up in main.
> Maybe. I'll have a look if I don't forget.
The errno check in parse_config() does indeed look misplaced and other
parsers log fopen(3) failure directly in pushfile(), but it's not really
bad either.

Here's a simple diff for failing on missing failes iff `-f' is given.

        $ ./obj/unwind -f/nonexistent
        /nonexistent: No such file or directory
        $ ls /etc/unwind.conf
        ls: /etc/unwind.conf: No such file or directory
        $ doas ./obj/unwind -d
        startup

Feedback? OK?


Index: parse.y
===================================================================
RCS file: /cvs/src/sbin/unwind/parse.y,v
retrieving revision 1.15
diff -u -p -r1.15 parse.y
--- parse.y     9 Nov 2019 16:28:10 -0000       1.15
+++ parse.y     24 Nov 2019 20:55:06 -0000
@@ -776,7 +776,7 @@ popfile(void)
 }
 
 struct uw_conf *
-parse_config(char *filename)
+parse_config(char *filename, int require_file)
 {
        struct sym      *sym, *next;
 
@@ -784,7 +784,8 @@ parse_config(char *filename)
 
        file = pushfile(filename, 0);
        if (file == NULL) {
-               if (errno == ENOENT)    /* no config file is fine */
+               /* no config file is fine */
+               if (errno == ENOENT && !require_file)
                        return (conf);
                log_warn("%s", filename);
                free(conf);
Index: unwind.c
===================================================================
RCS file: /cvs/src/sbin/unwind/unwind.c,v
retrieving revision 1.37
diff -u -p -r1.37 unwind.c
--- unwind.c    19 Nov 2019 14:46:33 -0000      1.37
+++ unwind.c    24 Nov 2019 20:51:09 -0000
@@ -77,7 +77,8 @@ struct uw_conf        *main_conf;
 struct imsgev  *iev_frontend;
 struct imsgev  *iev_resolver;
 struct imsgev  *iev_captiveportal;
-char           *conffile;
+char           *conffile = CONF_FILE;
+int             require_file;
 
 pid_t           frontend_pid;
 pid_t           resolver_pid;
@@ -132,7 +133,6 @@ main(int argc, char *argv[])
        int              control_fd, ta_fd;
        char            *csock, *saved_argv0;
 
-       conffile = CONF_FILE;
        csock = UNWIND_SOCKET;
 
        log_init(1, LOG_DAEMON);        /* Log to stderr until daemonized. */
@@ -158,6 +158,7 @@ main(int argc, char *argv[])
                        break;
                case 'f':
                        conffile = optarg;
+                       require_file = 1;
                        break;
                case 'n':
                        cmd_opts |= OPT_NOACTION;
@@ -187,7 +188,7 @@ main(int argc, char *argv[])
        else if (captiveportal_flag)
                captiveportal(debug, cmd_opts & (OPT_VERBOSE | OPT_VERBOSE2));
 
-       if ((main_conf = parse_config(conffile)) == NULL)
+       if ((main_conf = parse_config(conffile, require_file)) == NULL)
                exit(1);
 
        if (cmd_opts & OPT_NOACTION) {
@@ -691,7 +692,7 @@ main_reload(void)
 {
        struct uw_conf  *xconf;
 
-       if ((xconf = parse_config(conffile)) == NULL)
+       if ((xconf = parse_config(conffile, require_file)) == NULL)
                return (-1);
 
        if (main_imsg_send_config(xconf) == -1)
Index: unwind.h
===================================================================
RCS file: /cvs/src/sbin/unwind/unwind.h,v
retrieving revision 1.33
diff -u -p -r1.33 unwind.h
--- unwind.h    22 Nov 2019 15:31:25 -0000      1.33
+++ unwind.h    24 Nov 2019 20:45:51 -0000
@@ -176,5 +176,5 @@ void                 config_clear(struct uw_conf *);
 void   print_config(struct uw_conf *);
 
 /* parse.y */
-struct uw_conf *parse_config(char *);
+struct uw_conf *parse_config(char *, int);
 int             cmdline_symset(char *);

Reply via email to