version 1.161, 2014/09/03 18:09:14 |
version 1.162, 2014/09/03 23:21:47 |
|
|
/* $OpenBSD$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org> |
|
|
*/ |
*/ |
#include "config.h" |
#include "config.h" |
|
|
#include <sys/stat.h> |
|
#include <sys/types.h> |
#include <sys/types.h> |
|
#include <sys/stat.h> |
#include <sys/wait.h> |
#include <sys/wait.h> |
|
|
#include <assert.h> |
#include <assert.h> |
Line 1076 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
Line 1076 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
{ |
{ |
char any[] = "any"; |
char any[] = "any"; |
struct ohash_info str_info; |
struct ohash_info str_info; |
int fd[2]; |
|
struct mpage *mpage, *mpage_dest; |
struct mpage *mpage, *mpage_dest; |
struct mlink *mlink, *mlink_dest; |
struct mlink *mlink, *mlink_dest; |
struct mdoc *mdoc; |
struct mdoc *mdoc; |
Line 1084 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
Line 1083 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
char *sodest; |
char *sodest; |
char *cp; |
char *cp; |
pid_t child_pid; |
pid_t child_pid; |
int status; |
int fd; |
unsigned int pslot; |
unsigned int pslot; |
enum mandoclevel lvl; |
enum mandoclevel lvl; |
|
|
Line 1112 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
Line 1111 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
man = NULL; |
man = NULL; |
sodest = NULL; |
sodest = NULL; |
child_pid = 0; |
child_pid = 0; |
fd[0] = -1; |
|
fd[1] = -1; |
|
|
|
if (mpage->mlinks->gzip) { |
mparse_open(mp, &fd, mpage->mlinks->file, &child_pid); |
if (-1 == pipe(fd)) { |
if (fd == -1) { |
exitcode = (int)MANDOCLEVEL_SYSERR; |
say(mpage->mlinks->file, "&open"); |
say(mpage->mlinks->file, "&pipe gunzip"); |
goto nextpage; |
goto nextpage; |
|
} |
|
switch (child_pid = fork()) { |
|
case -1: |
|
exitcode = (int)MANDOCLEVEL_SYSERR; |
|
say(mpage->mlinks->file, "&fork gunzip"); |
|
child_pid = 0; |
|
close(fd[1]); |
|
close(fd[0]); |
|
goto nextpage; |
|
case 0: |
|
close(fd[0]); |
|
if (-1 == dup2(fd[1], STDOUT_FILENO)) { |
|
say(mpage->mlinks->file, |
|
"&dup gunzip"); |
|
exit(1); |
|
} |
|
execlp("gunzip", "gunzip", "-c", |
|
mpage->mlinks->file, NULL); |
|
say(mpage->mlinks->file, "&exec gunzip"); |
|
exit(1); |
|
default: |
|
close(fd[1]); |
|
break; |
|
} |
|
} |
} |
|
|
/* |
/* |
Line 1153 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
Line 1125 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
*/ |
*/ |
if (FORM_CAT != mpage->mlinks->dform || |
if (FORM_CAT != mpage->mlinks->dform || |
FORM_CAT != mpage->mlinks->fform) { |
FORM_CAT != mpage->mlinks->fform) { |
lvl = mparse_readfd(mp, fd[0], mpage->mlinks->file); |
lvl = mparse_readfd(mp, fd, mpage->mlinks->file); |
if (lvl < MANDOCLEVEL_FATAL) |
if (lvl < MANDOCLEVEL_FATAL) |
mparse_result(mp, &mdoc, &man, &sodest); |
mparse_result(mp, &mdoc, &man, &sodest); |
} |
} |
Line 1245 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
Line 1217 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
} else if (NULL != man) |
} else if (NULL != man) |
parse_man(mpage, man_node(man)); |
parse_man(mpage, man_node(man)); |
else |
else |
parse_cat(mpage, fd[0]); |
parse_cat(mpage, fd); |
if (NULL == mpage->desc) |
if (NULL == mpage->desc) |
mpage->desc = mandoc_strdup(mpage->mlinks->name); |
mpage->desc = mandoc_strdup(mpage->mlinks->name); |
|
|
Line 1257 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
Line 1229 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
dbadd(mpage, mc); |
dbadd(mpage, mc); |
|
|
nextpage: |
nextpage: |
if (child_pid) { |
if (child_pid && |
if (-1 == waitpid(child_pid, &status, 0)) { |
mparse_wait(mp, child_pid) != MANDOCLEVEL_OK) { |
exitcode = (int)MANDOCLEVEL_SYSERR; |
exitcode = (int)MANDOCLEVEL_SYSERR; |
say(mpage->mlinks->file, "&wait gunzip"); |
say(mpage->mlinks->file, "&wait gunzip"); |
} else if (WIFSIGNALED(status)) { |
|
exitcode = (int)MANDOCLEVEL_SYSERR; |
|
say(mpage->mlinks->file, |
|
"gunzip died from signal %d", |
|
WTERMSIG(status)); |
|
} else if (WEXITSTATUS(status)) { |
|
exitcode = (int)MANDOCLEVEL_SYSERR; |
|
say(mpage->mlinks->file, |
|
"gunzip failed with code %d", |
|
WEXITSTATUS(status)); |
|
} |
|
} |
} |
ohash_delete(&strings); |
ohash_delete(&strings); |
ohash_delete(&names); |
ohash_delete(&names); |
Line 2351 prepare_statements: |
|
Line 2312 prepare_statements: |
|
"PRAGMA synchronous = OFF", NULL, NULL, NULL)) { |
"PRAGMA synchronous = OFF", NULL, NULL, NULL)) { |
exitcode = (int)MANDOCLEVEL_SYSERR; |
exitcode = (int)MANDOCLEVEL_SYSERR; |
say(MANDOC_DB, "PRAGMA synchronous: %s", |
say(MANDOC_DB, "PRAGMA synchronous: %s", |
sqlite3_errmsg(db)); |
sqlite3_errmsg(db)); |
sqlite3_close(db); |
sqlite3_close(db); |
return(0); |
return(0); |
} |
} |