summaryrefslogtreecommitdiff
path: root/scripts/kconfig/mconf.c
authorkergoth <kergoth>2003-06-17 17:03:49 (UTC)
committer kergoth <kergoth>2003-06-17 17:03:49 (UTC)
commit16e53b2a2e94742f3b55ee73700bb264e36638d4 (patch) (unidiff)
tree4f2b65a635d25c1ce0cfeea7953623c2bf7d9534 /scripts/kconfig/mconf.c
parent384b7f1a42f9f2f101dc8fe11c3625055d96f672 (diff)
downloadopie-16e53b2a2e94742f3b55ee73700bb264e36638d4.zip
opie-16e53b2a2e94742f3b55ee73700bb264e36638d4.tar.gz
opie-16e53b2a2e94742f3b55ee73700bb264e36638d4.tar.bz2
Update LinuxKernelConf version to 1.4.
Diffstat (limited to 'scripts/kconfig/mconf.c') (more/less context) (show whitespace changes)
-rw-r--r--scripts/kconfig/mconf.c56
1 files changed, 39 insertions, 17 deletions
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
index 6d82718..b9cf25f 100644
--- a/scripts/kconfig/mconf.c
+++ b/scripts/kconfig/mconf.c
@@ -4,200 +4,205 @@
4 * 4 *
5 * Introduced single menu mode (show all sub-menus in one large tree). 5 * Introduced single menu mode (show all sub-menus in one large tree).
6 * 2002-11-06 Petr Baudis <pasky@ucw.cz> 6 * 2002-11-06 Petr Baudis <pasky@ucw.cz>
7 */ 7 */
8 8
9#include <sys/ioctl.h> 9#include <sys/ioctl.h>
10#include <sys/wait.h> 10#include <sys/wait.h>
11#include <ctype.h> 11#include <ctype.h>
12#include <errno.h> 12#include <errno.h>
13#include <fcntl.h> 13#include <fcntl.h>
14#include <limits.h> 14#include <limits.h>
15#include <signal.h> 15#include <signal.h>
16#include <stdarg.h> 16#include <stdarg.h>
17#include <stdlib.h> 17#include <stdlib.h>
18#include <string.h> 18#include <string.h>
19#include <termios.h> 19#include <termios.h>
20#include <unistd.h> 20#include <unistd.h>
21 21
22#define LKC_DIRECT_LINK 22#define LKC_DIRECT_LINK
23#include "lkc.h" 23#include "lkc.h"
24 24
25static char menu_backtitle[128]; 25static char menu_backtitle[128];
26static const char menu_instructions[] = 26static const char menu_instructions[] =
27 "Arrow keys navigate the menu. " 27 "Arrow keys navigate the menu. "
28 "<Enter> selects submenus --->. " 28 "<Enter> selects submenus --->. "
29 "Highlighted letters are hotkeys. " 29 "Highlighted letters are hotkeys. "
30 "Pressing <Y> includes, <N> excludes, <M> modularizes features. " 30 "Pressing <Y> includes, <N> excludes, <M> modularizes features. "
31 "Press <Esc><Esc> to exit, <?> for Help. " 31 "Press <Esc><Esc> to exit, <?> for Help. "
32 "Legend: [*] built-in [ ] excluded <M> module < > module capable", 32 "Legend: [*] built-in [ ] excluded <M> module < > module capable",
33radiolist_instructions[] = 33radiolist_instructions[] =
34 "Use the arrow keys to navigate this window or " 34 "Use the arrow keys to navigate this window or "
35 "press the hotkey of the item you wish to select " 35 "press the hotkey of the item you wish to select "
36 "followed by the <SPACE BAR>. " 36 "followed by the <SPACE BAR>. "
37 "Press <?> for additional information about this option.", 37 "Press <?> for additional information about this option.",
38inputbox_instructions_int[] = 38inputbox_instructions_int[] =
39 "Please enter a decimal value. " 39 "Please enter a decimal value. "
40 "Fractions will not be accepted. " 40 "Fractions will not be accepted. "
41 "Use the <TAB> key to move from the input field to the buttons below it.", 41 "Use the <TAB> key to move from the input field to the buttons below it.",
42inputbox_instructions_hex[] = 42inputbox_instructions_hex[] =
43 "Please enter a hexadecimal value. " 43 "Please enter a hexadecimal value. "
44 "Use the <TAB> key to move from the input field to the buttons below it.", 44 "Use the <TAB> key to move from the input field to the buttons below it.",
45inputbox_instructions_string[] = 45inputbox_instructions_string[] =
46 "Please enter a string value. " 46 "Please enter a string value. "
47 "Use the <TAB> key to move from the input field to the buttons below it.", 47 "Use the <TAB> key to move from the input field to the buttons below it.",
48setmod_text[] = 48setmod_text[] =
49 "This feature depends on another which has been configured as a module.\n" 49 "This feature depends on another which has been configured as a module.\n"
50 "As a result, this feature will be built as a module.", 50 "As a result, this feature will be built as a module.",
51nohelp_text[] = 51nohelp_text[] =
52 "There is no help available for this kernel option.\n", 52 "There is no help available for this option.\n",
53load_config_text[] = 53load_config_text[] =
54 "Enter the name of the configuration file you wish to load. " 54 "Enter the name of the configuration file you wish to load. "
55 "Accept the name shown to restore the configuration you " 55 "Accept the name shown to restore the configuration you "
56 "last retrieved. Leave blank to abort.", 56 "last retrieved. Leave blank to abort.",
57load_config_help[] = 57load_config_help[] =
58 "\n" 58 "\n"
59 "For various reasons, one may wish to keep several different kernel\n" 59 "For various reasons, one may wish to keep several different \n"
60 "configurations available on a single machine.\n" 60 "configurations available on a single machine.\n"
61 "\n" 61 "\n"
62 "If you have saved a previous configuration in a file other than the\n" 62 "If you have saved a previous configuration in a file other than the\n"
63 "kernel's default, entering the name of the file here will allow you\n" 63 "default, entering the name of the file here will allow you\n"
64 "to modify that configuration.\n" 64 "to modify that configuration.\n"
65 "\n" 65 "\n"
66 "If you are uncertain, then you have probably never used alternate\n" 66 "If you are uncertain, then you have probably never used alternate\n"
67 "configuration files. You should therefor leave this blank to abort.\n", 67 "configuration files. You should therefor leave this blank to abort.\n",
68save_config_text[] = 68save_config_text[] =
69 "Enter a filename to which this configuration should be saved " 69 "Enter a filename to which this configuration should be saved "
70 "as an alternate. Leave blank to abort.", 70 "as an alternate. Leave blank to abort.",
71save_config_help[] = 71save_config_help[] =
72 "\n" 72 "\n"
73 "For various reasons, one may wish to keep different kernel\n" 73 "For various reasons, one may wish to keep different\n"
74 "configurations available on a single machine.\n" 74 "configurations available on a single machine.\n"
75 "\n" 75 "\n"
76 "Entering a file name here will allow you to later retrieve, modify\n" 76 "Entering a file name here will allow you to later retrieve, modify\n"
77 "and use the current configuration as an alternate to whatever\n" 77 "and use the current configuration as an alternate to whatever\n"
78 "configuration options you have selected at that time.\n" 78 "configuration options you have selected at that time.\n"
79 "\n" 79 "\n"
80 "If you are uncertain what all this means then you should probably\n" 80 "If you are uncertain what all this means then you should probably\n"
81 "leave this blank.\n" 81 "leave this blank.\n"
82; 82;
83 83
84static char buf[4096], *bufptr = buf; 84static char buf[4096], *bufptr = buf;
85static char input_buf[4096]; 85static char input_buf[4096];
86static char filename[PATH_MAX+1] = ".config"; 86static char filename[PATH_MAX+1] = ".config";
87static char *args[1024], **argptr = args; 87static char *args[1024], **argptr = args;
88static int indent = 0; 88static int indent = 0;
89static struct termios ios_org; 89static struct termios ios_org;
90static int rows, cols; 90static int rows, cols;
91static struct menu *current_menu; 91static struct menu *current_menu;
92static int child_count; 92static int child_count;
93static int do_resize; 93static int do_resize;
94static int single_menu_mode; 94static int single_menu_mode;
95 95
96static void conf(struct menu *menu); 96static void conf(struct menu *menu);
97static void conf_choice(struct menu *menu); 97static void conf_choice(struct menu *menu);
98static void conf_string(struct menu *menu); 98static void conf_string(struct menu *menu);
99static void conf_load(void); 99static void conf_load(void);
100static void conf_save(void); 100static void conf_save(void);
101static void show_textbox(const char *title, const char *text, int r, int c); 101static void show_textbox(const char *title, const char *text, int r, int c);
102static void show_helptext(const char *title, const char *text); 102static void show_helptext(const char *title, const char *text);
103static void show_help(struct menu *menu); 103static void show_help(struct menu *menu);
104static void show_readme(void); 104static void show_readme(void);
105 105
106static void cprint_init(void); 106static void cprint_init(void);
107static int cprint1(const char *fmt, ...); 107static int cprint1(const char *fmt, ...);
108static void cprint_done(void); 108static void cprint_done(void);
109static int cprint(const char *fmt, ...); 109static int cprint(const char *fmt, ...);
110 110
111static void init_wsize(void) 111static void init_wsize(void)
112{ 112{
113 struct winsize ws; 113 struct winsize ws;
114 char *env; 114 char *env;
115 115
116 if (ioctl(1, TIOCGWINSZ, &ws) == -1) { 116 if (ioctl(1, TIOCGWINSZ, &ws) == -1) {
117 rows = 24; 117 rows = 24;
118 cols = 80; 118 cols = 80;
119 } else { 119 } else {
120 rows = ws.ws_row; 120 rows = ws.ws_row;
121 cols = ws.ws_col; 121 cols = ws.ws_col;
122 if (!rows) { 122 if (!rows) {
123 env = getenv("LINES"); 123 env = getenv("LINES");
124 if (env) 124 if (env)
125 rows = atoi(env); 125 rows = atoi(env);
126 if (!rows) 126 if (!rows)
127 rows = 24; 127 rows = 24;
128 } 128 }
129 if (!cols) { 129 if (!cols) {
130 env = getenv("COLUMNS"); 130 env = getenv("COLUMNS");
131 if (env) 131 if (env)
132 cols = atoi(env); 132 cols = atoi(env);
133 if (!cols) 133 if (!cols)
134 cols = 80; 134 cols = 80;
135 } 135 }
136 } 136 }
137 137
138 if (rows < 19 || cols < 80) { 138 if (rows < 19 || cols < 80) {
139 fprintf(stderr, "Your display is too small to run Menuconfig!\n"); 139 fprintf(stderr, "Your display is too small to run Menuconfig!\n");
140 fprintf(stderr, "It must be at least 19 lines by 80 columns.\n"); 140 fprintf(stderr, "It must be at least 19 lines by 80 columns.\n");
141 exit(1); 141 exit(1);
142 } 142 }
143 143
144 rows -= 4; 144 rows -= 4;
145 cols -= 5; 145 cols -= 5;
146} 146}
147 147
148static void cprint_init(void) 148static void cprint_init(void)
149{ 149{
150 char *env = getenv("LXDIALOG");
150 bufptr = buf; 151 bufptr = buf;
151 argptr = args; 152 argptr = args;
152 memset(args, 0, sizeof(args)); 153 memset(args, 0, sizeof(args));
153 indent = 0; 154 indent = 0;
154 child_count = 0; 155 child_count = 0;
156 if(env != NULL) {
157 cprint(env);
158 } else {
155 cprint("./scripts/lxdialog/lxdialog"); 159 cprint("./scripts/lxdialog/lxdialog");
160 }
156 cprint("--backtitle"); 161 cprint("--backtitle");
157 cprint(menu_backtitle); 162 cprint(menu_backtitle);
158} 163}
159 164
160static int cprint1(const char *fmt, ...) 165static int cprint1(const char *fmt, ...)
161{ 166{
162 va_list ap; 167 va_list ap;
163 int res; 168 int res;
164 169
165 if (!*argptr) 170 if (!*argptr)
166 *argptr = bufptr; 171 *argptr = bufptr;
167 va_start(ap, fmt); 172 va_start(ap, fmt);
168 res = vsprintf(bufptr, fmt, ap); 173 res = vsprintf(bufptr, fmt, ap);
169 va_end(ap); 174 va_end(ap);
170 bufptr += res; 175 bufptr += res;
171 176
172 return res; 177 return res;
173} 178}
174 179
175static void cprint_done(void) 180static void cprint_done(void)
176{ 181{
177 *bufptr++ = 0; 182 *bufptr++ = 0;
178 argptr++; 183 argptr++;
179} 184}
180 185
181static int cprint(const char *fmt, ...) 186static int cprint(const char *fmt, ...)
182{ 187{
183 va_list ap; 188 va_list ap;
184 int res; 189 int res;
185 190
186 *argptr++ = bufptr; 191 *argptr++ = bufptr;
187 va_start(ap, fmt); 192 va_start(ap, fmt);
188 res = vsprintf(bufptr, fmt, ap); 193 res = vsprintf(bufptr, fmt, ap);
189 va_end(ap); 194 va_end(ap);
190 bufptr += res; 195 bufptr += res;
191 *bufptr++ = 0; 196 *bufptr++ = 0;
192 197
193 return res; 198 return res;
194} 199}
195 200
196pid_t pid; 201pid_t pid;
197 202
198static void winch_handler(int sig) 203static void winch_handler(int sig)
199{ 204{
200 if (!do_resize) { 205 if (!do_resize) {
201 kill(pid, SIGINT); 206 kill(pid, SIGINT);
202 do_resize = 1; 207 do_resize = 1;
203 } 208 }
@@ -257,278 +262,295 @@ static int exec_conf(void)
257 do_resize = 0; 262 do_resize = 0;
258 sigprocmask(SIG_SETMASK, &osset, NULL); 263 sigprocmask(SIG_SETMASK, &osset, NULL);
259 return -1; 264 return -1;
260 } 265 }
261 if (WIFSIGNALED(stat)) { 266 if (WIFSIGNALED(stat)) {
262 printf("\finterrupted(%d)\n", WTERMSIG(stat)); 267 printf("\finterrupted(%d)\n", WTERMSIG(stat));
263 exit(1); 268 exit(1);
264 } 269 }
265#if 0 270#if 0
266 printf("\fexit state: %d\nexit data: '%s'\n", WEXITSTATUS(stat), input_buf); 271 printf("\fexit state: %d\nexit data: '%s'\n", WEXITSTATUS(stat), input_buf);
267 sleep(1); 272 sleep(1);
268#endif 273#endif
269 sigpending(&sset); 274 sigpending(&sset);
270 if (sigismember(&sset, SIGINT)) { 275 if (sigismember(&sset, SIGINT)) {
271 printf("\finterrupted\n"); 276 printf("\finterrupted\n");
272 exit(1); 277 exit(1);
273 } 278 }
274 sigprocmask(SIG_SETMASK, &osset, NULL); 279 sigprocmask(SIG_SETMASK, &osset, NULL);
275 280
276 return WEXITSTATUS(stat); 281 return WEXITSTATUS(stat);
277} 282}
278 283
279static void build_conf(struct menu *menu) 284static void build_conf(struct menu *menu)
280{ 285{
281 struct symbol *sym; 286 struct symbol *sym;
282 struct property *prop; 287 struct property *prop;
283 struct menu *child; 288 struct menu *child;
284 int type, tmp, doint = 2; 289 int type, tmp, doint = 2;
285 tristate val; 290 tristate val;
286 char ch; 291 char ch;
287 292
288 if (!menu_is_visible(menu)) 293 if (!menu_is_visible(menu))
289 return; 294 return;
290 295
291 sym = menu->sym; 296 sym = menu->sym;
292 prop = menu->prompt; 297 prop = menu->prompt;
293 if (!sym) { 298 if (!sym) {
294 if (prop && menu != current_menu) { 299 if (prop && menu != current_menu) {
295 const char *prompt = menu_get_prompt(menu); 300 const char *prompt = menu_get_prompt(menu);
296 switch (prop->type) { 301 switch (prop->type) {
297 case P_MENU: 302 case P_MENU:
298 child_count++; 303 child_count++;
299 cprint("m%p", menu); 304 cprint("m%p", menu);
300 305
301 if (single_menu_mode) { 306 if (single_menu_mode) {
302 cprint1("%s%*c%s", 307 cprint1("%s%*c%s",
303 menu->data ? "-->" : "++>", 308 menu->data ? "-->" : "++>",
304 indent + 1, ' ', prompt); 309 indent + 1, ' ', prompt);
305 } else { 310 } else
306 if (menu->parent != &rootmenu) 311 cprint1(" %*c%s --->", indent + 1, ' ', prompt);
307 cprint1(" %*c", indent + 1, ' ');
308 cprint1("%s --->", prompt);
309 }
310 312
311 cprint_done(); 313 cprint_done();
312 if (single_menu_mode && menu->data) 314 if (single_menu_mode && menu->data)
313 goto conf_childs; 315 goto conf_childs;
314 return; 316 return;
315 default: 317 default:
316 if (prompt) { 318 if (prompt) {
317 child_count++; 319 child_count++;
318 cprint(":%p", menu); 320 cprint(":%p", menu);
319 cprint("---%*c%s", indent + 1, ' ', prompt); 321 cprint("---%*c%s", indent + 1, ' ', prompt);
320 } 322 }
321 } 323 }
322 } else 324 } else
323 doint = 0; 325 doint = 0;
324 goto conf_childs; 326 goto conf_childs;
325 } 327 }
326 328
327 type = sym_get_type(sym); 329 type = sym_get_type(sym);
328 if (sym_is_choice(sym)) { 330 if (sym_is_choice(sym)) {
329 struct symbol *def_sym = sym_get_choice_value(sym); 331 struct symbol *def_sym = sym_get_choice_value(sym);
330 struct menu *def_menu = NULL; 332 struct menu *def_menu = NULL;
331 333
332 child_count++; 334 child_count++;
333 for (child = menu->list; child; child = child->next) { 335 for (child = menu->list; child; child = child->next) {
334 if (menu_is_visible(child) && child->sym == def_sym) 336 if (menu_is_visible(child) && child->sym == def_sym)
335 def_menu = child; 337 def_menu = child;
336 } 338 }
337 339
338 val = sym_get_tristate_value(sym); 340 val = sym_get_tristate_value(sym);
339 if (sym_is_changable(sym)) { 341 if (sym_is_changable(sym)) {
340 cprint("t%p", menu); 342 cprint("t%p", menu);
341 switch (type) { 343 switch (type) {
342 case S_BOOLEAN: 344 case S_BOOLEAN:
343 cprint1("[%c]", val == no ? ' ' : '*'); 345 cprint1("[%c]", val == no ? ' ' : '*');
344 break; 346 break;
345 case S_TRISTATE: 347 case S_TRISTATE:
346 switch (val) { 348 switch (val) {
347 case yes: ch = '*'; break; 349 case yes: ch = '*'; break;
348 case mod: ch = 'M'; break; 350 case mod: ch = 'M'; break;
349 default: ch = ' '; break; 351 default: ch = ' '; break;
350 } 352 }
351 cprint1("<%c>", ch); 353 cprint1("<%c>", ch);
352 break; 354 break;
353 } 355 }
354 } else { 356 } else {
355 cprint("%c%p", def_menu ? 't' : ':', menu); 357 cprint("%c%p", def_menu ? 't' : ':', menu);
356 cprint1(" "); 358 cprint1(" ");
357 } 359 }
358 360
359 cprint1("%*c%s", indent + 1, ' ', menu_get_prompt(menu)); 361 cprint1("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
360 if (val == yes) { 362 if (val == yes) {
361 if (def_menu) { 363 if (def_menu) {
362 cprint1(" (%s)", menu_get_prompt(def_menu)); 364 cprint1(" (%s)", menu_get_prompt(def_menu));
363 cprint1(" --->"); 365 cprint1(" --->");
364 cprint_done(); 366 cprint_done();
365 if (def_menu->list) { 367 if (def_menu->list) {
366 indent += 2; 368 indent += 2;
367 build_conf(def_menu); 369 build_conf(def_menu);
368 indent -= 2; 370 indent -= 2;
369 } 371 }
370 } else 372 } else
371 cprint_done(); 373 cprint_done();
372 return; 374 return;
373 } 375 }
374 cprint_done(); 376 cprint_done();
375 } else { 377 } else {
378 if (menu == current_menu) {
379 cprint(":%p", menu);
380 cprint("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
381 goto conf_childs;
382 }
376 child_count++; 383 child_count++;
377 val = sym_get_tristate_value(sym); 384 val = sym_get_tristate_value(sym);
378 if (sym_is_choice_value(sym) && val == yes) { 385 if (sym_is_choice_value(sym) && val == yes) {
379 cprint(":%p", menu); 386 cprint(":%p", menu);
380 cprint1(" "); 387 cprint1(" ");
381 } else { 388 } else {
382 switch (type) { 389 switch (type) {
383 case S_BOOLEAN: 390 case S_BOOLEAN:
384 cprint("t%p", menu); 391 cprint("t%p", menu);
392 if (sym_is_changable(sym))
385 cprint1("[%c]", val == no ? ' ' : '*'); 393 cprint1("[%c]", val == no ? ' ' : '*');
394 else
395 cprint1("---");
386 break; 396 break;
387 case S_TRISTATE: 397 case S_TRISTATE:
388 cprint("t%p", menu); 398 cprint("t%p", menu);
389 switch (val) { 399 switch (val) {
390 case yes: ch = '*'; break; 400 case yes: ch = '*'; break;
391 case mod: ch = 'M'; break; 401 case mod: ch = 'M'; break;
392 default: ch = ' '; break; 402 default: ch = ' '; break;
393 } 403 }
404 if (sym_is_changable(sym))
394 cprint1("<%c>", ch); 405 cprint1("<%c>", ch);
406 else
407 cprint1("---");
395 break; 408 break;
396 default: 409 default:
397 cprint("s%p", menu); 410 cprint("s%p", menu);
398 tmp = cprint1("(%s)", sym_get_string_value(sym)); 411 tmp = cprint1("(%s)", sym_get_string_value(sym));
399 tmp = indent - tmp + 4; 412 tmp = indent - tmp + 4;
400 if (tmp < 0) 413 if (tmp < 0)
401 tmp = 0; 414 tmp = 0;
402 cprint1("%*c%s%s", tmp, ' ', menu_get_prompt(menu), 415 cprint1("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
403 sym_has_value(sym) ? "" : " (NEW)"); 416 (sym_has_value(sym) || !sym_is_changable(sym)) ?
417 "" : " (NEW)");
404 cprint_done(); 418 cprint_done();
405 goto conf_childs; 419 goto conf_childs;
406 } 420 }
407 } 421 }
408 cprint1("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu), 422 cprint1("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
409 sym_has_value(sym) ? "" : " (NEW)"); 423 (sym_has_value(sym) || !sym_is_changable(sym)) ?
424 "" : " (NEW)");
425 if (menu->prompt->type == P_MENU) {
426 cprint1(" --->");
427 cprint_done();
428 return;
429 }
410 cprint_done(); 430 cprint_done();
411 } 431 }
412 432
413conf_childs: 433conf_childs:
414 indent += doint; 434 indent += doint;
415 for (child = menu->list; child; child = child->next) 435 for (child = menu->list; child; child = child->next)
416 build_conf(child); 436 build_conf(child);
417 indent -= doint; 437 indent -= doint;
418} 438}
419 439
420static void conf(struct menu *menu) 440static void conf(struct menu *menu)
421{ 441{
422 struct menu *submenu; 442 struct menu *submenu;
423 const char *prompt = menu_get_prompt(menu); 443 const char *prompt = menu_get_prompt(menu);
424 struct symbol *sym; 444 struct symbol *sym;
425 char active_entry[40]; 445 char active_entry[40];
426 int stat, type, i; 446 int stat, type, i;
427 447
428 unlink("lxdialog.scrltmp"); 448 unlink("lxdialog.scrltmp");
429 active_entry[0] = 0; 449 active_entry[0] = 0;
430 while (1) { 450 while (1) {
431 cprint_init(); 451 cprint_init();
432 cprint("--title"); 452 cprint("--title");
433 cprint("%s", prompt ? prompt : "Main Menu"); 453 cprint("%s", prompt ? prompt : "Main Menu");
434 cprint("--menu"); 454 cprint("--menu");
435 cprint(menu_instructions); 455 cprint(menu_instructions);
436 cprint("%d", rows); 456 cprint("%d", rows);
437 cprint("%d", cols); 457 cprint("%d", cols);
438 cprint("%d", rows - 10); 458 cprint("%d", rows - 10);
439 cprint("%s", active_entry); 459 cprint("%s", active_entry);
440 current_menu = menu; 460 current_menu = menu;
441 build_conf(menu); 461 build_conf(menu);
442 if (!child_count) 462 if (!child_count)
443 break; 463 break;
444 if (menu == &rootmenu) { 464 if (menu == &rootmenu) {
445 cprint(":"); 465 cprint(":");
446 cprint("--- "); 466 cprint("--- ");
447 cprint("L"); 467 cprint("L");
448 cprint("Load an Alternate Configuration File"); 468 cprint("Load an Alternate Configuration File");
449 cprint("S"); 469 cprint("S");
450 cprint("Save Configuration to an Alternate File"); 470 cprint("Save Configuration to an Alternate File");
451 } 471 }
452 stat = exec_conf(); 472 stat = exec_conf();
453 if (stat < 0) 473 if (stat < 0)
454 continue; 474 continue;
455 475
456 if (stat == 1 || stat == 255) 476 if (stat == 1 || stat == 255)
457 break; 477 break;
458 478
459 type = input_buf[0]; 479 type = input_buf[0];
460 if (!type) 480 if (!type)
461 continue; 481 continue;
462 482
463 for (i = 0; input_buf[i] && !isspace(input_buf[i]); i++) 483 for (i = 0; input_buf[i] && !isspace(input_buf[i]); i++)
464 ; 484 ;
465 if (i >= sizeof(active_entry)) 485 if (i >= sizeof(active_entry))
466 i = sizeof(active_entry) - 1; 486 i = sizeof(active_entry) - 1;
467 input_buf[i] = 0; 487 input_buf[i] = 0;
468 strcpy(active_entry, input_buf); 488 strcpy(active_entry, input_buf);
469 489
470 sym = NULL; 490 sym = NULL;
471 submenu = NULL; 491 submenu = NULL;
472 if (sscanf(input_buf + 1, "%p", &submenu) == 1) 492 if (sscanf(input_buf + 1, "%p", &submenu) == 1)
473 sym = submenu->sym; 493 sym = submenu->sym;
474 494
475 switch (stat) { 495 switch (stat) {
476 case 0: 496 case 0:
477 switch (type) { 497 switch (type) {
478 case 'm': 498 case 'm':
479 if (single_menu_mode) 499 if (single_menu_mode)
480 submenu->data = (void *) !submenu->data; 500 submenu->data = (void *) !submenu->data;
481 else 501 else
482 conf(submenu); 502 conf(submenu);
483 break; 503 break;
484 case 't': 504 case 't':
485 if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) 505 if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
486 conf_choice(submenu); 506 conf_choice(submenu);
507 else if (submenu->prompt->type == P_MENU)
508 conf(submenu);
487 break; 509 break;
488 case 's': 510 case 's':
489 conf_string(submenu); 511 conf_string(submenu);
490 break; 512 break;
491 case 'L': 513 case 'L':
492 conf_load(); 514 conf_load();
493 break; 515 break;
494 case 'S': 516 case 'S':
495 conf_save(); 517 conf_save();
496 break; 518 break;
497 } 519 }
498 break; 520 break;
499 case 2: 521 case 2:
500 if (sym) 522 if (sym)
501 show_help(submenu); 523 show_help(submenu);
502 else 524 else
503 show_readme(); 525 show_readme();
504 break; 526 break;
505 case 3: 527 case 3:
506 if (type == 't') { 528 if (type == 't') {
507 if (sym_set_tristate_value(sym, yes)) 529 if (sym_set_tristate_value(sym, yes))
508 break; 530 break;
509 if (sym_set_tristate_value(sym, mod)) 531 if (sym_set_tristate_value(sym, mod))
510 show_textbox(NULL, setmod_text, 6, 74); 532 show_textbox(NULL, setmod_text, 6, 74);
511 } 533 }
512 break; 534 break;
513 case 4: 535 case 4:
514 if (type == 't') 536 if (type == 't')
515 sym_set_tristate_value(sym, no); 537 sym_set_tristate_value(sym, no);
516 break; 538 break;
517 case 5: 539 case 5:
518 if (type == 't') 540 if (type == 't')
519 sym_set_tristate_value(sym, mod); 541 sym_set_tristate_value(sym, mod);
520 break; 542 break;
521 case 6: 543 case 6:
522 if (type == 't') 544 if (type == 't')
523 sym_toggle_tristate_value(sym); 545 sym_toggle_tristate_value(sym);
524 else if (type == 'm') 546 else if (type == 'm')
525 conf(submenu); 547 conf(submenu);
526 break; 548 break;
527 } 549 }
528 } 550 }
529} 551}
530 552
531static void show_textbox(const char *title, const char *text, int r, int c) 553static void show_textbox(const char *title, const char *text, int r, int c)
532{ 554{
533 int fd; 555 int fd;
534 556
@@ -699,82 +721,82 @@ static void conf_load(void)
699 721
700static void conf_save(void) 722static void conf_save(void)
701{ 723{
702 int stat; 724 int stat;
703 725
704 while (1) { 726 while (1) {
705 cprint_init(); 727 cprint_init();
706 cprint("--inputbox"); 728 cprint("--inputbox");
707 cprint(save_config_text); 729 cprint(save_config_text);
708 cprint("11"); 730 cprint("11");
709 cprint("55"); 731 cprint("55");
710 cprint("%s", filename); 732 cprint("%s", filename);
711 stat = exec_conf(); 733 stat = exec_conf();
712 switch(stat) { 734 switch(stat) {
713 case 0: 735 case 0:
714 if (!input_buf[0]) 736 if (!input_buf[0])
715 return; 737 return;
716 if (!conf_write(input_buf)) 738 if (!conf_write(input_buf))
717 return; 739 return;
718 show_textbox(NULL, "Can't create file! Probably a nonexistent directory.", 5, 60); 740 show_textbox(NULL, "Can't create file! Probably a nonexistent directory.", 5, 60);
719 break; 741 break;
720 case 1: 742 case 1:
721 show_helptext("Save Alternate Configuration", save_config_help); 743 show_helptext("Save Alternate Configuration", save_config_help);
722 break; 744 break;
723 case 255: 745 case 255:
724 return; 746 return;
725 } 747 }
726 } 748 }
727} 749}
728 750
729static void conf_cleanup(void) 751static void conf_cleanup(void)
730{ 752{
731 tcsetattr(1, TCSAFLUSH, &ios_org); 753 tcsetattr(1, TCSAFLUSH, &ios_org);
732 unlink(".help.tmp"); 754 unlink(".help.tmp");
733 unlink("lxdialog.scrltmp"); 755 unlink("lxdialog.scrltmp");
734} 756}
735 757
736int main(int ac, char **av) 758int main(int ac, char **av)
737{ 759{
738 struct symbol *sym; 760 struct symbol *sym;
739 char *mode; 761 char *mode;
740 int stat; 762 int stat;
741 763
742 conf_parse(av[1]); 764 conf_parse(av[1]);
743 conf_read(NULL); 765 conf_read(NULL);
744 766
745 sym = sym_lookup("KERNELRELEASE", 0); 767 sym = sym_lookup("KERNELRELEASE", 0);
746 sym_calc_value(sym); 768 sym_calc_value(sym);
747 sprintf(menu_backtitle, "Opie %s Configuration", 769 sprintf(menu_backtitle, "Build Configuration");
748 sym_get_string_value(sym));
749 770
750 mode = getenv("MENUCONFIG_MODE"); 771 mode = getenv("MENUCONFIG_MODE");
751 if (mode) { 772 if (mode) {
752 if (!strcasecmp(mode, "single_menu")) 773 if (!strcasecmp(mode, "single_menu"))
753 single_menu_mode = 1; 774 single_menu_mode = 1;
754 } 775 }
755 776
756 tcgetattr(1, &ios_org); 777 tcgetattr(1, &ios_org);
757 atexit(conf_cleanup); 778 atexit(conf_cleanup);
758 init_wsize(); 779 init_wsize();
759 conf(&rootmenu); 780 conf(&rootmenu);
760 781
761 do { 782 do {
762 cprint_init(); 783 cprint_init();
763 cprint("--yesno"); 784 cprint("--yesno");
764 cprint("Do you wish to save your new configuration?"); 785 cprint("Do you wish to save your new configuration?");
765 cprint("5"); 786 cprint("5");
766 cprint("60"); 787 cprint("60");
767 stat = exec_conf(); 788 stat = exec_conf();
768 } while (stat < 0); 789 } while (stat < 0);
769 790
770 if (stat == 0) { 791 if (stat == 0) {
771 conf_write(NULL); 792 conf_write(NULL);
772 printf("\n\n" 793 printf("\n\n"
773 "*** End of Opie configuration.\n" 794 "*** End of configuration.\n"
774 "*** Check the top-level Makefile for additional configuration.\n" 795 "\n\n");
775 "*** Next, you may run 'make'.\n\n");
776 } else 796 } else
777 printf("\n\nYour Opie configuration changes were NOT saved.\n\n"); 797 printf("\n\n"
798 "Your configuration changes were NOT saved."
799 "\n\n");
778 800
779 return 0; 801 return 0;
780} 802}