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 *);