petitboot
6 years agodiscover/file: Fix invalid free vs talloc_free
Jeremy Kerr [Fri, 18 Oct 2013 03:34:27 +0000 (11:34 +0800)]
discover/file: Fix invalid free vs talloc_free

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/network: Ensure dns config buffer contains a trailling nul
Jeremy Kerr [Fri, 18 Oct 2013 03:31:57 +0000 (11:31 +0800)]
discover/network: Ensure dns config buffer contains a trailling nul

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/parser: free parsers on exit
Jeremy Kerr [Fri, 18 Oct 2013 05:20:57 +0000 (13:20 +0800)]
discover/parser: free parsers on exit

Allocate parsers against a context, and free that context on exit.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/sysinfo: Fix talloc against uninitialised server var
Jeremy Kerr [Fri, 18 Oct 2013 05:10:58 +0000 (13:10 +0800)]
discover/sysinfo: Fix talloc against uninitialised server var

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Clean lexer.[ch]
Jeremy Kerr [Mon, 21 Oct 2013 03:08:01 +0000 (11:08 +0800)]
discover/grub2: Clean lexer.[ch]

`make distcheck` fails with a couple of failes remaining after clean.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Don't free clients on write failure
Jeremy Kerr [Tue, 15 Oct 2013 02:25:23 +0000 (10:25 +0800)]
discover: Don't free clients on write failure

Currently, if we see an error when writing to a client, we free the
client immediately. This means that any pending reads will be discarded.
Additionally, if a client disconnects before we have finished the writes in
discover_server_process_connection, we won't register the waiter to read
from the socket.

Instead of freeing the client on write failure, this change sets a flag
(se we don't continue to write), and we rely on the read EOF to free the
client. This means we don't drop incoming messages.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Allow an in-progress boot to be cancelled
Jeremy Kerr [Mon, 14 Oct 2013 05:29:31 +0000 (13:29 +0800)]
discover: Allow an in-progress boot to be cancelled

Currently, once the boot() function is called, the boot process will
ignore any cancellations.

This change allows boot() to be cancelled, via boot_cancel().

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Add load_url_cancel
Jeremy Kerr [Mon, 14 Oct 2013 05:10:38 +0000 (13:10 +0800)]
discover: Add load_url_cancel

We'd like a way to cancel pending loads, as part of aborting the boot
process.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Allow URL resources
Jeremy Kerr [Mon, 14 Oct 2013 07:21:14 +0000 (15:21 +0800)]
discover/grub2: Allow URL resources

Allow URL-format specifiers for GRUB2 resources.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agoui/ncurses: Use OK & Cancel buttons for boot editor completion
Jeremy Kerr [Fri, 11 Oct 2013 08:35:09 +0000 (16:35 +0800)]
ui/ncurses: Use OK & Cancel buttons for boot editor completion

Rather than using enter to complete a boot_editor session, add OK and
Cancel buttons. Enter will move between fields.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agoui/ncurses: Use 'x' as exit key
Jeremy Kerr [Fri, 11 Oct 2013 07:16:39 +0000 (15:16 +0800)]
ui/ncurses: Use 'x' as exit key

Because terminals will send escape-sequences starting with escape,
ncurses will pause after receiving a signle escape, to detect
these sequences. This introduces a 1-second delay when exiting the
petitboot UI.

Instead, use 'x'.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agoui/ncurses: Allow booting custom boot options
Jeremy Kerr [Thu, 10 Oct 2013 08:00:17 +0000 (16:00 +0800)]
ui/ncurses: Allow booting custom boot options

Currently, we can't boot user-created boot options, as they have no
option ID associated. This change removes the check for option ID.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agoui/ncurses: Defer item creation until boot editor is done
Jeremy Kerr [Thu, 10 Oct 2013 07:35:35 +0000 (15:35 +0800)]
ui/ncurses: Defer item creation until boot editor is done

Currently, when creating new menu entries, we create an empty item, add
it to the menu, then run the boot editor. This means that cancelling the
edit will leave an empty item in the menu.

This change defers the creation until the boot editor is done. To do
this, we modify the on_open callback to take a menu rather than an item,
and pass NULL boot data to the editor.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agoui/ncurses: Use 'New' instead of 'Open'
Jeremy Kerr [Wed, 9 Oct 2013 13:34:53 +0000 (21:34 +0800)]
ui/ncurses: Use 'New' instead of 'Open'

"Open" is ambiguous in the context of the boot menu; use "new" instead.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Allow device_handler_boot with no option
Jeremy Kerr [Thu, 10 Oct 2013 08:01:42 +0000 (16:01 +0800)]
discover: Allow device_handler_boot with no option

Only call find_boot_option_by_id if we have an ID.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: remove register_parser printf
Jeremy Kerr [Wed, 9 Oct 2013 13:29:06 +0000 (21:29 +0800)]
discover: remove register_parser printf

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agoui/ncurses: Display sysinfo type & identifier
Jeremy Kerr [Wed, 9 Oct 2013 08:48:38 +0000 (16:48 +0800)]
ui/ncurses: Display sysinfo type & identifier

Hook into the sysinfo updates to display the type & id at the top of the
petitboot main menu.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/sysinfo: Add helper script to populate sysinfo identifiers
Jeremy Kerr [Wed, 9 Oct 2013 07:40:42 +0000 (15:40 +0800)]
discover/sysinfo: Add helper script to populate sysinfo identifiers

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agoAdd system info messages
Jeremy Kerr [Wed, 9 Oct 2013 04:02:08 +0000 (12:02 +0800)]
Add system info messages

Add a little infrastructure for communicating information about the
system to the petitboot UIs. We just send some identifying info (type
and identifier), as well as the interfaces.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agoutils/pb-udhcp: Don't add a new option on renew
Jeremy Kerr [Wed, 9 Oct 2013 08:50:22 +0000 (16:50 +0800)]
utils/pb-udhcp: Don't add a new option on renew

Otherwise we'll keep collecting new options every $lease_time period.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/udev: dup property values returned from udev
Jeremy Kerr [Wed, 9 Oct 2013 08:38:56 +0000 (16:38 +0800)]
discover/udev: dup property values returned from udev

The property strings are managed by the udev code, so we need to strdup.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/device-handler: Fix use-after-free when unmounting
Jeremy Kerr [Wed, 9 Oct 2013 08:37:25 +0000 (16:37 +0800)]
discover/device-handler: Fix use-after-free when unmounting

We need to do the rmdir after clearing mount_path.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Don't call config_set_autoboot before config_init
Jeremy Kerr [Wed, 9 Oct 2013 05:19:58 +0000 (13:19 +0800)]
discover: Don't call config_set_autoboot before config_init

Change f611bde3 shifted the config_init until after process_init, as we
need to run processes during config init. We also needed to move the
config_set_autoboot invocation too.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Fix uninitialised yylineno
Jeremy Kerr [Fri, 4 Oct 2013 04:43:58 +0000 (12:43 +0800)]
discover/grub2: Fix uninitialised yylineno

Valgrind reports an invalid usage of an uninitialised var in yyerror,
causing testcase failures.

Initialise lineno before we start parsing.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Implement save_env command
Jeremy Kerr [Fri, 4 Oct 2013 03:10:18 +0000 (11:10 +0800)]
discover/grub2: Implement save_env command

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agotest/parser: Add check_file_contents
Jeremy Kerr [Fri, 4 Oct 2013 03:09:10 +0000 (11:09 +0800)]
test/parser: Add check_file_contents

We want to test grub2's save_env command, which requires a new function
to check the contents of a file.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Implement load_env
Jeremy Kerr [Fri, 27 Sep 2013 06:21:53 +0000 (14:21 +0800)]
discover/grub2: Implement load_env

Use the new parser_request_file API to access the GRUB environment
block.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: strdup strings used in the environment
Jeremy Kerr [Tue, 1 Oct 2013 04:42:57 +0000 (12:42 +0800)]
discover/grub2: strdup strings used in the environment

Use a copy of the name & value pairs that we pass to the environment, as
the data loaded from load_env will be talloc_free-ed.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add default prefix
Jeremy Kerr [Thu, 26 Sep 2013 09:32:47 +0000 (17:32 +0800)]
discover/grub2: Add default prefix

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Add device_{request,release}_write
Jeremy Kerr [Tue, 1 Oct 2013 04:27:35 +0000 (12:27 +0800)]
discover: Add device_{request,release}_write

Add a pair of functions to the parser API to allow write access to the
underlying device. We'll use this in the GRUB2 parser to implement
environment persistence.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Add parser_request_file
Jeremy Kerr [Fri, 27 Sep 2013 06:19:20 +0000 (14:19 +0800)]
discover: Add parser_request_file

Add a function to allow parsers to access files on a local device.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Add test_data member to struct discover_context
Jeremy Kerr [Fri, 27 Sep 2013 06:16:10 +0000 (14:16 +0800)]
discover: Add test_data member to struct discover_context

We have parsers passing discover_contexts around, which we want to hook
into the test framework. Add a void * member, which the test code can
use to reference the test.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Don't continue discovery if mount fails
Jeremy Kerr [Tue, 1 Oct 2013 03:03:48 +0000 (11:03 +0800)]
discover: Don't continue discovery if mount fails

Check the return value from mount_device and abort the discover on
failure.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Allow for already-mounted devices
Jeremy Kerr [Tue, 1 Oct 2013 02:42:04 +0000 (10:42 +0800)]
discover: Allow for already-mounted devices

When we start the discover server, we may find that devices are already
mounted. In this case, mount_device will fail, and we'll abort the
parse.

This change uses /proc/self/mounts to check if new devices are already
mounted, and uses the existing mount point.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Clean up error-handling for grub2 parser & lexer
Jeremy Kerr [Thu, 26 Sep 2013 07:45:58 +0000 (15:45 +0800)]
discover/grub2: Clean up error-handling for grub2 parser & lexer

Rather than printf() & exit(), use the pb logging functions and abort
the parse.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agotest/parser: Enable logging to stdout
Jeremy Kerr [Thu, 26 Sep 2013 07:45:15 +0000 (15:45 +0800)]
test/parser: Enable logging to stdout

We may as well show the logs while testing.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agotests/urls: Run URL tests under valgrind
Jeremy Kerr [Thu, 26 Sep 2013 03:45:39 +0000 (11:45 +0800)]
tests/urls: Run URL tests under valgrind

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/resource: create_url_resource should take ownership of url
Jeremy Kerr [Thu, 26 Sep 2013 03:58:11 +0000 (11:58 +0800)]
discover/resource: create_url_resource should take ownership of url

The URL needs to share the lifetime of resource, so talloc_steal it in
create_url_resource.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agolib/url: talloc from new URL in pb_url_copy
Jeremy Kerr [Thu, 26 Sep 2013 03:44:33 +0000 (11:44 +0800)]
lib/url: talloc from new URL in pb_url_copy

We're ending up with members of new_url being allocated from the old
URL's context. We should be tallocing from the new_url instead.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/paths: Check local file URLs in load_url
Jeremy Kerr [Thu, 26 Sep 2013 07:15:29 +0000 (15:15 +0800)]
discover/paths: Check local file URLs in load_url

Make the error case for local files the same as for remotes.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agolib/system: Don't modify dir parameter to pb_rmdir_recursive
Jeremy Kerr [Thu, 26 Sep 2013 02:32:18 +0000 (10:32 +0800)]
lib/system: Don't modify dir parameter to pb_rmdir_recursive

We're modifying dir rather than cur (the local copy of dir), so the
caller-provided (const!) string is no longer const.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/boot: Log boot status updates
Jeremy Kerr [Wed, 25 Sep 2013 09:04:04 +0000 (17:04 +0800)]
discover/boot: Log boot status updates

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/boot: Download resources in parallel
Jeremy Kerr [Thu, 26 Sep 2013 05:51:10 +0000 (13:51 +0800)]
discover/boot: Download resources in parallel

Now that we can download asynchronously, we can download boot resources
in parallel. This also means we don't need a state machine; we're either
not done (loads are still pending) or done.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Add struct load_url_result and load_task
Jeremy Kerr [Tue, 24 Sep 2013 03:03:11 +0000 (11:03 +0800)]
discover: Add struct load_url_result and load_task

Currently, load_url and load_url_async return a filename parameter and a
tempfile flag (indicating whether the file needs to be cleaned after
use).

Instead, encapsulate this data in a struct load_url_result, which the
caller (and async callbacks) can read the status, filename and clean
parameters.

For internal use in load_url and helpers, we add a struct load_task to
hold a pointer to the load_url_result and async data.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Don't depend on tftp failure for type detection
Jeremy Kerr [Wed, 25 Sep 2013 06:23:39 +0000 (14:23 +0800)]
discover: Don't depend on tftp failure for type detection

Rather than always trying both TFTP client types, do a runtime detection
on first invocation. This can be fixed at build-time with
--with-tftp=TYPE.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/boot: Store clean_* in the boot task
Jeremy Kerr [Tue, 24 Sep 2013 03:04:25 +0000 (11:04 +0800)]
discover/boot: Store clean_* in the boot task

... otherwise we won't clean up local files from earlier boot stages.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/boot: Check for failed loads in boot()
Jeremy Kerr [Tue, 24 Sep 2013 02:58:16 +0000 (10:58 +0800)]
discover/boot: Check for failed loads in boot()

Use the status argument to the URL load callback to check for load
failures.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: load_url_async callback should take an int status
Jeremy Kerr [Tue, 24 Sep 2013 02:39:03 +0000 (10:39 +0800)]
discover: load_url_async callback should take an int status

We don't need a pointer here, just the status value.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/boot: Implement asynchronous boot() process
Neelesh Gupta [Thu, 12 Sep 2013 14:26:32 +0000 (19:56 +0530)]
discover/boot: Implement asynchronous boot() process

The current boot process handled by boot() function is implemented such
that it blocks on the boot resources being downloaded which blocks
the discover process until the download completes. This patch
re-implements the boot() function using callback mechanism and
asynchronous notifications so that boot() returns to continue the
discover process while the download is in progress.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Neelesh Gupta <neelegup@linux.vnet.ibm.com>
6 years agodiscover: Add an asynchronous version of load_url
Neelesh Gupta [Thu, 12 Sep 2013 14:26:54 +0000 (19:56 +0530)]
discover: Add an asynchronous version of load_url

A new load_url_async() function handles retrieving the resources by
forking an external process which currently blocks the parent waiting
for the process to complete. This patch modifies the load_*() functions
to handle it asynchronously by providing the exit callback and returning
without waiting for the child process to exit.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Neelesh Gupta <neelegup@linux.vnet.ibm.com>
6 years agodiscover/grub2: Reimplement default options
Jeremy Kerr [Wed, 25 Sep 2013 00:37:50 +0000 (08:37 +0800)]
discover/grub2: Reimplement default options

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover: Check for devices with duplicate serial properties
Jeremy Kerr [Tue, 24 Sep 2013 09:31:50 +0000 (17:31 +0800)]
discover: Check for devices with duplicate serial properties

If we have multipath devices present in the system, we'll end up with
duplicate mounts, parse results and boot options. This change adds a
check to see if we've encountered a device with this serial number
previously.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agopb-udhcpc: use plain kernel names for dhcp events
Jeremy Kerr [Tue, 24 Sep 2013 09:01:58 +0000 (17:01 +0800)]
pb-udhcpc: use plain kernel names for dhcp events

No need to prefix with /net/

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Fix uninitialised op variable
Jeremy Kerr [Tue, 24 Sep 2013 08:11:43 +0000 (16:11 +0800)]
discover/grub2: Fix uninitialised op variable

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agotest/parser: Add test-grub2-single-line-if test
Jeremy Kerr [Tue, 24 Sep 2013 06:16:38 +0000 (14:16 +0800)]
test/parser: Add test-grub2-single-line-if test

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Support var=value assignments
Jeremy Kerr [Tue, 24 Sep 2013 06:15:59 +0000 (14:15 +0800)]
discover/grub2: Support var=value assignments

We want to allow assignments outside of the 'set' builtin.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agotest/parser: Allow double-quotes in embedded config
Jeremy Kerr [Tue, 24 Sep 2013 06:09:06 +0000 (14:09 +0800)]
test/parser: Allow double-quotes in embedded config

We need to escape any double-quotes.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add true & false builtins
Jeremy Kerr [Tue, 24 Sep 2013 06:08:46 +0000 (14:08 +0800)]
discover/grub2: Add true & false builtins

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agotest/parser: Allow checks for NULL boot_args
Jeremy Kerr [Tue, 24 Sep 2013 06:01:43 +0000 (14:01 +0800)]
test/parser: Allow checks for NULL boot_args

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agotest/parser: Add variable expansion in Ubuntu conf file test
Jeremy Kerr [Tue, 24 Sep 2013 06:00:24 +0000 (14:00 +0800)]
test/parser: Add variable expansion in Ubuntu conf file test

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2/lexer: Require 1+ spaces for a TOKEN_DELIM
Jeremy Kerr [Tue, 24 Sep 2013 05:59:43 +0000 (13:59 +0800)]
discover/grub2/lexer: Require 1+ spaces for a TOKEN_DELIM

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add linux16 command
Jeremy Kerr [Tue, 24 Sep 2013 05:59:24 +0000 (13:59 +0800)]
discover/grub2: Add linux16 command

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Allow both delimiters and EOLs after a "then" reserved word
Jeremy Kerr [Tue, 24 Sep 2013 05:55:57 +0000 (13:55 +0800)]
discover/grub2: Allow both delimiters and EOLs after a "then" reserved word

Putting an if-statement on one line should be possible:

 if true; then echo "true"; else echo "false"; fi

To do this, we'll need to allow both EOLs and TOKEN_DELIM after then and
else.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agotest/parser: Fix spacing in grub2-f18-ppc64 test
Jeremy Kerr [Tue, 24 Sep 2013 05:17:02 +0000 (13:17 +0800)]
test/parser: Fix spacing in grub2-f18-ppc64 test

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Implement test builtin
Jeremy Kerr [Tue, 17 Sep 2013 13:54:38 +0000 (21:54 +0800)]
discover/grub2: Implement test builtin

A faily simple implementation now, and could do with some testing...

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add nops for unnecessary builtins
Jeremy Kerr [Tue, 17 Sep 2013 07:09:41 +0000 (15:09 +0800)]
discover/grub2: Add nops for unnecessary builtins

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Implement statement_block_execute
Jeremy Kerr [Tue, 17 Sep 2013 07:04:19 +0000 (15:04 +0800)]
discover/grub2: Implement statement_block_execute

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: unknown commands should fail
Jeremy Kerr [Tue, 17 Sep 2013 06:51:23 +0000 (14:51 +0800)]
discover/grub2: unknown commands should fail

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Populate option ids
Jeremy Kerr [Tue, 17 Sep 2013 06:51:02 +0000 (14:51 +0800)]
discover/grub2: Populate option ids

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Allow EOF as a statement terminator
Jeremy Kerr [Tue, 17 Sep 2013 06:38:42 +0000 (14:38 +0800)]
discover/grub2: Allow EOF as a statement terminator

Files may not have a trailing newline.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add print_token
Jeremy Kerr [Tue, 17 Sep 2013 06:38:06 +0000 (14:38 +0800)]
discover/grub2: Add print_token

For better trace output.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: fix comment handling
Jeremy Kerr [Tue, 17 Sep 2013 06:36:43 +0000 (14:36 +0800)]
discover/grub2: fix comment handling

Remove '#' from the list of word chars. Also, don't need the '$' char in
the comment regex

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Implement 'elif'
Jeremy Kerr [Tue, 17 Sep 2013 06:35:38 +0000 (14:35 +0800)]
discover/grub2: Implement 'elif'

Rather than just having one conditional in an if statement, we use a
list of conditionals instead. This allows us to implement elif.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Create 'conditional' statements
Jeremy Kerr [Tue, 17 Sep 2013 05:02:05 +0000 (13:02 +0800)]
discover/grub2: Create 'conditional' statements

Rather than holding the condition and conditional-statements in struct
grub2_statment_if, create a new conditional type that contains these. We
can then use this to implement elif statements.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Allow empty statements
Jeremy Kerr [Tue, 17 Sep 2013 03:29:27 +0000 (11:29 +0800)]
discover/grub2: Allow empty statements

Re-arrange the script/statements parse rules to allow empty statements.
We also move the EOL token out of the 'statement' definition, and use
it to separate 'statements'.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Implement submenu
Jeremy Kerr [Tue, 17 Sep 2013 03:14:18 +0000 (11:14 +0800)]
discover/grub2: Implement submenu

Just recurse into the submenu items, as we flatten everything into the
one menu.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add function support
Jeremy Kerr [Tue, 17 Sep 2013 01:36:11 +0000 (09:36 +0800)]
discover/grub2: Add function support

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Improve error handling
Jeremy Kerr [Tue, 17 Sep 2013 01:34:34 +0000 (09:34 +0800)]
discover/grub2: Improve error handling

Only run the script if the parse succeeded, and and improve the
error reporting by enabling verbose errors and line numbers.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Implement 'else' blocks
Jeremy Kerr [Mon, 16 Sep 2013 08:58:30 +0000 (16:58 +0800)]
discover/grub2: Implement 'else' blocks

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Implement 'search' command
Jeremy Kerr [Mon, 16 Sep 2013 08:53:22 +0000 (16:53 +0800)]
discover/grub2: Implement 'search' command

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Implement 'linux' & 'initrd' commands
Jeremy Kerr [Mon, 16 Sep 2013 08:47:17 +0000 (16:47 +0800)]
discover/grub2: Implement 'linux' & 'initrd' commands

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Function infrastructure improvements
Jeremy Kerr [Mon, 16 Sep 2013 08:26:46 +0000 (16:26 +0800)]
discover/grub2: Function infrastructure improvements

For user-defined functions, we'll need a data pointer to the function's
execution callback. Add this as a void *, and change references from
'command' to 'function'.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add option state in menuentry processing
Jeremy Kerr [Mon, 16 Sep 2013 08:02:09 +0000 (16:02 +0800)]
discover/grub2: Add option state in menuentry processing

This will allow menuentry-specific commands to populate boot option
data.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add a reference to the context from grub2_script
Jeremy Kerr [Mon, 16 Sep 2013 07:51:53 +0000 (15:51 +0800)]
discover/grub2: Add a reference to the context from grub2_script

We'll need the context to add boot options.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Hook up flex/bison parser to discover server
Jeremy Kerr [Mon, 16 Sep 2013 07:12:13 +0000 (15:12 +0800)]
discover/grub2: Hook up flex/bison parser to discover server

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Move parser-api definitions to parser.y
Jeremy Kerr [Mon, 16 Sep 2013 06:22:27 +0000 (14:22 +0800)]
discover/grub2: Move parser-api definitions to parser.y

No need for a separate file here.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Implement multiple-arv variable splitting
Jeremy Kerr [Mon, 16 Sep 2013 02:40:21 +0000 (10:40 +0800)]
discover/grub2: Implement multiple-arv variable splitting

If we expand a variable containing word-delimiter chars, we need to
create new argv items.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add initial command execution
Jeremy Kerr [Fri, 13 Sep 2013 08:33:58 +0000 (16:33 +0800)]
discover/grub2: Add initial command execution

.. with a simple 'set' command to update the environment

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add menuentry execution
Jeremy Kerr [Fri, 13 Sep 2013 07:30:58 +0000 (15:30 +0800)]
discover/grub2: Add menuentry execution

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Fix word append
Jeremy Kerr [Fri, 13 Sep 2013 07:25:33 +0000 (15:25 +0800)]
discover/grub2: Fix word append

The parser was setting word->next on the top-level word, resulting in
word chains of a maximum length of 2. Instead, use a last pointer to
always append to the last word.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Handle var tokens in lexer
Jeremy Kerr [Fri, 13 Sep 2013 06:50:19 +0000 (14:50 +0800)]
discover/grub2: Handle var tokens in lexer

Rather than post-processing to expand variables, use the lexer to
identify variable tokens as a type of grub2_word.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Remove debug printfs
Jeremy Kerr [Fri, 13 Sep 2013 05:45:58 +0000 (13:45 +0800)]
discover/grub2: Remove debug printfs

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Initial environment handling
Jeremy Kerr [Fri, 13 Sep 2013 05:40:40 +0000 (13:40 +0800)]
discover/grub2: Initial environment handling

A simple linked-list implementation of string pairs.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add initial execution code
Jeremy Kerr [Fri, 13 Sep 2013 03:53:46 +0000 (11:53 +0800)]
discover/grub2: Add initial execution code

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Fix statement reduce rule
Jeremy Kerr [Fri, 13 Sep 2013 02:09:24 +0000 (10:09 +0800)]
discover/grub2: Fix statement reduce rule

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add var expansion code
Jeremy Kerr [Thu, 12 Sep 2013 10:46:57 +0000 (18:46 +0800)]
discover/grub2: Add var expansion code

Still todo: splitting.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Add initial script infrastructure
Jeremy Kerr [Thu, 12 Sep 2013 08:08:18 +0000 (16:08 +0800)]
discover/grub2: Add initial script infrastructure

Now that we can parse scripts, we want some infrastructure for
execution.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Use subclass-style structs for AST
Jeremy Kerr [Thu, 12 Sep 2013 07:54:36 +0000 (15:54 +0800)]
discover/grub2: Use subclass-style structs for AST

Use embedded 'struct grub2_statement' data to create a subclass-style
syntax tree of statements.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Implement statement blocks
Jeremy Kerr [Thu, 12 Sep 2013 07:03:05 +0000 (15:03 +0800)]
discover/grub2: Implement statement blocks

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
6 years agodiscover/grub2: Implement reduce rules
Jeremy Kerr [Wed, 11 Sep 2013 05:38:25 +0000 (13:38 +0800)]
discover/grub2: Implement reduce rules

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>