discover: extend URL in UI to support auto-discovery
[petitboot] / discover / user-event.c
index dc671d948fb04aa28c80c56caabebda01da3d0f4..8926458905ef2b076b965270b31a5adefbb6fa77 100644 (file)
@@ -54,6 +54,8 @@ static const char *event_action_name(enum event_action action)
                return "add";
        case EVENT_ACTION_REMOVE:
                return "remove";
+       case EVENT_ACTION_URL:
+               return "url";
        case EVENT_ACTION_DHCP:
                return "dhcp";
        default:
@@ -208,7 +210,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]);
 
@@ -290,8 +292,9 @@ struct pb_url *user_event_parse_conf_url(struct discover_context *ctx,
                /* strip filename from the bootfile path, leaving only a
                 * directory */
                p = strrchr(basedir, '/');
-               if (p)
-                       *p = '\0';
+               if (!p)
+                       p = basedir;
+               *p = '\0';
 
                if (strlen(basedir))
                        url_str = talloc_asprintf_append(url_str, "%s/",
@@ -429,6 +432,18 @@ static int user_event_remove(struct user_event *uev, struct event *event)
        return 0;
 }
 
+static int user_event_url(struct user_event *uev, struct event *event)
+{
+       struct device_handler *handler = uev->handler;
+       const char *url;
+
+       url = event_get_param(event, "url");
+       if (url)
+               device_handler_process_url(handler, url, NULL, NULL);
+
+       return 0;
+}
+
 static void user_event_handle_message(struct user_event *uev, char *buf,
        int len)
 {
@@ -452,6 +467,9 @@ static void user_event_handle_message(struct user_event *uev, char *buf,
        case EVENT_ACTION_REMOVE:
                result = user_event_remove(uev, event);
                break;
+       case EVENT_ACTION_URL:
+               result = user_event_url(uev, event);
+               break;
        case EVENT_ACTION_CONF:
                result = user_event_conf(uev, event);
                break;
@@ -470,10 +488,10 @@ static void user_event_handle_message(struct user_event *uev, char *buf,
 static int user_event_process(void *arg)
 {
        struct user_event *uev = arg;
-       char buf[PBOOT_USER_EVENT_SIZE];
+       char buf[PBOOT_USER_EVENT_SIZE + 1];
        int len;
 
-       len = recvfrom(uev->socket, buf, sizeof(buf), 0, NULL, NULL);
+       len = recvfrom(uev->socket, buf, PBOOT_USER_EVENT_SIZE, 0, NULL, NULL);
 
        if (len < 0) {
                pb_log("%s: socket read failed: %s", __func__, strerror(errno));
@@ -485,6 +503,8 @@ static int user_event_process(void *arg)
                return 0;
        }
 
+       buf[len] = '\0';
+
        pb_debug("%s: %u bytes\n", __func__, len);
 
        user_event_handle_message(uev, buf, len);
@@ -504,15 +524,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;
 
@@ -545,8 +565,3 @@ out_err:
        talloc_free(uev);
        return NULL;
 }
-
-void user_event_destroy(struct user_event *uev)
-{
-       talloc_free(uev);
-}