176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* -*- c -*- ------------------------------------------------------------- *
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   Copyright 2004-2006 Murali Krishnan Ganapathy - All Rights Reserved
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   This program is free software; you can redistribute it and/or modify
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   it under the terms of the GNU General Public License as published by
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   Boston MA 02111-1307, USA; either version 2 of the License, or
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   (at your option) any later version; incorporated herein by reference.
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ----------------------------------------------------------------------- */
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef NULL
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define NULL ((void *) 0)
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "cmenu.h"
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "help.h"
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "passwords.h"
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "com32io.h"
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h>
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdlib.h>
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <unistd.h>
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MAX_CMD_LINE_LENGTH 514
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct s_xtra {
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  long ipappend; // Stores the ipappend flag to send (useful for PXELINUX only)
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char *argsmenu; // Stores the name of menu which contains options for the given RUN item
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char *perms; // stores the permissions required to activate the item
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} t_xtra;
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef t_xtra *pt_xtra; // Pointer to extra datastructure
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Types of dot commands for which caller takes responsibility of handling
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// In some case some commands may not make sense, it is up to the caller
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// to handle cases which do not make sense
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef enum {QUIT_CMD, REPEAT_CMD, ENTER_CMD, ESCAPE_CMD} t_dotcmd;
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*----------------- Global Variables */
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// default user
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define GUEST_USER "guest"
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// for local commands. return value of execdotcmd
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define QUIT_CMD 0
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define RPT_CMD 1
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar username[12]; // Name of user currently using the system
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint PWD_ROW; // Line number where user authentication happens
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint EDIT_ROW; // row where User Tab
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar loginstr[] = "<L>ogin  ";
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar logoutstr[30];
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint vmode; // The video mode we want to be in
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar timeoutcmd[MAX_CMD_LINE_LENGTH]; // Command to execute on timeout
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar totaltimeoutcmd[MAX_CMD_LINE_LENGTH]; // Command to execute on totaltimeout
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar QUITSTR[] = ".quit"; // same as exit
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar IGNORESTR[]=".ignore"; // same as repeat, wait
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*----------------  End globals */
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// returns pointer to first non-space char
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// and advances end of str by removing trailing spaces
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar * strip(char *str)
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char *p,*s,*e;
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (!str) return NULL;
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  p = str;
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  s = NULL;
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  e = NULL;
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  while (*p) {
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (*p != ' ') {
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       // mark start of string or record the last visited non-space char
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       if (!s) s=p; else e=p;
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    p++;
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  *(++e)='\0'; // kill string earlier
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  return s;
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// executes a list of % separated commands
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// non-dot commands are assumed to be syslinux commands
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// All syslinux commands are appended with the contents of kerargs
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// If it fails (kernel not found) then the next one is tried in the
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// list
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// returns QUIT_CMD or RPT_CMD
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmant_dotcmd execdotcmd(const char *cmd, char *defcmd, const char *kerargs)
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   char cmdline[MAX_CMD_LINE_LENGTH];
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   char dotcmd[MAX_CMD_LINE_LENGTH];
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   char *curr,*next,*p,*args;
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   char ctr;
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   strcpy(dotcmd,cmd);
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   next = dotcmd;
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   cmdline[0] = '\0';
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   while (*next) { // if something to do
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      curr = next;
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      p = strchr(next,'%');
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      if (p) {
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         *p--='\0'; next=p+2;
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         while (*p == ' ') p--;
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         *(++p)='\0'; // remove trailing spaces
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      } else {
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (*defcmd) { // execute defcmd next
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            next=defcmd;
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            defcmd=NULL; // exec def cmd only once
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        } else next=NULL;
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      // now we just need to execute the command "curr"
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      curr = strip(curr);
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      if (curr[0] != '.') { // just run the kernel
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         strcpy(cmdline,curr);
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         if (kerargs) strcat(cmdline,kerargs);
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         runsyslinuximage(cmdline,0); // No IPAppend
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      } else { // We have a DOT command
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        // split command into command and args (may be empty)
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        args = curr;
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        while ( (*args != ' ') && (*args != '\0') ) args++;
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (*args) { // found a space
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           *args++ = '\0';
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           while (*args == ' ') args++; // skip over spaces
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if ( (strcmp(curr,".exit")==0) ||
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman             (strcmp(curr,".quit")==0)
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           )
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           return QUIT_CMD;
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if ( (strcmp(curr,".repeat")==0) ||
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman             (strcmp(curr,".ignore")==0) ||
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman             (strcmp(curr,".wait")==0)
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           )
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           return RPT_CMD;
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (strcmp(curr,".beep")==0) {
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           if ((args) && ('0' <= args[0]) && (args[0] <= '9'))
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman              ctr = args[0]-'0';
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           else ctr=1;
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           for (;ctr>0; ctr--) beep();
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (strcmp(curr,".help")==0) runhelp(args);
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   return RPT_CMD; // by default we do not quit
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanTIMEOUTCODE timeout(const char *cmd)
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  t_dotcmd c;
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  c = execdotcmd(cmd,".wait",NULL);
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  switch(c) {
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    case ENTER_CMD:
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         return CODE_ENTER;
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    case ESCAPE_CMD:
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         return CODE_ESCAPE;
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    default:
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         return CODE_WAIT;
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanTIMEOUTCODE ontimeout(void)
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   return timeout(timeoutcmd);
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanTIMEOUTCODE ontotaltimeout(void)
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   return timeout(totaltimeoutcmd);
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid keys_handler(t_menusystem * ms __attribute__ (( unused )), t_menuitem * mi, int scancode)
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   int nc, nr;
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (getscreensize(1, &nr, &nc)) {
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       /* Unknown screen size? */
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       nc = 80;
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       nr = 24;
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if ( (scancode == KEY_F1) && (mi->helpid != 0xFFFF) ) { // If scancode of F1 and non-trivial helpid
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      runhelpsystem(mi->helpid);
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   // If user hit TAB, and item is an "executable" item
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   // and user has privileges to edit it, edit it in place.
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if ((scancode == KEY_TAB) && (mi->action == OPT_RUN) &&
19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       (EDIT_ROW < nr) && (EDIT_ROW > 0) &&
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       (isallowed(username,"editcmd") || isallowed(username,"root"))) {
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     // User typed TAB and has permissions to edit command line
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     gotoxy(EDIT_ROW,1);
19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     csprint("Command line:",0x07);
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     editstring(mi->data,ACTIONLEN);
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     gotoxy(EDIT_ROW,1);
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     cprint(' ',0x07,nc-1);
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmant_handler_return login_handler(t_menusystem *ms, t_menuitem *mi)
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  (void)mi; // Unused
20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char pwd[40];
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char login[40];
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int nc, nr;
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  t_handler_return rv;
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  (void)ms;
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  rv = ACTION_INVALID;
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (PWD_ROW < 0) return rv; // No need to authenticate
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (mi->item == loginstr) { /* User wants to login */
21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (getscreensize(1, &nr, &nc)) {
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        /* Unknown screen size? */
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        nc = 80;
22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        nr = 24;
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    gotoxy(PWD_ROW,1);
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    csprint("Enter Username: ",0x07);
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    getstring(login, sizeof username);
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    gotoxy(PWD_ROW,1);
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    cprint(' ',0x07,nc);
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    csprint("Enter Password: ",0x07);
23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    getpwd(pwd, sizeof pwd);
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    gotoxy(PWD_ROW,1);
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    cprint(' ',0x07,nc);
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (authenticate_user(login,pwd))
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      strcpy(username,login);
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      strcpy(logoutstr,"<L>ogout ");
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      strcat(logoutstr,username);
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      mi->item = logoutstr; // Change item to read "Logout"
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      rv.refresh = 1; // refresh the screen (as item contents changed)
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    else strcpy(username,GUEST_USER);
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  else // User needs to logout
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  {
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    strcpy(username,GUEST_USER);
24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    strcpy(logoutstr,"");
24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    mi->item = loginstr;
24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  return rv;
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmant_handler_return check_perms(t_menusystem *ms, t_menuitem *mi)
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   char *perms;
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   pt_xtra x;
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   (void) ms; // To keep compiler happy
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   x = (pt_xtra) mi->extra_data;
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   perms = ( x ? x->perms : NULL);
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (!perms) return ACTION_VALID;
26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (isallowed(username,"root") || isallowed(username,perms)) // If allowed
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return ACTION_VALID;
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   else return ACTION_INVALID;
26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Compute the full command line to add and if non-trivial
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// prepend the string prepend to final command line
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Assume cmdline points to buffer long enough to hold answer
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid gencommand(pt_menuitem mi, char *cmdline)
27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   pt_xtra x;
27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   cmdline[0] = '\0';
27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   strcat(cmdline,mi->data);
27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   x = (pt_xtra) mi->extra_data;
27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if ( (x) && (x->argsmenu)) gen_append_line(x->argsmenu,cmdline);
28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// run the given command together with additional options which may need passing
28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid runcommand(pt_menuitem mi)
28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   char *line;
28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   pt_xtra x;
28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   long ipappend;
28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   line = (char *)malloc(sizeof(char)*MAX_CMD_LINE_LENGTH);
29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   gencommand(mi,line);
29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   x = (pt_xtra) mi->extra_data;
29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   ipappend = (x ? x->ipappend : 0);
29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   runsyslinuximage(line,ipappend);
29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   free(line);
29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// set the extra info for the specified menu item.
30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid set_xtra(pt_menuitem mi, const char *argsmenu, const char *perms, unsigned int helpid, long ipappend)
30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   pt_xtra xtra;
30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   int bad_argsmenu, bad_perms, bad_ipappend;
30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   mi->extra_data = NULL; // initalize
30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   mi->helpid = helpid; // set help id
30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (mi->action != OPT_RUN) return;
30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   bad_argsmenu = bad_perms = bad_ipappend = 0;
31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if ( (argsmenu==NULL) || (strlen(argsmenu)==0)) bad_argsmenu = 1;
31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if ( (perms==NULL) || (strlen(perms)==0)) bad_perms = 1;
31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if ( ipappend==0) bad_ipappend = 1;
31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (bad_argsmenu && bad_perms && bad_ipappend) return;
31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   xtra = (pt_xtra) malloc(sizeof(t_xtra));
31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   mi->extra_data = (void *) xtra;
31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   xtra->argsmenu = xtra->perms = NULL;
32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   xtra->ipappend = ipappend;
32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (!bad_argsmenu) {
32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      xtra->argsmenu = (char *) malloc(sizeof(char)*(strlen(argsmenu)+1));
32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      strcpy(xtra->argsmenu,argsmenu);
32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (!bad_perms) {
32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      xtra->perms = (char *) malloc(sizeof(char)*(strlen(perms)+1));
32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      strcpy(xtra->perms,perms);
32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      mi->handler = &check_perms;
32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint main(void)
33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  pt_menuitem curr;
33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char quit;
33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char exitcmd[MAX_CMD_LINE_LENGTH];
33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char exitcmdroot[MAX_CMD_LINE_LENGTH];
33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char onerrcmd[MAX_CMD_LINE_LENGTH];
33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char startfile[MAX_CMD_LINE_LENGTH];
34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char *ecmd; // effective exit command or onerrorcmd
34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char skipbits;
34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  char skipcmd[MAX_CMD_LINE_LENGTH];
34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int timeout; // time in multiples of 0.1 seconds
34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int totaltimeout; // time in multiples of 0.1 seconds
34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  t_dotcmd dotrv; // to store the return value of execdotcmd
34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  int temp;
34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  strcpy(username,GUEST_USER);
34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ---- Initializing menu system parameters --- */
35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  vmode = 0xFF;
35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  skipbits = SHIFT_PRESSED | CAPSLOCK_ON;
35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  PWD_ROW = 23;
35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EDIT_ROW = 23;
35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  strcpy(onerrcmd,".beep 2 % % .help hlp00025.txt % .exit");
35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  strcpy(exitcmd,".exit");
35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  strcpy(exitcmdroot,"");
35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  // If not specified exitcmdroot = exitcmd
35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (exitcmdroot[0] == '\0') strcpy(exitcmdroot,exitcmd);
35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  // Timeout stuff
36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  timeout = 600;
36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  strcpy(timeoutcmd,".wait");
36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  totaltimeout = 0;
36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  strcpy(totaltimeoutcmd,"chain.c32 hd 0");
36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  strcpy(startfile,"hlp00026.txt");
36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  init_help("/isolinux/help");
36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  init_passwords("/isolinux/password");
36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  init_menusystem(" COMBOOT Menu System ");
36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_window_size(1,1,21,79);
37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  // Register the ontimeout handler, with a time out of 10 seconds
37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  reg_ontimeout(ontimeout,timeout*10,0);
37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  reg_ontotaltimeout(ontotaltimeout,totaltimeout*10);
37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  // Register menusystem handlers
37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  reg_handler(HDLR_KEYS,&keys_handler);
37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ---- End of initialization --- */
37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ------- MENU netmenu ----- */
38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  add_named_menu("netmenu"," Init Network ",-1);
38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<N>one","Dont start network",OPT_RADIOITEM,"network=no",0);
38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<d>hcp","Use DHCP",OPT_RADIOITEM,"network=dhcp",0);
38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ------- MENU testing ----- */
39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  add_named_menu("testing"," Testing ",-1);
39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<M>emory Test","Perform extensive memory testing",OPT_RUN,"memtest",0);
39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",25,3); // Set associated extra info
39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<I>nvisible","You dont see this",OPT_INVISIBLE,"",0);
39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<E>xit menu","Go one level up",OPT_EXITMENU,"",0);
40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ------- MENU rescue ----- */
40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  add_named_menu("rescue"," Rescue Options ",-1);
40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<L>inux Rescue","Run linresc",OPT_RUN,"linresc",0);
40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<D>os Rescue","dosresc",OPT_RUN,"dosresc",0);
41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<W>indows Rescue","winresc",OPT_RUN,"winresc",0);
41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<E>xit this menu","Go one level up",OPT_EXITMENU,"",0);
42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ------- MENU prep ----- */
42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  add_named_menu("prep"," Prep options ",-1);
42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<b>aseurl by IP?","Specify gui baseurl by IP address",OPT_CHECKBOX,"baseurl=http://192.168.0.1",0);
42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<m>ountcd?","Mount the cdrom drive?",OPT_CHECKBOX,"mountcd",0);
43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("Network Initialization","How to initialise network device?",OPT_RADIOMENU,"netmenu",0);
43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("","",OPT_SEP,"",0);
44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("Reinstall <w>indows","Re-install the windows side of a dual boot setup",OPT_CHECKBOX,"repair=win",0);
44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("Reinstall <l>inux","Re-install the linux side of a dual boot setup",OPT_CHECKBOX,"repair=lin",0);
44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("","",OPT_SEP,"",0);
45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<R>un prep now","Execute prep with the above options",OPT_RUN,"prep",0);
45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"prep","",65535,0); // Set associated extra info
45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<E>xit this menu","Go up one level",OPT_EXITMENU,"",0);
46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ------- MENU main ----- */
46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  add_named_menu("main"," Main Menu ",-1);
46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item(loginstr,"Login/Logout of authentication system",OPT_RUN,NULL,0);
46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr->helpid = 65535;
46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr->handler = &login_handler;
46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<P>repare","prep",OPT_RUN,"prep",0);
47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<P>rep options...","Options for prep",OPT_SUBMENU,"prep",0);
47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<R>escue options...","Troubleshoot a system",OPT_SUBMENU,"rescue",0);
47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",26,0); // Set associated extra info
48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<T>esting...","Options to test hardware",OPT_SUBMENU,"testing",0);
48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  curr = add_item("<E>xit to prompt","Exit the menu system",OPT_EXITMENU,"",0);
48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_xtra(curr,"","",65535,0); // Set associated extra info
48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  set_shortcut(-1);
48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ------- END OF MENU declarations ----- */
49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Check if we should skip the menu altogether
49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  quit = 0; // Dont skip the menu
49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  if (getshiftflags() & skipbits) { // we must skip the menu altogther and execute skipcmd
49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    dotrv = execdotcmd(skipcmd,".beep%.exit",NULL); // Worst case we beep and exit
49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (dotrv == QUIT_CMD) quit = 1;
49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Switch vide mode if required
49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (vmode != 0xFF) setvideomode(vmode);
50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Do we have a startfile to display?
50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (startfile[0] != '\0') runhelp(startfile);
50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// The main loop
50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  while (quit == 0) { // As long as quit is zero repeat
50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     curr = showmenus(find_menu_num("main")); // Initial menu is the one called "main"
50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     if (curr) {
50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (curr->action == OPT_RUN) {
51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           ecmd = (char *)malloc(sizeof(char)*MAX_CMD_LINE_LENGTH);
51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           gencommand(curr,ecmd);
51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           temp = (curr->extra_data ? ((pt_xtra)curr->extra_data)->ipappend : 0);
51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           runsyslinuximage(ecmd,temp);
51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           // kernel not found so execute the appropriate dot command
51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           dotrv = execdotcmd(onerrcmd,".quit",ecmd); // pass bad cmdline as arg
51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           if (dotrv== QUIT_CMD) quit = 1;
51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman           free(ecmd); ecmd = NULL;
51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        else csprint("Error in programming!",0x07);
52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     } else {
52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        // find effective exit command
52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        ecmd = ( isallowed(username,"root") ? exitcmdroot : exitcmd);
52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        dotrv = execdotcmd(ecmd,".repeat",NULL);
52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        quit = (dotrv == QUIT_CMD ? 1 : 0); // should we exit now
52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     }
52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Deallocate space used and quit
52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  close_passwords();
53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  close_help();
53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  close_menusystem();
53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  return 0;
53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
535