+static void handle_button_timeout(struct uloop_timeout *t)
+{
+ struct button_timeout *b;
+ char seen[16];
+
+ b = container_of(t, struct button_timeout, timeout);
+ blob_buf_init(&button_buf, 0);
+ blobmsg_add_string(&button_buf, "ACTION", "timeout");
+ snprintf(seen, sizeof(seen), "%d", b->seen);
+ blobmsg_add_string(&button_buf, "SEEN", seen);
+ queue_add(&handlers[HANDLER_EXEC], button_buf.head, b->data);
+ button_free(b);
+}
+
+static void handle_button_complete(struct blob_attr *msg, struct blob_attr *data, int ret)
+{
+ char *name = hotplug_msg_find_var(msg, "BUTTON");
+ struct button_timeout *b;
+ int timeout = ret >> 8;
+
+ if (!timeout)
+ return;
+
+ b = malloc(sizeof(*b));
+ if (!b || !name)
+ return;
+
+ memset(b, 0, sizeof(*b));
+
+ b->data = malloc(blob_pad_len(data));
+ b->name = strdup(name);
+ b->seen = timeout;
+
+ memcpy(b->data, data, blob_pad_len(data));
+ b->timeout.cb = handle_button_timeout;
+
+ uloop_timeout_set(&b->timeout, timeout * 1000);
+ list_add(&b->list, &button_timer);
+}
+