]> git.cameronkatri.com Git - mandoc.git/commitdiff
Move the full responsibility for reporting open(2) errors from
authorIngo Schwarze <schwarze@openbsd.org>
Thu, 20 Dec 2018 21:30:32 +0000 (21:30 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Thu, 20 Dec 2018 21:30:32 +0000 (21:30 +0000)
mparse_open() to the caller.  That is better because only the caller
knows its preferred reporting method and format and only the caller
has access to all the data that should be included - like the column
number in .so processing or the current manpath in makewhatis(8).
Moving the mandoc_msg() call out is possible because the caller can
call strerror(3) just as easily as mparse_open() can.

Move mandoc_msg_setinfilename() closer to the parsing of the file
contents, to avoid problems *with* the file (like non-existence,
lack of permissions, etc.) getting misreported as problems *in*
the file.

Fix the column number reported for .so failure:
let it point to the beginning of the filename.

Taken together, this prevents makewhatis(8) from spewing confusing
messages about .so failures to stderr, a bug reported by
Raf Czlonka <rczlonka at gmail dot com> on ports@.

It also prevents mandoc(1) from issuing *two* messages for every
single .so failure.

main.c
read.c

diff --git a/main.c b/main.c
index 0acc9c3a0a9b02c18bd97d62c61128afbeaf96f2..150e808af805cd05686830fe288d519873e811f2 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/*     $Id: main.c,v 1.313 2018/12/14 05:18:02 schwarze Exp $ */
+/*     $Id: main.c,v 1.314 2018/12/20 21:30:32 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2012, 2014-2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -510,7 +510,6 @@ main(int argc, char *argv[])
                } else
                        thisarg = *argv;
 
-               mandoc_msg_setinfilename(thisarg);
                fd = mparse_open(curp.mp, thisarg);
                if (fd != -1) {
                        if (use_pager) {
@@ -523,11 +522,13 @@ main(int argc, char *argv[])
                                            conf.output.tag : *argv;
                        }
 
+                       mandoc_msg_setinfilename(thisarg);
                        if (resp == NULL || resp->form == FORM_SRC)
                                parse(&curp, fd, thisarg);
                        else
                                passthrough(resp->file, fd,
                                    conf.output.synopsisonly);
+                       mandoc_msg_setinfilename(NULL);
 
                        if (ferror(stdout)) {
                                if (tag_files != NULL) {
@@ -545,8 +546,9 @@ main(int argc, char *argv[])
                                        outdata_alloc(&curp);
                                terminal_sepline(curp.outdata);
                        }
-               }
-               mandoc_msg_setinfilename(NULL);
+               } else
+                       mandoc_msg(MANDOCERR_FILE, 0, 0,
+                           "%s", strerror(errno));
 
                if (curp.wstop && mandoc_msg_getrc() != MANDOCLEVEL_OK)
                        break;
diff --git a/read.c b/read.c
index 081230262acbffecc71489aa165dd74c52ef1588..17200e0932736b734923f9d89d7a17bf9140a39d 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/*     $Id: read.c,v 1.207 2018/12/14 06:33:14 schwarze Exp $ */
+/*     $Id: read.c,v 1.208 2018/12/20 21:30:32 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -372,8 +372,9 @@ rerun:
                                mparse_readfd(curp, fd, ln.buf + of);
                                close(fd);
                        } else {
-                               mandoc_msg(MANDOCERR_SO_FAIL, curp->line,
-                                   pos, ".so %s", ln.buf + of);
+                               mandoc_msg(MANDOCERR_SO_FAIL,
+                                   curp->line, of, ".so %s: %s",
+                                   ln.buf + of, strerror(errno));
                                ln.sz = mandoc_asprintf(&cp,
                                    ".sp\nSee the file %s.\n.sp",
                                    ln.buf + of);
@@ -633,7 +634,6 @@ mparse_open(struct mparse *curp, const char *file)
 
        /* Neither worked, give up. */
 
-       mandoc_msg(MANDOCERR_FILE, 0, 0, "%s", strerror(errno));
        return -1;
 }