]> git.ozlabs.org Git - petitboot/blob - discover/parser.c
87241a9cdb2e60b98913791b81eae86f371d08f3
[petitboot] / discover / parser.c
1
2 #include <stdlib.h>
3
4 #include "pb-protocol/pb-protocol.h"
5
6 #include "device-handler.h"
7 #include "log.h"
8 #include "parser.h"
9 #include "parser-utils.h"
10
11 extern struct parser __start_parsers[], __stop_parsers[];
12
13 void iterate_parsers(struct discover_context *ctx)
14 {
15         struct parser *parser;
16
17         pb_log("trying parsers for %s\n", ctx->device_path);
18
19         for (parser = __start_parsers; parser < __stop_parsers; parser++) {
20                 pb_log("\ttrying parser '%s'\n", parser->name);
21                 /* just use a dummy device path for now */
22                 if (parser->parse(ctx))
23                         return;
24         }
25         pb_log("\tno boot_options found\n");
26 }
27
28 static int compare_parsers(const void *a, const void *b)
29 {
30         const struct parser *parser_a = a, *parser_b = b;
31
32         if (parser_a->priority > parser_b->priority)
33                 return -1;
34
35         if (parser_a->priority < parser_b->priority)
36                 return 1;
37
38         return 0;
39 }
40
41 void parser_init(void)
42 {
43         /* sort our parsers into descending priority order */
44         qsort(__start_parsers, __stop_parsers - __start_parsers,
45                         sizeof(struct parser), compare_parsers);
46 }