version 1.261, 2021/10/04 20:24:00 |
version 1.262, 2021/10/04 21:28:50 |
|
|
char *argv[MAX_PAGER_ARGS]; |
char *argv[MAX_PAGER_ARGS]; |
const char *pager; |
const char *pager; |
char *cp; |
char *cp; |
|
size_t wordlen; |
size_t cmdlen; |
size_t cmdlen; |
int argc, use_ofn; |
int argc, use_ofn; |
pid_t pager_pid; |
pid_t pager_pid; |
|
|
pager = getenv("PAGER"); |
pager = getenv("PAGER"); |
if (pager == NULL || *pager == '\0') |
if (pager == NULL || *pager == '\0') |
pager = "less"; |
pager = "less"; |
cp = mandoc_strdup(pager); |
|
|
|
/* |
/* |
* Parse the pager command into words. |
* Parse the pager command into words. |
|
|
*/ |
*/ |
|
|
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 more(1) and less(1), use the tag file. */ |
/* For more(1) and less(1), use the tag file. */ |
|
|
cp = argv[0] + cmdlen - 4; |
cp = argv[0] + cmdlen - 4; |
if (strcmp(cp, "less") == 0 || strcmp(cp, "more") == 0) { |
if (strcmp(cp, "less") == 0 || strcmp(cp, "more") == 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; |
} |
} |
} |
} |
|
|
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; |
|
|
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 (pledge("stdio rpath tmppath tty proc", NULL) == -1) { |
if (pledge("stdio rpath tmppath tty proc", NULL) == -1) { |