source: bootcd/isolinux/syslinux-6.03/com32/cmenu/complex.c

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 13.3 KB
Line 
1/* -*- c -*- ------------------------------------------------------------- *
2 *
3 *   Copyright 2004-2005 Murali Krishnan Ganapathy - All Rights Reserved
4 *
5 *   This program is free software; you can redistribute it and/or modify
6 *   it under the terms of the GNU General Public License as published by
7 *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
8 *   Boston MA 02111-1307, USA; either version 2 of the License, or
9 *   (at your option) any later version; incorporated herein by reference.
10 *
11 * ----------------------------------------------------------------------- */
12
13#ifndef NULL
14#define NULL ((void *) 0)
15#endif
16
17#include "cmenu.h"
18#include "com32io.h"
19#include "help.h"
20#include "passwords.h"
21#include "des.h"
22#include <stdlib.h>
23#include <stdio.h>
24#include <unistd.h>
25#include <getkey.h>
26
27/* Global variables */
28char infoline[160];
29char buffer[80];
30
31// Different network options
32static char nonet[] = "<n>etwork [none]";
33static char dhcpnet[] = "<n>etwork [dhcp]";
34static char statnet[] = "<n>etwork [static]";
35
36static char loginstr[] = "<L>ogin  ";
37static char logoutstr[] = "<L>ogout ";
38
39struct {
40    unsigned int baseurl:1;     // Do we need to specify by url
41    unsigned int mountcd:1;     // Should we mount the cd
42    unsigned int winrep:1;      // Want to repair windows?
43    unsigned int linrep:1;      // Want to repair linux?
44} flags;
45
46// Some menu options
47t_menuitem *baseurl, *mountcd, *network, *runprep, *winrep, *linrep;
48t_menuitem *stat, *dhcp, *none, *prepopt, *secret;
49
50// all the menus we are going to declare
51unsigned char TESTING, RESCUE, MAIN, PREPMENU, NETMENU, LONGMENU, SECRETMENU;
52
53char username[12];              // Name of user currently using the system
54
55/* End globals */
56
57TIMEOUTCODE ontimeout(void)
58{
59    beep();
60    return CODE_WAIT;
61}
62
63#define INFLINE 22
64#define PWDLINE 3
65#define PWDPROMPT 21
66#define PWDCOLUMN 60
67#define PWDATTR 0x74
68#define EDITPROMPT 21
69
70void keys_handler(t_menusystem * ms __attribute__ (( unused )), t_menuitem * mi, int scancode)
71{
72    int nc, nr;
73
74    if ((scancode) == KEY_F1 && mi->helpid != 0xFFFF) { // If scancode of F1
75        runhelpsystem(mi->helpid);
76    }
77    // If user hit TAB, and item is an "executable" item
78    // and user has privileges to edit it, edit it in place.
79    if ((scancode == KEY_TAB) && (mi->action == OPT_RUN) &&
80        (isallowed(username, "editcmd") || isallowed(username, "root"))) {
81    if (getscreensize(1, &nr, &nc)) {
82        /* Unknown screen size? */
83        nc = 80;
84        nr = 24;
85    }
86        // User typed TAB and has permissions to edit command line
87        gotoxy(EDITPROMPT, 1);
88        csprint("Command line:", 0x07);
89        editstring(mi->data, ACTIONLEN);
90        gotoxy(EDITPROMPT, 1);
91    clear_line();
92    }
93}
94
95t_handler_return login_handler(t_menusystem * ms, t_menuitem * mi)
96{
97    (void)mi;                   // Unused
98    char pwd[40];
99    char login[40];
100    int nc, nr;
101    t_handler_return rv;
102
103    (void)ms;
104
105    if (mi->item == loginstr) { /* User wants to login */
106    if (getscreensize(1, &nr, &nc)) {
107        /* Unknown screen size? */
108        nc = 80;
109        nr = 24;
110    }
111        gotoxy(PWDPROMPT, 1);
112        csprint("Enter Username: ", 0x07);
113        getstring(login, sizeof username);
114        gotoxy(PWDPROMPT, 1);
115    clear_line();
116        csprint("Enter Password: ", 0x07);
117        getpwd(pwd, sizeof pwd);
118        gotoxy(PWDPROMPT, 1);
119    clear_line();
120
121        if (authenticate_user(login, pwd)) {
122            strcpy(username, login);
123            mi->item = logoutstr;       // Change item to read "Logout"
124        } else
125            strcpy(username, GUEST_USER);
126    } else                      // User needs to logout
127    {
128        strcpy(username, GUEST_USER);
129        mi->item = loginstr;
130    }
131
132    if (strcmp(username, GUEST_USER) == 0) {
133        prepopt->action = OPT_INACTIVE;
134        secret->action = OPT_INVISIBLE;
135    } else {
136        prepopt->action = OPT_SUBMENU;
137        prepopt->itemdata.radiomenunum = PREPMENU;
138        secret->action = OPT_SUBMENU;
139        secret->itemdata.submenunum = SECRETMENU;
140    }
141    rv.valid = 0;
142    rv.refresh = 1;
143    rv.reserved = 0;
144    return rv;
145}
146
147void msys_handler(t_menusystem * ms, t_menuitem * mi)
148{
149    int nc, nr;
150    void *v;
151
152    if (getscreensize(1, &nr, &nc)) {
153        /* Unknown screen size? */
154        nc = 80;
155        nr = 24;
156    }
157    gotoxy(PWDLINE, PWDCOLUMN);
158    csprint("User: ", PWDATTR);
159    cprint(ms->fillchar, ms->fillattr, sizeof username);
160    gotoxy(PWDLINE, PWDCOLUMN + 6);
161    csprint(username, PWDATTR);
162
163    if (mi->parindex != PREPMENU)       // If we are not in the PREP MENU
164    {
165        gotoxy(INFLINE, 0);
166    reset_colors();
167    clear_line();
168        gotoxy(INFLINE + 1, 0);
169    clear_line();
170        return;
171    }
172    strcpy(infoline, " ");
173    if (flags.baseurl)
174        strcat(infoline, "baseurl=http://192.168.11.12/gui ");
175    if (flags.mountcd)
176        strcat(infoline, "mountcd=yes ");
177    v = (void *)network->data;
178    if (v != NULL)              // Some network option specified
179    {
180        strcat(infoline, "network=");
181        strcat(infoline, (char *)(((t_menuitem *) v)->data));
182    }
183    if (flags.winrep)
184        strcat(infoline, "repair=win ");
185    if (flags.linrep)
186        strcat(infoline, "repair=lin ");
187
188    gotoxy(INFLINE, 0);
189    reset_colors();
190    clear_line();
191    gotoxy(INFLINE + 1, 0);
192    clear_line();
193    gotoxy(INFLINE, 0);
194    csprint("Kernel Arguments:", 0x07);
195    gotoxy(INFLINE, 17);
196    csprint(infoline, 0x07);
197}
198
199t_handler_return network_handler(t_menusystem * ms, t_menuitem * mi)
200{
201    // mi=network since this is handler only for that.
202    (void)ms;                   // Unused
203
204    if (mi->data == (void *)none)
205        mi->item = nonet;
206    if (mi->data == (void *)stat)
207        mi->item = statnet;
208    if (mi->data == (void *)dhcp)
209        mi->item = dhcpnet;
210    return ACTION_INVALID;      // VALID or INVALID does not matter
211}
212
213t_handler_return checkbox_handler(t_menusystem * ms, t_menuitem * mi)
214{
215    (void)ms;                   /* Unused */
216
217    t_handler_return rv;
218
219    if (mi->action != OPT_CHECKBOX)
220        return ACTION_INVALID;
221
222    if (strcmp(mi->data, "baseurl") == 0)
223        flags.baseurl = (mi->itemdata.checked ? 1 : 0);
224    if (strcmp(mi->data, "winrepair") == 0) {
225        if (mi->itemdata.checked) {
226            flags.winrep = 1;
227            linrep->action = OPT_INACTIVE;
228        } else {
229            flags.winrep = 0;
230            linrep->action = OPT_CHECKBOX;
231        }
232    }
233    if (strcmp(mi->data, "linrepair") == 0) {
234        if (mi->itemdata.checked) {
235            flags.linrep = 1;
236            winrep->action = OPT_INACTIVE;
237        } else {
238            flags.winrep = 0;
239            winrep->action = OPT_CHECKBOX;
240        }
241    }
242    if (strcmp(mi->data, "mountcd") == 0)
243        flags.mountcd = (mi->itemdata.checked ? 1 : 0);
244
245    rv.valid = 0;
246    rv.refresh = 1;
247    rv.reserved = 0;
248    return rv;
249}
250
251int main(void)
252{
253    t_menuitem *curr;
254    char cmd[160];
255    char ip[30];
256
257    // Set default username as guest
258    strcpy(username, GUEST_USER);
259
260    // Switch video mode here
261    // setvideomode(0x18); // or whatever mode you want
262
263    // Choose the default title and setup default values for all attributes....
264    init_passwords("/isolinux/password");
265    init_help("/isolinux/help");
266    init_menusystem(NULL);
267    set_window_size(1, 1, 20, 78);      // Leave some space around
268
269    // Choose the default values for all attributes and char's
270    // -1 means choose defaults (Actually the next 4 lines are not needed)
271    //set_normal_attr (-1,-1,-1,-1);
272    //set_status_info (-1,-1); // Display status on the last line
273    //set_title_info  (-1,-1);
274    //set_misc_info(-1,-1,-1,-1);
275
276    // Register the menusystem handler
277    reg_handler(HDLR_SCREEN, &msys_handler);
278    reg_handler(HDLR_KEYS, &keys_handler);
279    // Register the ontimeout handler, with a time out of 10 seconds
280    reg_ontimeout(ontimeout, 10, 0);
281
282    NETMENU = add_menu(" Init Network ", -1);
283    none = add_item("<N>one", "Dont start network", OPT_RADIOITEM, "no ", 0);
284    dhcp = add_item("<d>hcp", "Use DHCP", OPT_RADIOITEM, "dhcp ", 0);
285    stat =
286        add_item("<s>tatic", "Use static IP I will specify later",
287                 OPT_RADIOITEM, "static ", 0);
288
289    TESTING = add_menu(" Testing ", -1);
290    set_menu_pos(5, 55);
291    add_item("<M>emory Test", "Perform extensive memory testing", OPT_RUN,
292             "memtest", 0);
293    add_item("<I>nvisible", "You dont see this", OPT_INVISIBLE, "junk", 0);
294    add_item("<E>xit this menu", "Go one level up", OPT_EXITMENU, "exit", 0);
295
296    RESCUE = add_menu(" Rescue Options ", -1);
297    add_item("<L>inux Rescue", "linresc", OPT_RUN, "linresc", 0);
298    add_item("<D>os Rescue", "dosresc", OPT_RUN, "dosresc", 0);
299    add_item("<W>indows Rescue", "winresc", OPT_RUN, "winresc", 0);
300    add_item("<E>xit this menu", "Go one level up", OPT_EXITMENU, "exit", 0);
301
302    PREPMENU = add_menu(" Prep options ", -1);
303    baseurl =
304        add_item("<b>aseurl by IP?", "Specify gui baseurl by IP address",
305                 OPT_CHECKBOX, "baseurl", 0);
306    mountcd =
307        add_item("<m>ountcd?", "Mount the cdrom drive?", OPT_CHECKBOX,
308                 "mountcd", 0);
309    network =
310        add_item(dhcpnet, "How to initialise network device?", OPT_RADIOMENU,
311                 NULL, NETMENU);
312    add_sep();
313    winrep =
314        add_item("Reinstall <w>indows",
315                 "Re-install the windows side of a dual boot setup",
316                 OPT_CHECKBOX, "winrepair", 0);
317    linrep =
318        add_item("Reinstall <l>inux",
319                 "Re-install the linux side of a dual boot setup", OPT_CHECKBOX,
320                 "linrepair", 0);
321    add_sep();
322    runprep =
323        add_item("<R>un prep now", "Execute prep with the above options",
324                 OPT_RUN, "prep", 0);
325    add_item("<E>xit this menu", "Go up one level", OPT_EXITMENU, "exitmenu",
326             0);
327    baseurl->handler = &checkbox_handler;
328    mountcd->handler = &checkbox_handler;
329    winrep->handler = &checkbox_handler;
330    linrep->handler = &checkbox_handler;
331    network->handler = &network_handler;
332    flags.baseurl = 0;
333    flags.mountcd = 0;
334    flags.winrep = 0;
335    flags.linrep = 0;
336
337    SECRETMENU = add_menu(" Secret Menu ", -1);
338    add_item("secret 1", "Secret", OPT_RUN, "A", 0);
339    add_item("secret 2", "Secret", OPT_RUN, "A", 0);
340
341    LONGMENU = add_menu(" Long Menu ", 40);     // Override default here
342    add_item("<A>a", "Aa", OPT_RUN, "A", 0);
343    add_item("<B>b", "Ab", OPT_RUN, "A", 0);
344    add_item("<C>", "A", OPT_RUN, "A", 0);
345    add_item("<D>", "A", OPT_RUN, "A", 0);
346    add_item("<E>", "A", OPT_RUN, "A", 0);
347    add_item("<F>", "A", OPT_RUN, "A", 0);
348    add_item("<G>", "A", OPT_RUN, "A", 0);
349    add_item("<H>", "A", OPT_RUN, "A", 0);
350    add_item("<I>", "A", OPT_RUN, "A", 0);
351    add_item("<J>", "A", OPT_RUN, "A", 0);
352    add_item("<K>", "A", OPT_RUN, "A", 0);
353    add_item("<L>", "A", OPT_RUN, "A", 0);
354    add_item("<J>", "A", OPT_RUN, "A", 0);
355    add_item("<K>", "A", OPT_RUN, "A", 0);
356    add_item("<L>", "A", OPT_RUN, "A", 0);
357    add_item("<M>", "A", OPT_RUN, "A", 0);
358    add_item("<N>", "A", OPT_RUN, "A", 0);
359    add_item("<O>", "A", OPT_RUN, "A", 0);
360    add_item("<P>", "A", OPT_RUN, "A", 0);
361    add_item("<Q>", "A", OPT_RUN, "A", 0);
362    add_item("<R>", "A", OPT_RUN, "A", 0);
363    add_item("<S>", "A", OPT_RUN, "A", 0);
364    add_item("<T>", "A", OPT_RUN, "A", 0);
365    add_item("<U>", "A", OPT_RUN, "A", 0);
366    add_item("<V>", "A", OPT_RUN, "A", 0);
367    add_item("<W>", "A", OPT_RUN, "A", 0);
368    add_item("<X>", "A", OPT_RUN, "A", 0);
369    add_item("<Y>", "A", OPT_RUN, "A", 0);
370    add_item("<Z>", "A", OPT_RUN, "A", 0);
371    add_item("<1>", "A", OPT_RUN, "A", 0);
372    add_item("<2>", "A", OPT_RUN, "A", 0);
373    add_item("<3>", "A", OPT_RUN, "A", 0);
374    add_item("<4>", "A", OPT_RUN, "A", 0);
375    add_item("<5>", "A", OPT_RUN, "A", 0);
376    add_item("<6>", "A", OPT_RUN, "A", 0);
377    add_item("<7>", "A", OPT_RUN, "A", 0);
378    add_item("<8>", "A", OPT_RUN, "A", 0);
379    add_item("<9>", "A", OPT_RUN, "A", 0);
380
381    MAIN = add_menu(" Main Menu ", 8);
382    curr = add_item(loginstr, "Login as a privileged user", OPT_RUN, NULL, 0);
383    set_item_options(-1, 23);
384    curr->handler = &login_handler;
385
386    add_item("<P>repare", "prep", OPT_RUN, "prep", 0);
387    set_item_options(-1, 24);
388    prepopt =
389        add_item("<P>rep options...",
390                 "Options for prep image: Requires authenticated user",
391                 OPT_INACTIVE, NULL, PREPMENU);
392    set_item_options(-1, 25);
393
394    add_item("<R>escue options...", "Troubleshoot a system", OPT_SUBMENU, NULL,
395             RESCUE);
396    set_item_options(-1, 26);
397    add_item("<T>esting...", "Options to test hardware", OPT_SUBMENU, NULL,
398             TESTING);
399    set_item_options(-1, 27);
400    add_item("<L>ong Menu...", "test menu system", OPT_SUBMENU, NULL, LONGMENU);
401    set_item_options(-1, 28);
402    secret =
403        add_item("<S>ecret Menu...", "Secret menu", OPT_INVISIBLE, NULL,
404                 SECRETMENU);
405    set_item_options(-1, 29);
406    add_item("<E>xit to prompt", "Exit the menu system", OPT_EXITMENU, "exit",
407             0);
408    set_item_options(-1, 30);
409    csprint("Press any key within 5 seconds to show menu...", 0x07);
410    if (get_key(stdin, 50) == KEY_NONE) // Granularity of 100 milliseconds
411    {
412        csprint("Sorry! Time's up.\r\n", 0x07);
413        return 1;
414    }
415    curr = showmenus(MAIN);
416    if (curr) {
417        if (curr->action == OPT_RUN) {
418            strcpy(cmd, curr->data);
419            if (curr == runprep) {
420                strcat(cmd, infoline);
421                if (network->data == (void *)stat)      // We want static
422                {
423                    csprint("Enter IP address (last two octets only): ", 0x07);
424                    strcpy(ip, "Junk");
425                    editstring(ip, sizeof ip);
426                    strcat(cmd, "ipaddr=192.168.");
427                    strcat(cmd, ip);
428                }
429            }
430            if (issyslinux())
431                runsyslinuxcmd(cmd);
432            else
433                csprint(cmd, 0x07);
434            return 1;           // Should not happen when run from SYSLINUX
435        }
436    }
437    // If user quits the menu system, control comes here
438    // If you want to execute some specific command uncomment the next two lines
439
440    // if (syslinux) runcommand(YOUR_COMMAND_HERE);
441    // else csprint(YOUR_COMMAND_HERE,0x07);
442
443    // Deallocate space used for these data structures
444    close_passwords();
445    close_help();
446    close_menusystem();
447
448    // Return to prompt
449    return 0;
450}
Note: See TracBrowser for help on using the repository browser.