[SLOF] [PATCH 2/4] bootmenu: Gather devices and print the menu
Alexey Kardashevskiy
aik at ozlabs.ru
Tue Jun 6 19:20:30 AEST 2017
On 02/06/17 01:25, Thomas Huth wrote:
> Examine the aliases to get a list of possible boot devices
> and print a list with all these devices.
>
> Signed-off-by: Thomas Huth <thuth at redhat.com>
> ---
> lib/libbootmenu/bootmenu.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 86 insertions(+)
>
> diff --git a/lib/libbootmenu/bootmenu.c b/lib/libbootmenu/bootmenu.c
> index d8d00cb..649e518 100644
> --- a/lib/libbootmenu/bootmenu.c
> +++ b/lib/libbootmenu/bootmenu.c
> @@ -14,8 +14,94 @@
>
> #include <string.h>
> #include <stdio.h>
> +#include <stdlib.h>
> +#include <paflof.h>
> #include "bootmenu.h"
>
> +#define MAX_DEVS 36 /* Enough for 10 digits + 26 letters */
> +#define MAX_ALIAS_LEN 8 /* Maximum length of alias names */
> +
> +struct bootdev {
> + char alias[MAX_ALIAS_LEN];
> + char *path;
> +};
> +
> +static int nr_devs;
> +static struct bootdev bootdevs[MAX_DEVS];
> +
> +/**
> + * Look up an alias name.
> + * @return The NUL-terminated device tree path (should be released with free()
> + * when it's not required anymore), or NULL if it can't be found.
> + */
> +static char *find_alias(char *alias)
> +{
> + char *path;
> + long len;
> +
> + forth_push((unsigned long)alias);
> + forth_push(strlen(alias));
> + forth_eval("find-alias");
> +
> + len = forth_pop();
> + if (!len)
> + return NULL;
> +
> + path = malloc(len + 1);
Sometime we do check return from malloc() in SLOF, sometime we do not...
> + memcpy(path, (void *)forth_pop(), len);
> + path[len] = '\0';
> +
> + return path;
> +}
> +
> +static void bootmenu_populate_devs(void)
> +{
> + char *aliases[] = { "cdrom", "disk", "net", NULL };
> + int ai, idx;
> +
> + for (ai = 0; aliases[ai] != NULL; ai++) {
> + for (idx = 0; idx <= 9; idx++) {
> + char *cur_alias = bootdevs[nr_devs].alias;
> + if (idx == 0)
> + strcpy(cur_alias, aliases[ai]);
> + else
> + sprintf(cur_alias, "%s%i", aliases[ai], idx);
> + bootdevs[nr_devs].path = find_alias(cur_alias);
> + if (!bootdevs[nr_devs].path)
> + break;
> + nr_devs += 1;
It is usually nr_devs++ or ++nr_devs, why "+= 1"?
> + }
> + }
> +}
> +
static void bootmenu_populate_devs(void)
{
bootmenu_populate_devs_alias("cdrom");
bootmenu_populate_devs_alias("disk");
bootmenu_populate_devs_alias("net");
}
and add bootmenu_populate_devs_alias() with just a single loop?
> +static void bootmenu_free_devs(void)
> +{
> + while (nr_devs > 0) {
> + nr_devs -= 1;
--nr_devs?
Or even for ( ; nr_devs > 0; --nr_devs) ?
> + free(bootdevs[nr_devs].path);
> + bootdevs[nr_devs].path = NULL;
> + }
> +}
> +
> +static void bootmenu_show_devs(void)
> +{
> + int i;
> +
> + for (i = 0; i < nr_devs; i++) {
> + printf("%c) %6s : %s\n", i < 9 ? '1' + i : 'a' + i - 9,
> + bootdevs[i].alias, bootdevs[i].path);
> + }
> +}
> +
> void bootmenu(void)
> {
> + bootmenu_populate_devs();
> + if (!nr_devs) {
> + puts("No available boot devices!");
> + return;
> + }
> +
> + bootmenu_show_devs();
> +
> + bootmenu_free_devs();
The separation of patches look strange to me - the code above does not make
sense alone (no user input yet) and it is not called anyway until 4/4 but
if afterwards a bug is found in let's say bootmenu_populate_devs() - git
bisest will point to the last patch in the series. Reviewing is not easier
either - I need to find all changes to this function in later patch(es).
I suggest merging them all into a single patch, it is not going to be huge
anyway.
> }
>
--
Alexey
More information about the SLOF
mailing list