aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--miscutils/man.c38
1 files changed, 18 insertions, 20 deletions
diff --git a/miscutils/man.c b/miscutils/man.c
index 20172f6b2..509ae96bd 100644
--- a/miscutils/man.c
+++ b/miscutils/man.c
@@ -23,6 +23,10 @@ echo ".pl \n(nlu+10"
*/
+/* Trick gcc to reuse "cat" string. */
+#define STR_catNULmanNUL "cat\0man"
+#define STR_cat "cat\0man"
+
static int run_pipe(const char *unpacker, const char *pager, char *man_filename, int cat)
{
char *cmd;
@@ -61,7 +65,7 @@ static int show_manpage(const char *pager, char *man_filename, int cat)
return 1;
man_filename[len - 3] = '\0'; /* ".gz" -> "" */
- if (run_pipe("cat", pager, man_filename, cat))
+ if (run_pipe(STR_cat, pager, man_filename, cat))
return 1;
return 0;
@@ -147,28 +151,22 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
char *next_sect = strchrnul(cur_sect, ':');
int sect_len = next_sect - cur_sect;
char *man_filename;
- int found_here;
-
- /* Search for cat page first */
- man_filename = xasprintf("%.*s/%s%.*s/%s.%.*s" ".bz2",
- path_len, cur_path,
- "cat",
- sect_len, cur_sect,
- *argv,
- sect_len, cur_sect);
- found_here = show_manpage(pager, man_filename, 1);
- free(man_filename);
- if (!found_here) {
+ int cat0man1 = 0;
+
+ /* Search for cat, then man page */
+ while (cat0man1 < 2) {
+ int found_here;
man_filename = xasprintf("%.*s/%s%.*s/%s.%.*s" ".bz2",
- path_len, cur_path,
- "man",
- sect_len, cur_sect,
- *argv,
- sect_len, cur_sect);
- found_here = show_manpage(pager, man_filename, 0);
+ path_len, cur_path,
+ STR_catNULmanNUL + cat0man1 * 4,
+ sect_len, cur_sect,
+ *argv,
+ sect_len, cur_sect);
+ found_here = show_manpage(pager, man_filename, cat0man1);
+ found |= found_here;
+ cat0man1 += found_here + 1;
free(man_filename);
}
- found |= found_here;
if (found && !(opt & OPT_a))
goto next_arg;