2 * Copyright (C) 2009 Sony Computer Entertainment Inc.
3 * Copyright 2009 Sony Corp.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; version 2 of the License.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #if defined(HAVE_CONFIG_H)
27 #include <sys/socket.h>
28 #include <sys/types.h>
32 #include <talloc/talloc.h>
33 #include <waiter/waiter.h>
35 #include "device-handler.h"
37 #include "user-event.h"
41 struct device_handler *handler;
45 static void user_event_print_event(struct event __attribute__((unused)) *event)
47 const char *action, *params[] = {
48 "name", "image", "args",
53 action = event->action == EVENT_ACTION_ADD ? "add" : "remove";
55 pb_log("user_event %s event:\n", action);
56 pb_log("\tdevice: %s\n", event->device);
58 for (i = 0; params[i]; i++)
59 pb_log("\t%-12s => %s\n",
60 params[i], event_get_param(event, params[i]));
63 static void user_event_handle_message(struct user_event *uev, char *buf,
69 event = talloc(uev, struct event);
70 event->type = EVENT_TYPE_USER;
72 result = event_parse_ad_message(event, buf, len);
77 user_event_print_event(event);
78 device_handler_event(uev->handler, event);
84 static int user_event_process(void *arg)
86 struct user_event *uev = arg;
87 char buf[PBOOT_USER_EVENT_SIZE];
90 len = recvfrom(uev->socket, buf, sizeof(buf), 0, NULL, NULL);
93 pb_log("%s: socket read failed: %s", __func__, strerror(errno));
98 pb_log("%s: empty", __func__);
102 pb_log("%s: %u bytes\n", __func__, len);
104 user_event_handle_message(uev, buf, len);
109 static int user_event_destructor(void *arg)
111 struct user_event *uev = arg;
113 pb_log("%s\n", __func__);
115 if (uev->socket >= 0)
121 struct user_event *user_event_init(struct device_handler *handler)
123 struct sockaddr_un addr;
124 struct user_event *uev;
126 unlink(PBOOT_USER_EVENT_SOCKET);
128 uev = talloc(NULL, struct user_event);
130 uev->handler = handler;
132 uev->socket = socket(AF_UNIX, SOCK_DGRAM, 0);
133 if (uev->socket < 0) {
134 pb_log("%s: Error creating event handler socket: %s\n",
135 __func__, strerror(errno));
139 talloc_set_destructor(uev, user_event_destructor);
141 memset(&addr, 0, sizeof(addr));
142 addr.sun_family = AF_UNIX;
143 strcpy(addr.sun_path, PBOOT_USER_EVENT_SOCKET);
145 if (bind(uev->socket, (struct sockaddr *)&addr, sizeof(addr))) {
146 pb_log("Error binding event handler socket: %s\n",
150 waiter_register(uev->socket, WAIT_IN, user_event_process, uev);
152 pb_log("%s: waiting on %s\n", __func__, PBOOT_USER_EVENT_SOCKET);
162 * user_event_trigger - Trigger known user events
164 * SIGUSR1 causes udhcpc to renew the current lease or obtain a new lease.
167 void user_event_trigger(struct user_event __attribute__((unused)) *uev)
172 void user_event_destroy(struct user_event *uev)