diff options
author | H. Peter Anvin <hpa@zytor.com> | 2008-02-22 11:16:45 -0800 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2008-02-22 11:16:45 -0800 |
commit | 6152d7affa392c8233b527b5800299f0b38246f0 (patch) | |
tree | fdf9d85e539e7b7f40181ae7947fcc7ab2eead39 /com32 | |
parent | 44e9cab0e6bc5a7a75d8470e7a4ba41d739f4a37 (diff) | |
download | syslinux-3.62-pre15.tar.gz |
Allow MENU EXIT to specify a menu tagsyslinux-3.62-pre15
Allow MENU EXIT to "exit" to an arbitrary menu. This is really just a
variant of "MENU GOTO", but it allows displaying an exit marker.
Diffstat (limited to 'com32')
-rw-r--r-- | com32/menu/menu.h | 3 | ||||
-rw-r--r-- | com32/menu/readconfig.c | 18 |
2 files changed, 17 insertions, 4 deletions
diff --git a/com32/menu/menu.h b/com32/menu/menu.h index b1a98a27..b8c28687 100644 --- a/com32/menu/menu.h +++ b/com32/menu/menu.h @@ -34,6 +34,8 @@ struct menu; +/* Note: the _UNRES variants must always be immediately after their + "normal" versions. */ enum menu_action { MA_NONE, /* Undefined value */ MA_CMD, /* Execute a command */ @@ -43,6 +45,7 @@ enum menu_action { MA_GOTO_UNRES, /* Unresolved go to */ MA_QUIT, /* Quit to CLI */ MA_EXIT, /* Exit to higher-level menu */ + MA_EXIT_UNRES, /* Unresolved exit */ }; struct menu_entry { diff --git a/com32/menu/readconfig.c b/com32/menu/readconfig.c index 65e230d5..10201938 100644 --- a/com32/menu/readconfig.c +++ b/com32/menu/readconfig.c @@ -348,6 +348,7 @@ record(struct menu *m, struct labeldata *ld, const char *append) break; case MA_GOTO_UNRES: + case MA_EXIT_UNRES: me->cmdline = refstr_get(ld->kernel); break; @@ -763,9 +764,17 @@ static void parse_config_file(FILE *f) ld.kernel = refstrdup(skipspace(p+4)); } } else if ( looking_at(p, "exit") ) { + p = skipspace(p+4); if (ld.label && m->parent) { - ld.action = MA_EXIT; - ld.submenu = m->parent; + if (*p) { + /* This is really just a goto, except for the marker */ + ld.action = MA_EXIT_UNRES; + refstr_put(ld.kernel); + ld.kernel = refstrdup(p); + } else { + ld.action = MA_EXIT; + ld.submenu = m->parent; + } } } else if ( looking_at(p, "start") ) { start_menu = m; @@ -912,13 +921,14 @@ static void resolve_gotos(void) struct menu *m; for (me = all_entries; me; me = me->next) { - if (me->action == MA_GOTO_UNRES) { + if (me->action == MA_GOTO_UNRES || + me->action == MA_EXIT_UNRES) { m = find_menu(me->cmdline); refstr_put(me->cmdline); me->cmdline = NULL; if (m) { me->submenu = m; - me->action = MA_GOTO; + me->action--; /* Drop the _UNRES */ } else { me->action = MA_DISABLED; } |