[syslinux] [PATCH] (vesa)menu.c32: Add support for BLS
Sebastian Herbszt
herbszt at gmx.de
Sat May 25 13:41:57 PDT 2019
Gregory Lee Bartholomew wrote:
> Modern distributions are moving toward a common boot scheme called
> "The Boot Loader Specification".
Which distributions are using this yet?
> 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?
<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