#include <assert.h>
+#include <string.h>
+#include <i18n/i18n.h>
#include <talloc/talloc.h>
+#include <url/url.h>
#include <discover/resource.h>
#include <discover/parser.h>
#include <discover/parser-utils.h>
#include "grub2.h"
-#include "parser.h"
-#include "lexer.h"
static const char *const grub2_conf_files[] = {
"/grub.cfg",
"/boot/grub/grub.cfg",
"/boot/grub2/grub.cfg",
"/boot/grub/menu.lst",
+ "/efi/boot/grub.cfg",
"/GRUB.CFG",
"/MENU.LST",
"/GRUB/GRUB.CFG",
"/GRUB/MENU.LST",
"/BOOT/GRUB/GRUB.CFG",
"/BOOT/GRUB/MENU.LST",
+ "/EFI/BOOT/GRUB.CFG",
NULL
};
};
/* we use slightly different resources for grub2 */
-struct resource *create_grub2_resource(void *ctx,
+struct resource *create_grub2_resource(struct discover_boot_option *opt,
struct discover_device *orig_device,
const char *root, const char *path)
{
struct grub2_resource_info *info;
struct resource *res;
- res = talloc(ctx, struct resource);
+ if (strstr(path, "://")) {
+ struct pb_url *url = pb_url_parse(opt, path);
+ if (url)
+ return create_url_resource(opt, url);
+ }
+
+ res = talloc(opt, struct resource);
if (root) {
info = talloc(res, struct grub2_resource_info);
return true;
}
-static int grub2_parse(struct discover_context *dc, char *buf, int len)
+static int grub2_parse(struct discover_context *dc)
{
+ const char * const *filename;
struct grub2_parser *parser;
-
- parser = grub2_parser_create(dc);
-
- grub2_parser_parse(parser, buf, len);
-
- talloc_free(parser);
-
- return 1;
+ int len, rc;
+ char *buf;
+
+ /* Support block device boot only at present */
+ if (dc->event)
+ return -1;
+
+ for (filename = grub2_conf_files; *filename; filename++) {
+ rc = parser_request_file(dc, dc->device, *filename, &buf, &len);
+ if (rc)
+ continue;
+
+ parser = grub2_parser_create(dc);
+ grub2_parser_parse(parser, *filename, buf, len);
+ device_handler_status_dev_info(dc->handler, dc->device,
+ _("Parsed GRUB configuration from %s"),
+ *filename);
+ talloc_free(buf);
+ talloc_free(parser);
+ break;
+ }
+
+
+ return 0;
}
static struct parser grub2_parser = {
.name = "grub2",
- .method = CONF_METHOD_LOCAL_FILE,
.parse = grub2_parse,
- .filenames = grub2_conf_files,
.resolve_resource = resolve_grub2_resource,
};