version 1.159, 2014/08/23 18:13:47 |
version 1.163, 2014/09/07 03:00:21 |
|
|
*/ |
*/ |
#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> |
|
|
OP_TEST /* change no databases, report potential problems */ |
OP_TEST /* change no databases, report potential problems */ |
}; |
}; |
|
|
enum form { |
|
FORM_NONE, /* format is unknown */ |
|
FORM_SRC, /* format is -man or -mdoc */ |
|
FORM_CAT /* format is cat */ |
|
}; |
|
|
|
struct str { |
struct str { |
char *rendered; /* key in UTF-8 or ASCII form */ |
char *rendered; /* key in UTF-8 or ASCII form */ |
const struct mpage *mpage; /* if set, the owning parse */ |
const struct mpage *mpage; /* if set, the owning parse */ |
|
|
struct mpage { |
struct mpage { |
struct inodev inodev; /* used for hashing routine */ |
struct inodev inodev; /* used for hashing routine */ |
int64_t pageid; /* pageid in mpages SQL table */ |
int64_t pageid; /* pageid in mpages SQL table */ |
enum form form; /* format from file content */ |
|
char *sec; /* section from file content */ |
char *sec; /* section from file content */ |
char *arch; /* architecture from file content */ |
char *arch; /* architecture from file content */ |
char *title; /* title from file content */ |
char *title; /* title from file content */ |
char *desc; /* description from file content */ |
char *desc; /* description from file content */ |
struct mlink *mlinks; /* singly linked list */ |
struct mlink *mlinks; /* singly linked list */ |
|
int form; /* format from file content */ |
}; |
}; |
|
|
struct mlink { |
struct mlink { |
char file[PATH_MAX]; /* filename rel. to manpath */ |
char file[PATH_MAX]; /* filename rel. to manpath */ |
enum form dform; /* format from directory */ |
|
enum form fform; /* format from file name suffix */ |
|
char *dsec; /* section from directory */ |
char *dsec; /* section from directory */ |
char *arch; /* architecture from directory */ |
char *arch; /* architecture from directory */ |
char *name; /* name from file name (not empty) */ |
char *name; /* name from file name (not empty) */ |
char *fsec; /* section from file name suffix */ |
char *fsec; /* section from file name suffix */ |
struct mlink *next; /* singly linked list */ |
struct mlink *next; /* singly linked list */ |
struct mpage *mpage; /* parent */ |
struct mpage *mpage; /* parent */ |
|
int dform; /* format from directory */ |
|
int fform; /* format from file name suffix */ |
int gzip; /* filename has a .gz suffix */ |
int gzip; /* filename has a .gz suffix */ |
}; |
}; |
|
|
Line 838 filescan(const char *file) |
|
Line 832 filescan(const char *file) |
|
} |
} |
|
|
mlink = mandoc_calloc(1, sizeof(struct mlink)); |
mlink = mandoc_calloc(1, sizeof(struct mlink)); |
|
mlink->dform = FORM_NONE; |
if (strlcpy(mlink->file, start, sizeof(mlink->file)) >= |
if (strlcpy(mlink->file, start, sizeof(mlink->file)) >= |
sizeof(mlink->file)) { |
sizeof(mlink->file)) { |
say(start, "Filename too long"); |
say(start, "Filename too long"); |
Line 1081 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 1089 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 1117 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 1158 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 1226 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
Line 1193 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
mpage->title = |
mpage->title = |
mandoc_strdup(mpage->mlinks->name); |
mandoc_strdup(mpage->mlinks->name); |
} |
} |
|
if (mpage->mlinks->gzip) |
|
mpage->form |= FORM_GZ; |
putkey(mpage, mpage->sec, TYPE_sec); |
putkey(mpage, mpage->sec, TYPE_sec); |
putkey(mpage, '\0' == *mpage->arch ? |
putkey(mpage, '\0' == *mpage->arch ? |
any : mpage->arch, TYPE_arch); |
any : mpage->arch, TYPE_arch); |
Line 1248 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 1260 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 1777 putkeys(const struct mpage *mpage, |
|
Line 1735 putkeys(const struct mpage *mpage, |
|
htab = &strings; |
htab = &strings; |
if (debug > 1) |
if (debug > 1) |
for (i = 0; i < mansearch_keymax; i++) |
for (i = 0; i < mansearch_keymax; i++) |
if (1 << i & v) |
if ((uint64_t)1 << i & v) |
say(mpage->mlinks->file, |
say(mpage->mlinks->file, |
"Adding key %s=%*s", |
"Adding key %s=%*s", |
mansearch_keynames[i], sz, cp); |
mansearch_keynames[i], sz, cp); |
Line 1984 dbadd_mlink(const struct mlink *mlink) |
|
Line 1942 dbadd_mlink(const struct mlink *mlink) |
|
SQL_BIND_INT64(stmts[STMT_INSERT_LINK], i, mlink->mpage->pageid); |
SQL_BIND_INT64(stmts[STMT_INSERT_LINK], i, mlink->mpage->pageid); |
SQL_STEP(stmts[STMT_INSERT_LINK]); |
SQL_STEP(stmts[STMT_INSERT_LINK]); |
sqlite3_reset(stmts[STMT_INSERT_LINK]); |
sqlite3_reset(stmts[STMT_INSERT_LINK]); |
|
|
|
i = 1; |
|
SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, NAME_FILE); |
|
SQL_BIND_TEXT(stmts[STMT_INSERT_NAME], i, mlink->name); |
|
SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, mlink->mpage->pageid); |
|
SQL_STEP(stmts[STMT_INSERT_NAME]); |
|
sqlite3_reset(stmts[STMT_INSERT_NAME]); |
} |
} |
|
|
/* |
/* |
Line 2050 dbadd(struct mpage *mpage, struct mchars *mc) |
|
Line 2015 dbadd(struct mpage *mpage, struct mchars *mc) |
|
|
|
i = 1; |
i = 1; |
SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, key->rendered); |
SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, key->rendered); |
SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form); |
SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, mpage->form); |
SQL_STEP(stmts[STMT_INSERT_PAGE]); |
SQL_STEP(stmts[STMT_INSERT_PAGE]); |
mpage->pageid = sqlite3_last_insert_rowid(db); |
mpage->pageid = sqlite3_last_insert_rowid(db); |
sqlite3_reset(stmts[STMT_INSERT_PAGE]); |
sqlite3_reset(stmts[STMT_INSERT_PAGE]); |
Line 2347 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); |
} |
} |