version 1.267, 2016/07/08 22:29:05 |
version 1.273.2.2, 2016/09/18 16:13:02 |
|
|
#include <errno.h> |
#include <errno.h> |
#include <fcntl.h> |
#include <fcntl.h> |
#include <glob.h> |
#include <glob.h> |
|
#if HAVE_SANDBOX_INIT |
|
#include <sandbox.h> |
|
#endif |
#include <signal.h> |
#include <signal.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <stdint.h> |
#include <stdint.h> |
|
|
#include "manconf.h" |
#include "manconf.h" |
#include "mansearch.h" |
#include "mansearch.h" |
|
|
#if !defined(__GNUC__) || (__GNUC__ < 2) |
|
# if !defined(lint) |
|
# define __attribute__(x) |
|
# endif |
|
#endif /* !defined(__GNUC__) || (__GNUC__ < 2) */ |
|
|
|
enum outmode { |
enum outmode { |
OUTMODE_DEF = 0, |
OUTMODE_DEF = 0, |
OUTMODE_FLN, |
OUTMODE_FLN, |
Line 84 struct curparse { |
|
Line 81 struct curparse { |
|
struct manoutput *outopts; /* output options */ |
struct manoutput *outopts; /* output options */ |
}; |
}; |
|
|
|
|
|
#if HAVE_SQLITE3 |
|
int mandocdb(int, char *[]); |
|
#endif |
|
|
static int fs_lookup(const struct manpaths *, |
static int fs_lookup(const struct manpaths *, |
size_t ipath, const char *, |
size_t ipath, const char *, |
const char *, const char *, |
const char *, const char *, |
Line 92 static void fs_search(const struct mansearch *, |
|
Line 94 static void fs_search(const struct mansearch *, |
|
const struct manpaths *, int, char**, |
const struct manpaths *, int, char**, |
struct manpage **, size_t *); |
struct manpage **, size_t *); |
static int koptions(int *, char *); |
static int koptions(int *, char *); |
#if HAVE_SQLITE3 |
|
int mandocdb(int, char**); |
|
#endif |
|
static int moptions(int *, char *); |
static int moptions(int *, char *); |
static void mmsg(enum mandocerr, enum mandoclevel, |
static void mmsg(enum mandocerr, enum mandoclevel, |
const char *, int, int, const char *); |
const char *, int, int, const char *); |
|
static void outdata_alloc(struct curparse *); |
static void parse(struct curparse *, int, const char *); |
static void parse(struct curparse *, int, const char *); |
static void passthrough(const char *, int, int); |
static void passthrough(const char *, int, int); |
static pid_t spawn_pager(struct tag_files *); |
static pid_t spawn_pager(struct tag_files *); |
Line 159 main(int argc, char *argv[]) |
|
Line 159 main(int argc, char *argv[]) |
|
err((int)MANDOCLEVEL_SYSERR, "pledge"); |
err((int)MANDOCLEVEL_SYSERR, "pledge"); |
#endif |
#endif |
|
|
|
#if HAVE_SANDBOX_INIT |
|
if (sandbox_init(kSBXProfileNoInternet, SANDBOX_NAMED, NULL) == -1) |
|
errx((int)MANDOCLEVEL_SYSERR, "sandbox_init"); |
|
#endif |
|
|
/* Search options. */ |
/* Search options. */ |
|
|
memset(&conf, 0, sizeof(conf)); |
memset(&conf, 0, sizeof(conf)); |
Line 478 main(int argc, char *argv[]) |
|
Line 483 main(int argc, char *argv[]) |
|
passthrough(resp->file, fd, |
passthrough(resp->file, fd, |
conf.output.synopsisonly); |
conf.output.synopsisonly); |
|
|
if (argc > 1 && curp.outtype <= OUTT_UTF8) |
if (argc > 1 && curp.outtype <= OUTT_UTF8) { |
|
if (curp.outdata == NULL) |
|
outdata_alloc(&curp); |
terminal_sepline(curp.outdata); |
terminal_sepline(curp.outdata); |
|
} |
} else if (rc < MANDOCLEVEL_ERROR) |
} else if (rc < MANDOCLEVEL_ERROR) |
rc = MANDOCLEVEL_ERROR; |
rc = MANDOCLEVEL_ERROR; |
|
|
Line 739 parse(struct curparse *curp, int fd, const char *file) |
|
Line 747 parse(struct curparse *curp, int fd, const char *file) |
|
if (rctmp != MANDOCLEVEL_OK && curp->wstop) |
if (rctmp != MANDOCLEVEL_OK && curp->wstop) |
return; |
return; |
|
|
/* If unset, allocate output dev now (if applicable). */ |
if (curp->outdata == NULL) |
|
outdata_alloc(curp); |
|
|
if (curp->outdata == NULL) { |
|
switch (curp->outtype) { |
|
case OUTT_HTML: |
|
curp->outdata = html_alloc(curp->outopts); |
|
break; |
|
case OUTT_UTF8: |
|
curp->outdata = utf8_alloc(curp->outopts); |
|
break; |
|
case OUTT_LOCALE: |
|
curp->outdata = locale_alloc(curp->outopts); |
|
break; |
|
case OUTT_ASCII: |
|
curp->outdata = ascii_alloc(curp->outopts); |
|
break; |
|
case OUTT_PDF: |
|
curp->outdata = pdf_alloc(curp->outopts); |
|
break; |
|
case OUTT_PS: |
|
curp->outdata = ps_alloc(curp->outopts); |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
|
|
|
mparse_result(curp->mp, &man, NULL); |
mparse_result(curp->mp, &man, NULL); |
|
|
/* Execute the out device, if it exists. */ |
/* Execute the out device, if it exists. */ |
Line 821 parse(struct curparse *curp, int fd, const char *file) |
|
Line 805 parse(struct curparse *curp, int fd, const char *file) |
|
} |
} |
|
|
static void |
static void |
|
outdata_alloc(struct curparse *curp) |
|
{ |
|
switch (curp->outtype) { |
|
case OUTT_HTML: |
|
curp->outdata = html_alloc(curp->outopts); |
|
break; |
|
case OUTT_UTF8: |
|
curp->outdata = utf8_alloc(curp->outopts); |
|
break; |
|
case OUTT_LOCALE: |
|
curp->outdata = locale_alloc(curp->outopts); |
|
break; |
|
case OUTT_ASCII: |
|
curp->outdata = ascii_alloc(curp->outopts); |
|
break; |
|
case OUTT_PDF: |
|
curp->outdata = pdf_alloc(curp->outopts); |
|
break; |
|
case OUTT_PS: |
|
curp->outdata = ps_alloc(curp->outopts); |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
|
|
|
static void |
passthrough(const char *file, int fd, int synopsis_only) |
passthrough(const char *file, int fd, int synopsis_only) |
{ |
{ |
const char synb[] = "S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS"; |
const char synb[] = "S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS"; |
Line 830 passthrough(const char *file, int fd, int synopsis_onl |
|
Line 841 passthrough(const char *file, int fd, int synopsis_onl |
|
const char *syscall; |
const char *syscall; |
char *line, *cp; |
char *line, *cp; |
size_t linesz; |
size_t linesz; |
|
ssize_t len, written; |
int print; |
int print; |
|
|
line = NULL; |
line = NULL; |
linesz = 0; |
linesz = 0; |
|
|
|
if (fflush(stdout) == EOF) { |
|
syscall = "fflush"; |
|
goto fail; |
|
} |
|
|
if ((stream = fdopen(fd, "r")) == NULL) { |
if ((stream = fdopen(fd, "r")) == NULL) { |
close(fd); |
close(fd); |
syscall = "fdopen"; |
syscall = "fdopen"; |
Line 842 passthrough(const char *file, int fd, int synopsis_onl |
|
Line 859 passthrough(const char *file, int fd, int synopsis_onl |
|
} |
} |
|
|
print = 0; |
print = 0; |
while (getline(&line, &linesz, stream) != -1) { |
while ((len = getline(&line, &linesz, stream)) != -1) { |
cp = line; |
cp = line; |
if (synopsis_only) { |
if (synopsis_only) { |
if (print) { |
if (print) { |
if ( ! isspace((unsigned char)*cp)) |
if ( ! isspace((unsigned char)*cp)) |
goto done; |
goto done; |
while (isspace((unsigned char)*cp)) |
while (isspace((unsigned char)*cp)) { |
cp++; |
cp++; |
|
len--; |
|
} |
} else { |
} else { |
if (strcmp(cp, synb) == 0 || |
if (strcmp(cp, synb) == 0 || |
strcmp(cp, synr) == 0) |
strcmp(cp, synr) == 0) |
Line 857 passthrough(const char *file, int fd, int synopsis_onl |
|
Line 876 passthrough(const char *file, int fd, int synopsis_onl |
|
continue; |
continue; |
} |
} |
} |
} |
if (fputs(cp, stdout)) { |
for (; len > 0; len -= written) { |
|
if ((written = write(STDOUT_FILENO, cp, len)) != -1) |
|
continue; |
fclose(stream); |
fclose(stream); |
syscall = "fputs"; |
syscall = "write"; |
goto fail; |
goto fail; |
} |
} |
} |
} |
Line 970 woptions(struct curparse *curp, char *arg) |
|
Line 991 woptions(struct curparse *curp, char *arg) |
|
|
|
while (*arg) { |
while (*arg) { |
o = arg; |
o = arg; |
switch (getsubopt(&arg, UNCONST(toks), &v)) { |
switch (getsubopt(&arg, (char * const *)toks, &v)) { |
case 0: |
case 0: |
curp->wstop = 1; |
curp->wstop = 1; |
break; |
break; |
Line 1002 mmsg(enum mandocerr t, enum mandoclevel lvl, |
|
Line 1023 mmsg(enum mandocerr t, enum mandoclevel lvl, |
|
{ |
{ |
const char *mparse_msg; |
const char *mparse_msg; |
|
|
fprintf(stderr, "%s: %s:", getprogname(), file); |
fprintf(stderr, "%s: %s:", getprogname(), |
|
file == NULL ? "<stdin>" : file); |
|
|
if (line) |
if (line) |
fprintf(stderr, "%d:%d:", line, col + 1); |
fprintf(stderr, "%d:%d:", line, col + 1); |
Line 1055 spawn_pager(struct tag_files *tag_files) |
|
Line 1077 spawn_pager(struct tag_files *tag_files) |
|
break; |
break; |
} |
} |
|
|
/* For more(1) and less(1), use the tag file. */ |
/* For less(1), use the tag file. */ |
|
|
if ((cmdlen = strlen(argv[0])) >= 4) { |
if ((cmdlen = strlen(argv[0])) >= 4) { |
cp = argv[0] + cmdlen - 4; |
cp = argv[0] + cmdlen - 4; |
if (strcmp(cp, "less") == 0 || strcmp(cp, "more") == 0) { |
if (strcmp(cp, "less") == 0) { |
argv[argc++] = mandoc_strdup("-T"); |
argv[argc++] = mandoc_strdup("-T"); |
argv[argc++] = tag_files->tfn; |
argv[argc++] = tag_files->tfn; |
} |
} |