diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-08-05 13:45:22 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-08-05 13:45:22 +0000 |
commit | 22b0bd85fddf07eb53a1edf53472eb8b8aa51cbd (patch) | |
tree | 2bbd99d47122fda6c3713e80ba38fa76f4897d93 /miscutils/man.c | |
parent | 540baf646a526a68aeb83a3c6da706a2f2a1aeb2 (diff) | |
download | busybox-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.c | 29 |
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); |