--- busybox-1.11.0/miscutils/man.c	2008-06-25 14:51:35.000000000 +0200
+++ busybox-1.11.0m/miscutils/man.c	2008-07-04 22:53:51.000000000 +0200
@@ -23,7 +23,7 @@
 
 */
 
-static int run_pipe(const char *unpacker, const char *pager, char *man_filename)
+static int run_pipe(const char *unpacker, const char *pager, char *man_filename, smalluint mode)
 {
 	char *cmd;
 
@@ -35,30 +35,33 @@
 		return 1;
 	}
 
-	cmd = xasprintf("%s '%s' | gtbl | nroff -Tlatin1 -mandoc | %s",
-			unpacker, man_filename, pager);
+	cmd = xasprintf("%s '%s' %s| %s",
+			unpacker, man_filename, 
+			mode?"| gtbl | nroff -Tlatin1 -mandoc ":"",
+			pager);
+
 	system(cmd);
 	free(cmd);
 	return 1;
 }
 
 /* man_filename is of the form "/dir/dir/dir/name.s.bz2" */
-static int show_manpage(const char *pager, char *man_filename)
+static int show_manpage(const char *pager, char *man_filename, smalluint mode)
 {
 	int len;
 
-	if (run_pipe("bunzip2 -c", pager, man_filename))
+	if (run_pipe("bunzip2 -c", pager, man_filename, mode))
 		return 1;
 
 	len = strlen(man_filename) - 1;
 
 	man_filename[len] = '\0'; /* ".bz2" -> ".gz" */
 	man_filename[len - 2] = 'g';
-	if (run_pipe("gunzip -c", pager, man_filename))
+	if (run_pipe("gunzip -c", pager, man_filename, mode))
 		return 1;
 
 	man_filename[len - 3] = '\0'; /* ".gz" -> "" */
-	if (run_pipe("cat", pager, man_filename))
+	if (run_pipe("cat", pager, man_filename, mode))
 		return 1;
 
 	return 0;
@@ -122,6 +125,7 @@
 		}
 		fclose(cf);
 	}
+	man_path_list[count_mp] = NULL;
 
 	do { /* for each argv[] */
 		cur_mp = 0;
@@ -134,14 +138,24 @@
 				do { /* for each section */
 					char *next_sect = strchrnul(cur_sect, ':');
 					int sect_len = next_sect - cur_sect;
-
-					char *man_filename = xasprintf("%.*s/man%.*s/%s.%.*s" ".bz2",
+					char *man_filename;
+					int found;
+					int mode = 0;
+
+					/* mode == 0 -> cat page
+					 *         1 -> man page */
+					while (mode < 2) {
+						man_filename = xasprintf("%.*s/%s%.*s/%s.%.*s" ".bz2",
 								path_len, cur_path,
+								mode?"man":"cat",
 								sect_len, cur_sect,
 								*argv,
 								sect_len, cur_sect);
-					int found = show_manpage(pager, man_filename);
-					free(man_filename);
+						found = show_manpage(pager, man_filename, mode);
+						free(man_filename);
+						/* If found, we exit, else we test the next mode */
+						mode += 1 + found;
+					}
 					if (found && !(opt & OPT_a))
 						goto next_arg;
 					cur_sect = next_sect;
