aboutsummaryrefslogtreecommitdiff
path: root/miscutils/man.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-08-05 13:45:22 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-08-05 13:45:22 +0000
commit22b0bd85fddf07eb53a1edf53472eb8b8aa51cbd (patch)
tree2bbd99d47122fda6c3713e80ba38fa76f4897d93 /miscutils/man.c
parent540baf646a526a68aeb83a3c6da706a2f2a1aeb2 (diff)
downloadbusybox-w32-22b0bd85fddf07eb53a1edf53472eb8b8aa51cbd.tar.gz
busybox-w32-22b0bd85fddf07eb53a1edf53472eb8b8aa51cbd.tar.bz2
busybox-w32-22b0bd85fddf07eb53a1edf53472eb8b8aa51cbd.zip
man: fixlet for man links
Diffstat (limited to 'miscutils/man.c')
-rw-r--r--miscutils/man.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/miscutils/man.c b/miscutils/man.c
index 91b995cf4..a2f6e3ba5 100644
--- a/miscutils/man.c
+++ b/miscutils/man.c
@@ -74,32 +74,37 @@ static int run_pipe(const char *unpacker, const char *pager, char *man_filename,
74 */ 74 */
75 *strchrnul(line, '\n') = '\0'; 75 *strchrnul(line, '\n') = '\0';
76 linkname = p = skip_whitespace(&line[4]); 76 linkname = p = skip_whitespace(&line[4]);
77 while (1) {
78 char *newname_slash, *oldname_slash;
79 77
80 oldname_slash = strrchr(man_filename, '/'); 78 /* If link has no slashes, we just replace man page name.
81 if (!oldname_slash) 79 * If link has slashes (however many), we go back *once*.
80 * ".so zzz/ggg/page.3" does NOT go back two levels. */
81 p = strrchr(man_filename, '/');
82 if (!p)
83 goto ordinary_manpage;
84 *p = '\0';
85 if (strchr(linkname, '/')) {
86 p = strrchr(man_filename, '/');
87 if (!p)
82 goto ordinary_manpage; 88 goto ordinary_manpage;
83 *oldname_slash = '\0'; 89 *p = '\0';
84 newname_slash = strchr(p, '/');
85 if (!newname_slash)
86 break;
87 p = newname_slash + 1;
88 } 90 }
91
92 /* Links do not have .gz extensions, even if manpage
93 * is compressed */
89 man_filename = xasprintf("%s/%s" ".bz2", man_filename, linkname); 94 man_filename = xasprintf("%s/%s" ".bz2", man_filename, linkname);
90 free(line); 95 free(line);
91 /* Note: we leak "new" man_filename string as well... */ 96 /* Note: we leak "new" man_filename string as well... */
92 if (show_manpage(pager, man_filename, man, level + 1)) 97 if (show_manpage(pager, man_filename, man, level + 1))
93 return 1; 98 return 1;
94 /* else: show the link, it's better than nothing */ 99 /* else: show the link, it's better than nothing */
95 } 100 }
96 101
97 ordinary_manpage: 102 ordinary_manpage:
98 /* "2>&1" is added so that nroff errors are shown in pager too. 103 /* "2>&1" is added so that nroff errors are shown in pager too.
99 * Otherwise it may show just empty screen */ 104 * Otherwise it may show just empty screen */
100 cmd = xasprintf( 105 cmd = xasprintf(
101 man ? "%s '%s' | gtbl | nroff -Tlatin1 -mandoc 2>&1 | %s" 106 man ? "%s '%s' 2>&1 | gtbl | nroff -Tlatin1 -mandoc 2>&1 | %s"
102 : "%s '%s' | %s", 107 : "%s '%s' 2>&1 | %s",
103 unpacker, man_filename, pager); 108 unpacker, man_filename, pager);
104 system(cmd); 109 system(cmd);
105 free(cmd); 110 free(cmd);