aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-11-26 21:40:17 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-11-26 21:40:17 +0000
commit0334f84d7012e2930aa3d735e3c95f156bb3a679 (patch)
tree3e73211ed643468e16f996cb81015f698177c744
parent6b21541c4f687461a2efa734f27f3451da3030f8 (diff)
downloadmandoc-0334f84d7012e2930aa3d735e3c95f156bb3a679.tar.gz
mandoc-0334f84d7012e2930aa3d735e3c95f156bb3a679.tar.zst
mandoc-0334f84d7012e2930aa3d735e3c95f156bb3a679.zip
Simplify the mparse_open()/mparse_wait() interface.
Don't bother the user with the PID of the child process, store it inside the opaque mparse handle.
-rw-r--r--TODO5
-rw-r--r--main.c12
-rw-r--r--mandoc.314
-rw-r--r--mandoc.h7
-rw-r--r--mandocdb.c9
-rw-r--r--read.c19
6 files changed, 27 insertions, 39 deletions
diff --git a/TODO b/TODO
index b6322622..98cb687e 100644
--- a/TODO
+++ b/TODO
@@ -1,6 +1,6 @@
************************************************************************
* Official mandoc TODO.
-* $Id: TODO,v 1.188 2014/11/20 02:21:27 schwarze Exp $
+* $Id: TODO,v 1.189 2014/11/26 21:40:17 schwarze Exp $
************************************************************************
Many issues are annotated for difficulty as follows:
@@ -564,6 +564,9 @@ Several areas can be cleaned up to make mandoc even faster. These are
* structural issues
************************************************************************
+- Use libz directly instead of forking gunzip(1).
+ Suggested by bapt at FreeBSD among others.
+
- We use the input line number at several places to distinguish
same-line from different-line input. That plainly doesn't work
with user-defined macros, leading to random breakage.
diff --git a/main.c b/main.c
index 63ac45e8..34784994 100644
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/* $Id: main.c,v 1.199 2014/11/11 19:04:55 schwarze Exp $ */
+/* $Id: main.c,v 1.200 2014/11/26 21:40:17 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2011, 2012, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -115,7 +115,6 @@ main(int argc, char *argv[])
#endif
enum mandoclevel rc;
enum outmode outmode;
- pid_t child_pid;
int fd;
int show_usage;
int use_pager;
@@ -388,8 +387,7 @@ main(int argc, char *argv[])
while (argc) {
#if HAVE_SQLITE3
if (resp != NULL) {
- rc = mparse_open(curp.mp, &fd, resp->file,
- &child_pid);
+ rc = mparse_open(curp.mp, &fd, resp->file);
if (fd == -1)
/* nothing */;
else if (resp->form & FORM_SRC) {
@@ -403,14 +401,12 @@ main(int argc, char *argv[])
} else
#endif
{
- rc = mparse_open(curp.mp, &fd, *argv++,
- &child_pid);
+ rc = mparse_open(curp.mp, &fd, *argv++);
if (fd != -1)
parse(&curp, fd, argv[-1], &rc);
}
- if (child_pid &&
- mparse_wait(curp.mp, child_pid) != MANDOCLEVEL_OK)
+ if (mparse_wait(curp.mp) != MANDOCLEVEL_OK)
rc = MANDOCLEVEL_SYSERR;
if (MANDOCLEVEL_OK != rc && curp.wstop)
diff --git a/mandoc.3 b/mandoc.3
index f03b0307..08a0d168 100644
--- a/mandoc.3
+++ b/mandoc.3
@@ -1,4 +1,4 @@
-.\" $Id: mandoc.3,v 1.27 2014/10/28 17:36:19 schwarze Exp $
+.\" $Id: mandoc.3,v 1.28 2014/11/26 21:40:17 schwarze Exp $
.\"
.\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
.\" Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -15,7 +15,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: October 28 2014 $
+.Dd $Mdocdate: November 26 2014 $
.Dt MANDOC 3
.Os
.Sh NAME
@@ -81,7 +81,6 @@
.Fa "struct mparse *parse"
.Fa "int *fd"
.Fa "const char *fname"
-.Fa "pid_t *child_pid"
.Fc
.Ft "enum mandoclevel"
.Fo mparse_readfd
@@ -111,7 +110,6 @@
.Ft "enum mandoclevel"
.Fo mparse_wait
.Fa "struct mparse *parse"
-.Fa "pid_t child_pid"
.Fc
.In sys/types.h
.In mandoc.h
@@ -404,14 +402,6 @@ or -1 on failure.
It can be passed to
.Fn mparse_readfd
or used directly.
-If applicable, return the
-.Xr gunzip 1
-child process ID in
-.Fa child_pid ,
-or otherwise 0.
-If non-zero, it should be passed to
-.Fn mparse_wait
-after completing the parse sequence.
Declared in
.In mandoc.h ,
implemented in
diff --git a/mandoc.h b/mandoc.h
index f3dff946..80a7bfc1 100644
--- a/mandoc.h
+++ b/mandoc.h
@@ -1,4 +1,4 @@
-/* $Id: mandoc.h,v 1.168 2014/10/29 00:17:43 schwarze Exp $ */
+/* $Id: mandoc.h,v 1.169 2014/11/26 21:40:17 schwarze Exp $ */
/*
* Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -436,8 +436,7 @@ struct mparse *mparse_alloc(int, enum mandoclevel, mandocmsg,
const struct mchars *, const char *);
void mparse_free(struct mparse *);
void mparse_keep(struct mparse *);
-enum mandoclevel mparse_open(struct mparse *, int *, const char *,
- pid_t *);
+enum mandoclevel mparse_open(struct mparse *, int *, const char *);
enum mandoclevel mparse_readfd(struct mparse *, int, const char *);
enum mandoclevel mparse_readmem(struct mparse *, const void *, size_t,
const char *);
@@ -447,7 +446,7 @@ void mparse_result(struct mparse *,
const char *mparse_getkeep(const struct mparse *);
const char *mparse_strerror(enum mandocerr);
const char *mparse_strlevel(enum mandoclevel);
-enum mandoclevel mparse_wait(struct mparse *, pid_t);
+enum mandoclevel mparse_wait(struct mparse *);
__END_DECLS
diff --git a/mandocdb.c b/mandocdb.c
index 7d9caf23..7377d847 100644
--- a/mandocdb.c
+++ b/mandocdb.c
@@ -1,4 +1,4 @@
-/* $Id: mandocdb.c,v 1.169 2014/11/19 20:40:51 schwarze Exp $ */
+/* $Id: mandocdb.c,v 1.170 2014/11/26 21:40:17 schwarze Exp $ */
/*
* Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -1084,7 +1084,6 @@ mpages_merge(struct mchars *mc, struct mparse *mp)
struct man *man;
char *sodest;
char *cp;
- pid_t child_pid;
int fd;
unsigned int pslot;
enum mandoclevel lvl;
@@ -1112,9 +1111,8 @@ mpages_merge(struct mchars *mc, struct mparse *mp)
mdoc = NULL;
man = NULL;
sodest = NULL;
- child_pid = 0;
- mparse_open(mp, &fd, mpage->mlinks->file, &child_pid);
+ mparse_open(mp, &fd, mpage->mlinks->file);
if (fd == -1) {
say(mpage->mlinks->file, "&open");
goto nextpage;
@@ -1231,8 +1229,7 @@ mpages_merge(struct mchars *mc, struct mparse *mp)
dbadd(mpage, mc);
nextpage:
- if (child_pid &&
- mparse_wait(mp, child_pid) != MANDOCLEVEL_OK) {
+ if (mparse_wait(mp) != MANDOCLEVEL_OK) {
exitcode = (int)MANDOCLEVEL_SYSERR;
say(mpage->mlinks->file, "&wait gunzip");
}
diff --git a/read.c b/read.c
index 5bd5de57..cad96e2d 100644
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/* $Id: read.c,v 1.96 2014/11/01 06:03:13 schwarze Exp $ */
+/* $Id: read.c,v 1.97 2014/11/26 21:40:17 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -64,6 +64,7 @@ struct mparse {
int filenc; /* encoding of the current file */
int reparse_count; /* finite interp. stack */
int line; /* line number in the file */
+ pid_t child; /* the gunzip(1) process */
};
static void choose_parser(struct mparse *);
@@ -823,8 +824,7 @@ mparse_readfd(struct mparse *curp, int fd, const char *file)
}
enum mandoclevel
-mparse_open(struct mparse *curp, int *fd, const char *file,
- pid_t *child_pid)
+mparse_open(struct mparse *curp, int *fd, const char *file)
{
int pfd[2];
char *cp;
@@ -834,7 +834,7 @@ mparse_open(struct mparse *curp, int *fd, const char *file,
curp->file = file;
if ((cp = strrchr(file, '.')) == NULL ||
strcmp(cp + 1, "gz")) {
- *child_pid = 0;
+ curp->child = 0;
if ((*fd = open(file, O_RDONLY)) == -1) {
err = MANDOCERR_SYSOPEN;
goto out;
@@ -847,7 +847,7 @@ mparse_open(struct mparse *curp, int *fd, const char *file,
goto out;
}
- switch (*child_pid = fork()) {
+ switch (curp->child = fork()) {
case -1:
err = MANDOCERR_SYSFORK;
close(pfd[0]);
@@ -871,7 +871,7 @@ mparse_open(struct mparse *curp, int *fd, const char *file,
out:
*fd = -1;
- *child_pid = 0;
+ curp->child = 0;
curp->file_status = MANDOCLEVEL_SYSERR;
if (curp->mmsg)
(*curp->mmsg)(err, curp->file_status, file,
@@ -882,11 +882,14 @@ out:
}
enum mandoclevel
-mparse_wait(struct mparse *curp, pid_t child_pid)
+mparse_wait(struct mparse *curp)
{
int status;
- if (waitpid(child_pid, &status, 0) == -1) {
+ if (curp->child == 0)
+ return(MANDOCLEVEL_OK);
+
+ if (waitpid(curp->child, &status, 0) == -1) {
mandoc_msg(MANDOCERR_SYSWAIT, curp, 0, 0,
strerror(errno));
curp->file_status = MANDOCLEVEL_SYSERR;