version 1.355, 2021/06/02 18:28:19 |
version 1.360, 2021/10/04 21:29:17 |
Line 94 struct outstate { |
|
Line 94 struct outstate { |
|
int mandocdb(int, char *[]); |
int mandocdb(int, char *[]); |
|
|
static void check_xr(struct manpaths *); |
static void check_xr(struct manpaths *); |
static int fs_lookup(const struct manpaths *, |
static void fs_append(char **, size_t, int, |
size_t ipath, const char *, |
size_t, const char *, enum form, |
const char *, const char *, |
|
struct manpage **, size_t *); |
struct manpage **, size_t *); |
|
static int fs_lookup(const struct manpaths *, size_t, |
|
const char *, const char *, const char *, |
|
struct manpage **, size_t *); |
static int fs_search(const struct mansearch *, |
static int fs_search(const struct mansearch *, |
const struct manpaths *, const char *, |
const struct manpaths *, const char *, |
struct manpage **, size_t *); |
struct manpage **, size_t *); |
Line 130 main(int argc, char *argv[]) |
|
Line 132 main(int argc, char *argv[]) |
|
struct mparse *mp; /* Opaque parser object. */ |
struct mparse *mp; /* Opaque parser object. */ |
const char *conf_file; /* -C: alternate config file. */ |
const char *conf_file; /* -C: alternate config file. */ |
const char *os_s; /* -I: Operating system for display. */ |
const char *os_s; /* -I: Operating system for display. */ |
const char *progname, *sec; |
const char *progname, *sec, *ep; |
char *defpaths; /* -M: override manpaths. */ |
char *defpaths; /* -M: override manpaths. */ |
char *auxpaths; /* -m: additional manpaths. */ |
char *auxpaths; /* -m: additional manpaths. */ |
char *oarg; /* -O: output option string. */ |
char *oarg; /* -O: output option string. */ |
Line 514 main(int argc, char *argv[]) |
|
Line 516 main(int argc, char *argv[]) |
|
memcpy(res + ressz, resn, |
memcpy(res + ressz, resn, |
sizeof(*resn) * resnsz); |
sizeof(*resn) * resnsz); |
ressz += resnsz; |
ressz += resnsz; |
|
free(resn); |
|
resn = NULL; |
|
resnsz = 0; |
continue; |
continue; |
} |
} |
|
|
Line 534 main(int argc, char *argv[]) |
|
Line 539 main(int argc, char *argv[]) |
|
sec++; /* Prefer without suffix. */ |
sec++; /* Prefer without suffix. */ |
if (*sec != '/') |
if (*sec != '/') |
prio += 10; /* Wrong dir name. */ |
prio += 10; /* Wrong dir name. */ |
if (search.sec != NULL && |
if (search.sec != NULL) { |
(strlen(sec) <= ssz + 3 || |
ep = strchr(sec, '\0'); |
strcmp(sec + strlen(sec) - ssz, |
if (ep - sec > 3 && |
search.sec) != 0)) |
strncmp(ep - 3, ".gz", 3) == 0) |
prio += 20; /* Wrong file ext. */ |
ep -= 3; |
|
if ((size_t)(ep - sec) < ssz + 3 || |
|
strncmp(ep - ssz, search.sec, |
|
ssz) != 0) /* Wrong file */ |
|
prio += 20; /* extension. */ |
|
} |
if (prio >= best_prio) |
if (prio >= best_prio) |
continue; |
continue; |
best_prio = prio; |
best_prio = prio; |
Line 547 main(int argc, char *argv[]) |
|
Line 557 main(int argc, char *argv[]) |
|
res = mandoc_reallocarray(res, ressz + 1, |
res = mandoc_reallocarray(res, ressz + 1, |
sizeof(*res)); |
sizeof(*res)); |
memcpy(res + ressz++, resn + ib, sizeof(*resn)); |
memcpy(res + ressz++, resn + ib, sizeof(*resn)); |
|
memset(resn + ib, 0, sizeof(*resn)); |
|
mansearch_free(resn, resnsz); |
|
resn = NULL; |
|
resnsz = 0; |
} |
} |
|
|
/* apropos(1), whatis(1): Process the full search expression. */ |
/* apropos(1), whatis(1): Process the full search expression. */ |
Line 700 glob_esc(char **dst, const char *src, const char *suff |
|
Line 714 glob_esc(char **dst, const char *src, const char *suff |
|
*(*dst)++ = *suffix++; |
*(*dst)++ = *suffix++; |
} |
} |
|
|
|
static void |
|
fs_append(char **file, size_t filesz, int copy, size_t ipath, |
|
const char *sec, enum form form, struct manpage **res, size_t *ressz) |
|
{ |
|
struct manpage *page; |
|
|
|
*res = mandoc_reallocarray(*res, *ressz + filesz, sizeof(**res)); |
|
page = *res + *ressz; |
|
*ressz += filesz; |
|
for (;;) { |
|
page->file = copy ? mandoc_strdup(*file) : *file; |
|
page->names = NULL; |
|
page->output = NULL; |
|
page->bits = NAME_FILE & NAME_MASK; |
|
page->ipath = ipath; |
|
page->sec = (*sec >= '1' && *sec <= '9') ? *sec - '1' + 1 : 10; |
|
page->form = form; |
|
if (--filesz == 0) |
|
break; |
|
file++; |
|
page++; |
|
} |
|
} |
|
|
static int |
static int |
fs_lookup(const struct manpaths *paths, size_t ipath, |
fs_lookup(const struct manpaths *paths, size_t ipath, |
const char *sec, const char *arch, const char *name, |
const char *sec, const char *arch, const char *name, |
Line 707 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
Line 745 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
{ |
{ |
struct stat sb; |
struct stat sb; |
glob_t globinfo; |
glob_t globinfo; |
struct manpage *page; |
char *file, *cp, secnum[2]; |
char *file, *cp; |
|
int globres; |
int globres; |
enum form form; |
enum form form; |
|
|
const char *const slman = "/man"; |
const char *const slman = "/man"; |
const char *const slash = "/"; |
const char *const slash = "/"; |
const char *const sglob = ".[01-9]*"; |
const char *const sglob = ".[01-9]*"; |
|
const char *const dot = "."; |
|
const char *const aster = "*"; |
|
|
|
memset(&globinfo, 0, sizeof(globinfo)); |
form = FORM_SRC; |
form = FORM_SRC; |
|
|
mandoc_asprintf(&file, "%s/man%s/%s.%s", |
mandoc_asprintf(&file, "%s/man%s/%s.%s", |
paths->paths[ipath], sec, name, sec); |
paths->paths[ipath], sec, name, sec); |
if (stat(file, &sb) != -1) |
if (stat(file, &sb) != -1) |
Line 751 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
Line 792 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
mandoc_msg(MANDOCERR_GLOB, 0, 0, |
mandoc_msg(MANDOCERR_GLOB, 0, 0, |
"%s: %s", file, strerror(errno)); |
"%s: %s", file, strerror(errno)); |
free(file); |
free(file); |
|
file = NULL; |
if (globres == 0) |
if (globres == 0) |
file = mandoc_strdup(*globinfo.gl_pathv); |
goto found; |
globfree(&globinfo); |
globfree(&globinfo); |
if (globres == 0) { |
|
if (stat(file, &sb) != -1) |
if (sec[1] != '\0' && *ressz == 0) { |
goto found; |
secnum[0] = sec[0]; |
|
secnum[1] = '\0'; |
|
cp = file = mandoc_malloc(strlen(paths->paths[ipath]) * 2 + |
|
strlen(slman) + strlen(secnum) * 2 + strlen(slash) + |
|
strlen(name) * 2 + strlen(dot) + |
|
strlen(sec) * 2 + strlen(aster) + 1); |
|
glob_esc(&cp, paths->paths[ipath], slman); |
|
glob_esc(&cp, secnum, slash); |
|
glob_esc(&cp, name, dot); |
|
glob_esc(&cp, sec, aster); |
|
*cp = '\0'; |
|
globres = glob(file, 0, NULL, &globinfo); |
|
if (globres != 0 && globres != GLOB_NOMATCH) |
|
mandoc_msg(MANDOCERR_GLOB, 0, 0, |
|
"%s: %s", file, strerror(errno)); |
free(file); |
free(file); |
|
file = NULL; |
|
if (globres == 0) |
|
goto found; |
|
globfree(&globinfo); |
} |
} |
|
|
if (res != NULL || ipath + 1 != paths->sz) |
if (res != NULL || ipath + 1 != paths->sz) |
return -1; |
return -1; |
|
|
Line 770 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
Line 831 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
found: |
found: |
warnx("outdated mandoc.db lacks %s(%s) entry, run %s %s", |
warnx("outdated mandoc.db lacks %s(%s) entry, run %s %s", |
name, sec, BINM_MAKEWHATIS, paths->paths[ipath]); |
name, sec, BINM_MAKEWHATIS, paths->paths[ipath]); |
if (res == NULL) { |
if (res == NULL) |
free(file); |
free(file); |
return 0; |
else if (file == NULL) |
} |
fs_append(globinfo.gl_pathv, globinfo.gl_pathc, 1, |
*res = mandoc_reallocarray(*res, ++*ressz, sizeof(**res)); |
ipath, sec, form, res, ressz); |
page = *res + (*ressz - 1); |
else |
page->file = file; |
fs_append(&file, 1, 0, ipath, sec, form, res, ressz); |
page->names = NULL; |
globfree(&globinfo); |
page->output = NULL; |
|
page->bits = NAME_FILE & NAME_MASK; |
|
page->ipath = ipath; |
|
page->sec = (*sec >= '1' && *sec <= '9') ? *sec - '1' + 1 : 10; |
|
page->form = form; |
|
return 0; |
return 0; |
} |
} |
|
|
Line 968 parse(struct mparse *mp, int fd, const char *file, |
|
Line 1024 parse(struct mparse *mp, int fd, const char *file, |
|
case OUTT_PS: |
case OUTT_PS: |
terminal_man(outst->outdata, meta); |
terminal_man(outst->outdata, meta); |
break; |
break; |
|
case OUTT_MARKDOWN: |
|
mandoc_msg(MANDOCERR_MAN_TMARKDOWN, 0, 0, NULL); |
|
break; |
default: |
default: |
break; |
break; |
} |
} |
Line 1227 spawn_pager(struct outstate *outst, char *tag_target) |
|
Line 1286 spawn_pager(struct outstate *outst, char *tag_target) |
|
char *argv[MAX_PAGER_ARGS]; |
char *argv[MAX_PAGER_ARGS]; |
const char *pager; |
const char *pager; |
char *cp; |
char *cp; |
|
size_t wordlen; |
#if HAVE_LESS_T |
#if HAVE_LESS_T |
size_t cmdlen; |
size_t cmdlen; |
#endif |
#endif |
Line 1241 spawn_pager(struct outstate *outst, char *tag_target) |
|
Line 1301 spawn_pager(struct outstate *outst, char *tag_target) |
|
pager = getenv("PAGER"); |
pager = getenv("PAGER"); |
if (pager == NULL || *pager == '\0') |
if (pager == NULL || *pager == '\0') |
pager = BINM_PAGER; |
pager = BINM_PAGER; |
cp = mandoc_strdup(pager); |
|
|
|
/* |
/* |
* Parse the pager command into words. |
* Parse the pager command into words. |
Line 1249 spawn_pager(struct outstate *outst, char *tag_target) |
|
Line 1308 spawn_pager(struct outstate *outst, char *tag_target) |
|
*/ |
*/ |
|
|
argc = 0; |
argc = 0; |
while (argc + 5 < MAX_PAGER_ARGS) { |
while (*pager != '\0' && argc + 5 < MAX_PAGER_ARGS) { |
argv[argc++] = cp; |
wordlen = strcspn(pager, " "); |
cp = strchr(cp, ' '); |
argv[argc++] = mandoc_strndup(pager, wordlen); |
if (cp == NULL) |
pager += wordlen; |
break; |
while (*pager == ' ') |
*cp++ = '\0'; |
pager++; |
while (*cp == ' ') |
|
cp++; |
|
if (*cp == '\0') |
|
break; |
|
} |
} |
|
|
/* For less(1), use the tag file. */ |
/* For less(1), use the tag file. */ |
Line 1270 spawn_pager(struct outstate *outst, char *tag_target) |
|
Line 1325 spawn_pager(struct outstate *outst, char *tag_target) |
|
cp = argv[0] + cmdlen - 4; |
cp = argv[0] + cmdlen - 4; |
if (strcmp(cp, "less") == 0) { |
if (strcmp(cp, "less") == 0) { |
argv[argc++] = mandoc_strdup("-T"); |
argv[argc++] = mandoc_strdup("-T"); |
argv[argc++] = outst->tag_files->tfn; |
argv[argc++] = mandoc_strdup(outst->tag_files->tfn); |
if (tag_target != NULL) { |
if (tag_target != NULL) { |
argv[argc++] = mandoc_strdup("-t"); |
argv[argc++] = mandoc_strdup("-t"); |
argv[argc++] = tag_target; |
argv[argc++] = mandoc_strdup(tag_target); |
use_ofn = 0; |
use_ofn = 0; |
} |
} |
} |
} |
Line 1284 spawn_pager(struct outstate *outst, char *tag_target) |
|
Line 1339 spawn_pager(struct outstate *outst, char *tag_target) |
|
mandoc_asprintf(&argv[argc], "file://%s#%s", |
mandoc_asprintf(&argv[argc], "file://%s#%s", |
outst->tag_files->ofn, tag_target); |
outst->tag_files->ofn, tag_target); |
else |
else |
argv[argc] = outst->tag_files->ofn; |
argv[argc] = mandoc_strdup(outst->tag_files->ofn); |
argc++; |
argc++; |
} |
} |
argv[argc] = NULL; |
argv[argc] = NULL; |
Line 1296 spawn_pager(struct outstate *outst, char *tag_target) |
|
Line 1351 spawn_pager(struct outstate *outst, char *tag_target) |
|
case 0: |
case 0: |
break; |
break; |
default: |
default: |
|
while (argc > 0) |
|
free(argv[--argc]); |
(void)setpgid(pager_pid, 0); |
(void)setpgid(pager_pid, 0); |
(void)tcsetpgrp(STDOUT_FILENO, pager_pid); |
(void)tcsetpgrp(STDOUT_FILENO, pager_pid); |
#if HAVE_PLEDGE |
#if HAVE_PLEDGE |