[syslinux] [PATCH] (vesa)menu.c32: Add support for BLS

Gregory Lee Bartholomew gregory.lee.bartholomew at gmail.com
Sat May 25 13:46:35 PDT 2019


-- 
Gregory Lee Bartholomew
PGP Key ID: 3B67510E

On May 25, 2019 8:41:57 PM UTC, Sebastian Herbszt <herbszt at gmx.de> wrote:
>Gregory Lee Bartholomew wrote:
>> Modern distributions are moving toward a common boot scheme called
>> "The Boot Loader Specification".
>
>Which distributions are using this yet?

Fedora 30

>
>> This patch enables syslinux's
>> (vesa)menu.c32 modules to parse the drop-in files that are defined by
>> this new specification.
>
>Any reason why you don't try to implement this in syslinux core?

Not sure what you mean by core, but I was trying to be minimally intrusive to the existing code.

>
><snip>
>
>> +static int parse_bls1_file(struct blsdata *bd, const char *filename)
>> +{
>> +    FILE *f = NULL;
>> +    char line[MAX_LINE], *p;
>> +    char *sort_field;
>> +
>> +    dprintf("Opening bls entry: %s ", filename);
>> +
>> +    f = fopen(filename, "r");
>> +    dprintf("%s\n", f ? "ok" : "failed");
>> +
>> +    if (!f)
>> +        return -1;
>> +
>> +    refstr_put(bd->filename);
>> +    bd->filename = refstrdup(filename);
>> +
>> +    while (fgets(line, sizeof line, f)) {
>> +        p = strchr(line, '\r');
>> +        if (p)
>> +            *p = '\0';
>> +        p = strchr(line, '\n');
>> +        if (p)
>> +            *p = '\0';
>> +
>> +        p = skipspace(line);
>> +
>> +        if (looking_at(p, "title")) {
>> +            refstr_put(bd->title);
>> +            bd->title = refstrdup(skipspace(p + 5));
>> +        } else if (looking_at(p, "version")) {
>> +            refstr_put(bd->version);
>> +            bd->version = refstrdup(skipspace(p + 7));
>> +            bd->version0 = padver(bd->version);
>> +        } else if (looking_at(p, "machine-id")) {
>> +            refstr_put(bd->machine_id);
>> +            bd->machine_id = refstrdup(skipspace(p + 10));
>> +        } else if (looking_at(p, "linux")) {
>> +            refstr_put(bd->linux_);
>> +            bd->linux_ = refstrdup(skipspace(p + 5));
>> +        } else if (looking_at(p, "initrd")) {
>> +            refstr_put(bd->initrd);
>> +            bd->initrd = refstrdup(skipspace(p + 6));
>
>According to the specification "initrd" may appear more than once.
>
>> +        } else if (looking_at(p, "efi")) {
>> +            refstr_put(bd->efi);
>> +            bd->efi = refstrdup(skipspace(p + 3));
>> +        } else if (looking_at(p, "options")) {
>> +            /* The "options" keyword can be specified multiple times
>> */
>> +            int len = bd->options ? strlen(bd->options) : 0;
>> +            int xlen;
>> +            p = skipspace(p + 7);
>> +            xlen = strlen(p);
>> +            if (len && xlen) {
>> +                /* Grab one space char from the file */
>> +                p--;
>> +                xlen++;
>> +            }
>> +            bd->options = realloc(bd->options, len + xlen + 1);
>> +            memcpy(bd->options + len, p, xlen + 1);
>> +        } else if (looking_at(p, "devicetree")) {
>> +            refstr_put(bd->devicetree);
>> +            bd->devicetree = refstrdup(skipspace(p + 10));
>> +        } else if (looking_at(p, "architecture")) {
>> +            refstr_put(bd->architecture);
>> +            bd->architecture = refstrdup(skipspace(p + 12));
>> +        }
>> +    }
>> +
>> +    fclose(f);
>> +
>> +    p = get_word(bls_sort_by, &sort_field);
>> +    while (sort_field && *sort_field != '\0') {
>> +        const char *sf = NULL;
>> +
>> +        if (looking_at(sort_field, "title")) {
>> +            sf = bd->title;
>> +        } else if (looking_at(sort_field, "version")) {
>> +            sf = bd->version0;
>> +        } else if (looking_at(sort_field, "machine-id")) {
>> +            sf = bd->machine_id;
>> +        }
>> +
>> +        if (sf) {
>> +            bd->sort_field = realloc(
>> +                bd->sort_field,
>> +                strlen(bd->sort_field) + strlen(sf) + 1
>> +            );
>> +            strcat(bd->sort_field, sf);
>> +        }
>> +        p = get_word(skipspace(p), &sort_field);
>> +    }
>> +
>> +    return (bd->linux_ || bd->efi) ? 0 : -1;
>> +}
>
><snip>
>
>> +static int parse_bls1_dir(const char *dirname)
>> +{
>> +    DIR *d = NULL;
>> +    char *filename = NULL;
>> +    struct dirent *de = NULL;
>> +    struct blsdata *nbd = NULL, **bdx = NULL;
>> +    int i, n_bdx = 0, n_bd = 0;
>> +    int rv = -1, fn_len, dn_len;
>> +    struct menu *m = current_menu;
>> +
>> +    if (!*dirname)
>> +        return -1;
>> +
>> +    dprintf("Opening bls entries directory %s ", dirname);
>> +
>> +    d = opendir(dirname);
>> +    dprintf("%s\n", d ? "ok" : "failed");
>> +
>> +    if (!d)
>> +        return -1;
>> +
>> +    dn_len = strlen(dirname);
>> +
>> +    /* Process up to 128 files */
>> +    /* https://wiki.syslinux.org/wiki/
>> +       index.php?title=Syslinux_1_Changelog#Changes_in_1.37 */
>> +    while ((de = readdir(d)) != NULL && n_bd < 128) {
>
>Are you sure this limit is still accurate?
>
>Sebastian



More information about the Syslinux mailing list