• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright 2004-2008 H. Peter Anvin - 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., 51 Franklin St, Fifth Floor,
8  *   Boston MA 02110-1301, USA; either version 2 of the License, or
9  *   (at your option) any later version; incorporated herein by reference.
10  *
11  * ----------------------------------------------------------------------- */
12 
13 /*
14  * menu.h
15  *
16  * Header file for the simple menu system
17  */
18 
19 #ifndef MENU_H
20 #define MENU_H
21 
22 #include <time.h>
23 #include <sys/time.h>
24 #include <sys/times.h>
25 #include <inttypes.h>
26 #include <unistd.h>
27 #include <colortbl.h>
28 #include <stdbool.h>
29 #include <getkey.h>
30 #include "refstr.h"
31 
32 /* #define DEBUG 1 */
33 #include <dprintf.h>
34 
35 #ifndef CLK_TCK
36 # define CLK_TCK sysconf(_SC_CLK_TCK)
37 #endif
38 
39 struct menu;
40 
41 /* Note: the _UNRES variants must always be immediately after their
42    "normal" versions. */
43 enum menu_action {
44     MA_NONE,			/* Undefined value */
45     MA_CMD,			/* Execute a command */
46     MA_DISABLED,		/* Disabled menu entry */
47     MA_SUBMENU,			/* This is a submenu entry */
48     MA_GOTO,			/* Go to another menu */
49     MA_GOTO_UNRES,		/* Unresolved go to */
50     MA_QUIT,			/* Quit to CLI */
51     MA_EXIT,			/* Exit to higher-level menu */
52     MA_EXIT_UNRES,		/* Unresolved exit */
53     MA_HELP,			/* Show help text */
54 };
55 
56 struct menu_entry {
57     struct menu *menu;		/* Parent menu */
58     const char *displayname;
59     const char *label;
60     const char *passwd;
61     char *helptext;
62     const char *cmdline;
63     const char *background;
64     struct menu *submenu;
65     struct menu_entry *next;	/* Linked list of all labels across menus */
66     int entry;			/* Entry number inside menu */
67     enum menu_action action;
68     unsigned char hotkey;
69     bool immediate;		/* Hotkey action does not require Enter */
70     bool save;			/* Save this entry if selected */
71 };
72 
is_disabled(struct menu_entry * me)73 static inline bool is_disabled(struct menu_entry *me)
74 {
75     return me->action == MA_DISABLED;
76 }
77 
78 enum kernel_type {
79     /* Meta-types for internal use */
80     KT_NONE,
81     KT_LOCALBOOT,
82 
83     /* The ones we can pass off to SYSLINUX, in order */
84     KT_KERNEL,			/* Undefined type */
85     KT_LINUX,			/* Linux kernel */
86     KT_BOOT,			/* Bootstrap program */
87     KT_BSS,			/* Boot sector with patch */
88     KT_PXE,			/* PXE NBP */
89     KT_FDIMAGE,			/* Floppy disk image */
90     KT_COM32,			/* COM32 image */
91     KT_CONFIG,			/* Configuration file */
92 };
93 
94 /* Configurable integer parameters */
95 enum parameter_number {
96     P_WIDTH,
97     P_MARGIN,
98     P_PASSWD_MARGIN,
99     P_MENU_ROWS,
100     P_TABMSG_ROW,
101     P_CMDLINE_ROW,
102     P_END_ROW,
103     P_PASSWD_ROW,
104     P_TIMEOUT_ROW,
105     P_HELPMSG_ROW,
106     P_HELPMSGEND_ROW,
107     P_HSHIFT,
108     P_VSHIFT,
109     P_HIDDEN_ROW,
110 
111     NPARAMS
112 };
113 
114 /* Configurable messages */
115 enum message_number {
116     MSG_TITLE,
117     MSG_AUTOBOOT,
118     MSG_TAB,
119     MSG_NOTAB,
120     MSG_PASSPROMPT,
121 
122     MSG_COUNT
123 };
124 
125 struct messages {
126     const char *name;		/* Message configuration name */
127     const char *defmsg;		/* Default message text */
128 };
129 
130 struct menu_parameter {
131     const char *name;
132     int value;
133 };
134 
135 extern const struct menu_parameter mparm[NPARAMS];
136 
137 struct fkey_help {
138     const char *textname;
139     const char *background;
140 };
141 
142 struct menu {
143     struct menu *next;		/* Linked list of all menus */
144     const char *label;		/* Goto label for this menu */
145     struct menu *parent;
146     struct menu_entry *parent_entry;	/* Entry for self in parent */
147 
148     struct menu_entry **menu_entries;
149     struct menu_entry *menu_hotkeys[256];
150 
151     const char *messages[MSG_COUNT];
152     int mparm[NPARAMS];
153 
154     int nentries;
155     int nentries_space;
156     int defentry;
157     int timeout;
158 
159     bool allowedit;
160     bool immediate;		/* MENU IMMEDIATE default for this menu */
161     bool save;			/* MENU SAVE default for this menu */
162 
163     int curentry;
164     int curtop;
165 
166     const char *title;
167     const char *ontimeout;
168     const char *onerror;
169     const char *menu_master_passwd;
170     const char *menu_background;
171 
172     struct color_table *color_table;
173 
174     struct fkey_help fkeyhelp[12];
175 };
176 
177 extern struct menu *root_menu, *start_menu, *hide_menu, *menu_list;
178 
179 /* 2048 is the current definition inside syslinux */
180 #define MAX_CMDLINE_LEN	 2048
181 
182 /* These are global parameters regardless of which menu we're displaying */
183 extern int shiftkey;
184 extern int hiddenmenu;
185 extern int clearmenu;
186 extern long long totaltimeout;
187 extern clock_t kbdtimeout;
188 extern const char *hide_key[KEY_MAX];
189 
190 void parse_configs(char **argv);
191 int draw_background(const char *filename);
192 void set_resolution(int x, int y);
193 void start_console(void);
194 void local_cursor_enable(bool);
195 
my_isspace(char c)196 static inline int my_isspace(char c)
197 {
198     return (unsigned char)c <= ' ';
199 }
200 
201 int my_isxdigit(char c);
202 unsigned int hexval(char c);
203 unsigned int hexval2(const char *p);
204 uint32_t parse_argb(char **p);
205 
206 extern const int message_base_color, menu_color_table_size;
207 int mygetkey(clock_t timeout);
208 int show_message_file(const char *filename, const char *background);
209 
210 /* passwd.c */
211 int passwd_compare(const char *passwd, const char *entry);
212 
213 /* colors.c */
214 #define MSG_COLORS_DEF_FG	0x90ffffff
215 #define MSG_COLORS_DEF_BG	0x80ffffff
216 #define MSG_COLORS_DEF_SHADOW	SHADOW_NORMAL
217 void set_msg_colors_global(struct color_table *tbl,
218 			   unsigned int fg, unsigned int bg,
219 			   enum color_table_shadow shadow);
220 struct color_table *default_color_table(void);
221 struct color_table *copy_color_table(const struct color_table *master);
222 extern const int message_base_color;
223 
224 /* background.c */
225 extern const char *current_background;
226 void set_background(const char *new_background);
227 
228 /* drain.c */
229 void drain_keyboard(void);
230 
231 /* chainboot.c */
232 void chainboot_file(const char *file, enum kernel_type type);
233 
234 #endif /* MENU_H */
235