aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-04-19 03:42:47 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-04-19 03:42:47 +0000
commit50d068cb76baa7d37b948d021d3b16e2798ed7cf (patch)
tree61c248628dbc469cf62e459e1d544958c4a887fb
parente96dcb4dcffc8ade4c4f812ab2ed63287faaec83 (diff)
downloadbusybox-w32-50d068cb76baa7d37b948d021d3b16e2798ed7cf.tar.gz
busybox-w32-50d068cb76baa7d37b948d021d3b16e2798ed7cf.tar.bz2
busybox-w32-50d068cb76baa7d37b948d021d3b16e2798ed7cf.zip
man: handle many MANPAGER directives so that they do not override
but accumulate. By Ivana Varekova <varekova AT redhat.com> function old new delta man_main 567 684 +117
-rw-r--r--miscutils/man.c78
1 files changed, 44 insertions, 34 deletions
diff --git a/miscutils/man.c b/miscutils/man.c
index ed31b66c7..bf13ab527 100644
--- a/miscutils/man.c
+++ b/miscutils/man.c
@@ -69,9 +69,11 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
69{ 69{
70 FILE *cf; 70 FILE *cf;
71 const char *pager; 71 const char *pager;
72 char *man_path, *sec_list; 72 char **man_path_list;
73 char *sec_list;
73 char *cur_path, *cur_sect; 74 char *cur_path, *cur_sect;
74 char *line, *value; 75 char *line, *value;
76 int count_mp, alloc_mp, cur_mp;
75 int opt; 77 int opt;
76 78
77 opt_complementary = "-1"; /* at least one argument */ 79 opt_complementary = "-1"; /* at least one argument */
@@ -79,7 +81,12 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
79 argv += optind; 81 argv += optind;
80 82
81 sec_list = xstrdup("1:2:3:4:5:6:7:8:9"); 83 sec_list = xstrdup("1:2:3:4:5:6:7:8:9");
82 man_path = xstrdup(getenv("MANPATH")); 84 alloc_mp = 10;
85 man_path_list = xmalloc(10 * sizeof(man_path_list[0]));
86 count_mp = 0;
87 man_path_list[0] = xstrdup(getenv("MANPATH"));
88 if (man_path_list[0])
89 count_mp++;
83 pager = getenv("MANPAGER"); 90 pager = getenv("MANPAGER");
84 if (!pager) { 91 if (!pager) {
85 pager = getenv("PAGER"); 92 pager = getenv("PAGER");
@@ -98,8 +105,13 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
98 value = skip_whitespace(&line[8]); 105 value = skip_whitespace(&line[8]);
99 *skip_non_whitespace(value) = '\0'; 106 *skip_non_whitespace(value) = '\0';
100 if (strcmp("MANPATH", line) == 0) { 107 if (strcmp("MANPATH", line) == 0) {
101 free(man_path); 108 man_path_list[count_mp] = xstrdup(value);
102 man_path = xstrdup(value); 109 count_mp++;
110 if (alloc_mp == count_mp) {
111 alloc_mp += 10;
112 man_path_list = xrealloc(man_path_list, alloc_mp * sizeof(man_path_list[0]));
113 }
114 /* thus man_path_list is always NULL terminated */
103 } 115 }
104 if (strcmp("MANSECT", line) == 0) { 116 if (strcmp("MANSECT", line) == 0) {
105 free(sec_list); 117 free(sec_list);
@@ -112,37 +124,35 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
112 } 124 }
113 125
114 do { /* for each argv[] */ 126 do { /* for each argv[] */
115 cur_path = man_path; 127 cur_mp = 0;
116 do { /* for each MANPATH item */ 128 while ((cur_path = man_path_list[cur_mp++]) != NULL) {
117 char *next_path = strchrnul(cur_path, ':'); 129 /* for each MANPATH */
118 int path_len = next_path - cur_path; 130 do { /* for each MANPATH item */
119 131 char *next_path = strchrnul(cur_path, ':');
120 cur_sect = sec_list; 132 int path_len = next_path - cur_path;
121 do { /* for each section */ 133 cur_sect = sec_list;
122 char *next_sect = strchrnul(cur_sect, ':'); 134 do { /* for each section */
123 int sect_len = next_sect - cur_sect; 135 char *next_sect = strchrnul(cur_sect, ':');
124 136 int sect_len = next_sect - cur_sect;
125 char *man_filename = xasprintf("%.*s/man%.*s/%s.%.*s" ".bz2", 137
126 path_len, cur_path, 138 char *man_filename = xasprintf("%.*s/man%.*s/%s.%.*s" ".bz2",
127 sect_len, cur_sect, 139 path_len, cur_path,
128 *argv, 140 sect_len, cur_sect,
129 sect_len, cur_sect); 141 *argv,
130 if (show_manpage(pager, man_filename)) { 142 sect_len, cur_sect);
131 if (!(opt & OPT_a)) { 143 int found = show_manpage(pager, man_filename);
144 free(man_filename);
145 if (found && !(opt & OPT_a))
132 goto next_arg; 146 goto next_arg;
133 } 147 cur_sect = next_sect;
134 } 148 while (*cur_sect == ':')
135 free(man_filename); 149 cur_sect++;
136 150 } while (*cur_sect);
137 cur_sect = next_sect; 151 cur_path = next_path;
138 while (*cur_sect == ':') 152 while (*cur_path == ':')
139 cur_sect++; 153 cur_path++;
140 } while (*cur_sect); 154 } while (*cur_path);
141 155 }
142 cur_path = next_path;
143 while (*cur_path == ':')
144 cur_path++;
145 } while (*cur_path);
146 next_arg: 156 next_arg:
147 argv++; 157 argv++;
148 } while (*argv); 158 } while (*argv);