]> git.ozlabs.org Git - petitboot/blobdiff - discover/user-event.c
log: Allow runtime selection of 'debug' log level
[petitboot] / discover / user-event.c
index 11a54df39f2fb6b966cd863f0b9ac431f6a235dc..1f7004509041123091ff85b9234c7e8b08133fed 100644 (file)
@@ -89,9 +89,9 @@ static struct resource *user_event_resource(struct discover_boot_option *opt,
                return NULL;
        }
 
-       boot_file = event_get_param(event, "boot_file");
+       boot_file = event_get_param(event, "bootfile");
        if (!boot_file) {
-               pb_log("%s: boot_file not found\n", __func__);
+               pb_log("%s: bootfile not found\n", __func__);
                return NULL;
        }
 
@@ -208,7 +208,7 @@ static char *parse_mac_addr(struct discover_context *ctx, const char *mac)
                        mac_addr_arr + 2, mac_addr_arr + 3, mac_addr_arr + 4,
                        mac_addr_arr + 5);
 
-       mac_addr = talloc_asprintf(ctx, "01-%02X-%02X-%02X-%02X-%02X-%02X",
+       mac_addr = talloc_asprintf(ctx, "01-%02x-%02x-%02x-%02x-%02x-%02x",
                        mac_addr_arr[0], mac_addr_arr[1], mac_addr_arr[2],
                        mac_addr_arr[3], mac_addr_arr[4], mac_addr_arr[5]);
 
@@ -232,61 +232,83 @@ static char *parse_ip_addr(struct discover_context *ctx, const char *ip)
 struct pb_url *user_event_parse_conf_url(struct discover_context *ctx,
                struct event *event, bool *is_complete)
 {
-       const char *conffile, *host, *bootfile;
+       const char *conffile, *pathprefix, *host, *bootfile;
        char *p, *basedir, *url_str;
        struct pb_url *url;
 
        conffile = event_get_param(event, "pxeconffile");
-       if (conffile) {
-               if (is_url(conffile)) {
-                       url = pb_url_parse(ctx, conffile);
-               } else {
-                       host = parse_host_addr(event);
-                       if (!host) {
-                               pb_log("%s: host address not found\n",
-                                               __func__);
-                               return NULL;
-                       }
-
-                       url_str = talloc_asprintf(ctx, "%s%s/%s", "tftp://",
-                                       host, conffile);
-                       url = pb_url_parse(ctx, url_str);
+       pathprefix = event_get_param(event, "pxepathprefix");
+       bootfile = event_get_param(event, "bootfile");
+
+       /* If we're given a conf file, we're able to generate a complete URL to
+        * the configuration file, and the parser doesn't need to do any
+        * further autodiscovery */
+       *is_complete = !!conffile;
+
+       /* if conffile is a URL, that's all we need */
+       if (conffile && is_url(conffile)) {
+               url = pb_url_parse(ctx, conffile);
+               return url;
+       }
 
+       /* If we can create a URL from pathprefix (optionally with
+        * conffile appended to create a complete URL), use that */
+       if (pathprefix && is_url(pathprefix)) {
+               if (conffile) {
+                       url_str = talloc_asprintf(ctx, "%s%s",
+                                       pathprefix, conffile);
+                       url = pb_url_parse(ctx, url_str);
                        talloc_free(url_str);
+               } else {
+                       url = pb_url_parse(ctx, pathprefix);
                }
 
-               *is_complete = true;
-       } else {
-               host = parse_host_addr(event);
-               if (!host) {
-                       pb_log("%s: host address not found\n", __func__);
-                       return NULL;
-               }
+               return url;
+       }
 
-               bootfile = event_get_param(event, "bootfile");
-               if (!bootfile) {
-                       pb_log("%s: bootfile param not found\n", __func__);
-                       return NULL;
-               }
+       host = parse_host_addr(event);
+       if (!host) {
+               pb_log("%s: host address not found\n", __func__);
+               return NULL;
+       }
+
+       url_str = talloc_asprintf(ctx, "tftp://%s/", host);
+
+       /* if we have a pathprefix, use that directly.. */
+       if (pathprefix) {
+               /* strip leading slashes */
+               while (pathprefix[0] == '/')
+                       pathprefix++;
+               url_str = talloc_asprintf_append(url_str, "%s", pathprefix);
+
+       /* ... otherwise, add a path based on the bootfile name, but only
+        * if conffile isn't an absolute path itself */
+       } else if (bootfile && !(conffile && conffile[0] == '/')) {
 
                basedir = talloc_strdup(ctx, bootfile);
-               p = strchr(basedir, '/');
-               if (p)
-                       *p = '\0';
 
-               if (!strcmp(basedir,"") || !strcmp(basedir, "."))
-                       url_str = talloc_asprintf(ctx, "%s%s/", "tftp://",host);
-               else
-                       url_str = talloc_asprintf(ctx, "%s%s/%s/", "tftp://",host,
-                                       basedir);
+               /* strip filename from the bootfile path, leaving only a
+                * directory */
+               p = strrchr(basedir, '/');
+               if (!p)
+                       p = basedir;
+               *p = '\0';
 
-               url = pb_url_parse(ctx, url_str);
+               if (strlen(basedir))
+                       url_str = talloc_asprintf_append(url_str, "%s/",
+                                       basedir);
 
-               talloc_free(url_str);
                talloc_free(basedir);
-               *is_complete = false;
        }
 
+       /* finally, append conffile */
+       if (conffile)
+               url_str = talloc_asprintf_append(url_str, "%s", conffile);
+
+       url = pb_url_parse(ctx, url_str);
+
+       talloc_free(url_str);
+
        return url;
 }
 
@@ -483,15 +505,15 @@ static int user_event_destructor(void *arg)
        return 0;
 }
 
-struct user_event *user_event_init(struct waitset *waitset,
-               struct device_handler *handler)
+struct user_event *user_event_init(struct device_handler *handler,
+               struct waitset *waitset)
 {
        struct sockaddr_un addr;
        struct user_event *uev;
 
        unlink(PBOOT_USER_EVENT_SOCKET);
 
-       uev = talloc(NULL, struct user_event);
+       uev = talloc(handler, struct user_event);
 
        uev->handler = handler;
 
@@ -524,8 +546,3 @@ out_err:
        talloc_free(uev);
        return NULL;
 }
-
-void user_event_destroy(struct user_event *uev)
-{
-       talloc_free(uev);
-}