summaryrefslogtreecommitdiffstats
path: root/discover/parser.c
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2008-12-15 15:22:34 +1100
committerJeremy Kerr <jk@ozlabs.org>2008-12-15 15:22:34 +1100
commit32e6a41f33e5576716b351bd473a27939fe94fa1 (patch)
tree0d6b75ac0a02d2496416095405cb9498777c3beb /discover/parser.c
parent000a92b4fa909c432732ac3ed8f28eeeaeac70ee (diff)
downloadtalos-petitboot-32e6a41f33e5576716b351bd473a27939fe94fa1.tar.gz
talos-petitboot-32e6a41f33e5576716b351bd473a27939fe94fa1.zip
Initial support for multiple UIs
Move the device discovery code from separate udev helpers to a single process to listen on two sockets: one SOCK_DGRAM for incoming udev events, and one SOCK_STREAM for UIs to connect. Initial support for client/server infrastructure, still need to wire-up the udev messages. Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/parser.c')
-rw-r--r--discover/parser.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/discover/parser.c b/discover/parser.c
new file mode 100644
index 0000000..5e50dcb
--- /dev/null
+++ b/discover/parser.c
@@ -0,0 +1,85 @@
+
+#include <petitboot-paths.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "parser.h"
+
+extern struct parser native_parser;
+extern struct parser yaboot_parser;
+extern struct parser kboot_parser;
+
+/* array of parsers, ordered by priority */
+static struct parser *parsers[] = {
+ &native_parser,
+ &yaboot_parser,
+ &kboot_parser,
+ NULL
+};
+
+void iterate_parsers(const char *devpath, const char *mountpoint)
+{
+ int i;
+
+ pb_log("trying parsers for %s\n", devpath);
+
+ for (i = 0; parsers[i]; i++) {
+ pb_log("\ttrying parser '%s'\n", parsers[i]->name);
+ /* just use a dummy device path for now */
+ if (parsers[i]->parse(devpath))
+ return;
+ }
+ pb_log("\tno boot_options found\n");
+}
+
+/* convenience functions for parsers */
+void free_device(struct device *dev)
+{
+ if (!dev)
+ return;
+ if (dev->id)
+ free(dev->id);
+ if (dev->name)
+ free(dev->name);
+ if (dev->description)
+ free(dev->description);
+ if (dev->icon_file)
+ free(dev->icon_file);
+ free(dev);
+}
+
+void free_boot_option(struct boot_option *opt)
+{
+ if (!opt)
+ return;
+ if (opt->name)
+ free(opt->name);
+ if (opt->description)
+ free(opt->description);
+ if (opt->icon_file)
+ free(opt->icon_file);
+ if (opt->boot_image_file)
+ free(opt->boot_image_file);
+ if (opt->initrd_file)
+ free(opt->initrd_file);
+ if (opt->boot_args)
+ free(opt->boot_args);
+ free(opt);
+}
+
+const char *generic_icon_file(enum generic_icon_type type)
+{
+ switch (type) {
+ case ICON_TYPE_DISK:
+ return artwork_pathname("hdd.png");
+ case ICON_TYPE_USB:
+ return artwork_pathname("usbpen.png");
+ case ICON_TYPE_OPTICAL:
+ return artwork_pathname("cdrom.png");
+ case ICON_TYPE_NETWORK:
+ case ICON_TYPE_UNKNOWN:
+ break;
+ }
+ return artwork_pathname("hdd.png");
+}
+
OpenPOWER on IntegriCloud