summaryrefslogtreecommitdiff
path: root/miscutils/man.c
diff options
context:
space:
mode:
authorDenys Vlasenko2012-03-06 16:23:50 +0100
committerDenys Vlasenko2012-03-06 16:23:50 +0100
commit59655077c5bf176f01d8d277665ebb92263704ed (patch)
tree0d4393ea09ebe90e35866d27041faf6372f6e87e /miscutils/man.c
parent17eedcad9406c43beddab3906c8c693626c351fb (diff)
downloadbusybox-59655077c5bf176f01d8d277665ebb92263704ed.zip
busybox-59655077c5bf176f01d8d277665ebb92263704ed.tar.gz
preparatory cleanups for seamless uncompression improvements
unpack_gz_stream_with_info: fix buggy error check man: fix possible accesses past the end of a string move seamless uncompression helpers from read_printf.c to open_transformer.c function old new delta show_manpage 153 212 +59 unpack_gz_stream_with_info 520 539 +19 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'miscutils/man.c')
-rw-r--r--miscutils/man.c41
1 files changed, 18 insertions, 23 deletions
diff --git a/miscutils/man.c b/miscutils/man.c
index 3bf7e84..6114663 100644
--- a/miscutils/man.c
+++ b/miscutils/man.c
@@ -30,16 +30,6 @@ echo ".pl \n(nlu+10"
*/
-#if ENABLE_FEATURE_SEAMLESS_LZMA
-#define Z_SUFFIX ".lzma"
-#elif ENABLE_FEATURE_SEAMLESS_BZ2
-#define Z_SUFFIX ".bz2"
-#elif ENABLE_FEATURE_SEAMLESS_GZ
-#define Z_SUFFIX ".gz"
-#else
-#define Z_SUFFIX ""
-#endif
-
static int show_manpage(const char *pager, char *man_filename, int man, int level);
static int run_pipe(const char *pager, char *man_filename, int man, int level)
@@ -102,7 +92,7 @@ static int run_pipe(const char *pager, char *man_filename, int man, int level)
/* Links do not have .gz extensions, even if manpage
* is compressed */
- man_filename = xasprintf("%s/%s" Z_SUFFIX, man_filename, linkname);
+ man_filename = xasprintf("%s/%s", man_filename, linkname);
free(line);
/* Note: we leak "new" man_filename string as well... */
if (show_manpage(pager, man_filename, man, level + 1))
@@ -124,32 +114,37 @@ static int run_pipe(const char *pager, char *man_filename, int man, int level)
return 1;
}
-/* man_filename is of the form "/dir/dir/dir/name.s" Z_SUFFIX */
+/* man_filename is of the form "/dir/dir/dir/name.s" */
static int show_manpage(const char *pager, char *man_filename, int man, int level)
{
+#if SEAMLESS_COMPRESSION
+ /* We leak this allocation... */
+ char *filename_with_zext = xasprintf("%s.lzma", man_filename);
+ char *ext = strrchr(filename_with_zext, '.') + 1;
+#endif
+
#if ENABLE_FEATURE_SEAMLESS_LZMA
+ if (run_pipe(pager, filename_with_zext, man, level))
+ return 1;
+#endif
+#if ENABLE_FEATURE_SEAMLESS_XZ
+ strcpy(ext, "xz");
if (run_pipe(pager, man_filename, man, level))
return 1;
#endif
-
#if ENABLE_FEATURE_SEAMLESS_BZ2
-#if ENABLE_FEATURE_SEAMLESS_LZMA
- strcpy(strrchr(man_filename, '.') + 1, "bz2");
-#endif
+ strcpy(ext, "bz2");
if (run_pipe(pager, man_filename, man, level))
return 1;
#endif
-
#if ENABLE_FEATURE_SEAMLESS_GZ
-#if ENABLE_FEATURE_SEAMLESS_LZMA || ENABLE_FEATURE_SEAMLESS_BZ2
- strcpy(strrchr(man_filename, '.') + 1, "gz");
-#endif
+ strcpy(ext, "gz");
if (run_pipe(pager, man_filename, man, level))
return 1;
#endif
-#if ENABLE_FEATURE_SEAMLESS_LZMA || ENABLE_FEATURE_SEAMLESS_BZ2 || ENABLE_FEATURE_SEAMLESS_GZ
- *strrchr(man_filename, '.') = '\0';
+#if SEAMLESS_COMPRESSION
+ ext[-1] = '\0';
#endif
if (run_pipe(pager, man_filename, man, level))
return 1;
@@ -262,7 +257,7 @@ int man_main(int argc UNUSED_PARAM, char **argv)
/* Search for cat, then man page */
while (cat0man1 < 2) {
int found_here;
- man_filename = xasprintf("%s/%s%.*s/%s.%.*s" Z_SUFFIX,
+ man_filename = xasprintf("%s/%s%.*s/%s.%.*s",
cur_path,
"cat\0man" + (cat0man1 * 4),
sect_len, cur_sect,