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 const char *event_action_name(enum event_action action)
48 case EVENT_ACTION_ADD:
50 case EVENT_ACTION_REMOVE:
52 case EVENT_ACTION_CONF:
61 static void user_event_print_event(struct event __attribute__((unused)) *event)
65 pb_log("user_event %s event:\n", event_action_name(event->action));
66 pb_log("\tdevice: %s\n", event->device);
68 for (i = 0; i < event->n_params; i++)
69 pb_log("\t%-12s => %s\n",
70 event->params[i].name, event->params[i].value);
73 static void user_event_handle_message(struct user_event *uev, char *buf,
79 event = talloc(uev, struct event);
80 event->type = EVENT_TYPE_USER;
82 result = event_parse_ad_message(event, buf, len);
87 user_event_print_event(event);
88 device_handler_event(uev->handler, event);
94 static int user_event_process(void *arg)
96 struct user_event *uev = arg;
97 char buf[PBOOT_USER_EVENT_SIZE];
100 len = recvfrom(uev->socket, buf, sizeof(buf), 0, NULL, NULL);
103 pb_log("%s: socket read failed: %s", __func__, strerror(errno));
108 pb_log("%s: empty", __func__);
112 pb_log("%s: %u bytes\n", __func__, len);
114 user_event_handle_message(uev, buf, len);
119 static int user_event_destructor(void *arg)
121 struct user_event *uev = arg;
123 pb_log("%s\n", __func__);
125 if (uev->socket >= 0)
131 struct user_event *user_event_init(struct waitset *waitset,
132 struct device_handler *handler)
134 struct sockaddr_un addr;
135 struct user_event *uev;
137 unlink(PBOOT_USER_EVENT_SOCKET);
139 uev = talloc(NULL, struct user_event);
141 uev->handler = handler;
143 uev->socket = socket(AF_UNIX, SOCK_DGRAM, 0);
144 if (uev->socket < 0) {
145 pb_log("%s: Error creating event handler socket: %s\n",
146 __func__, strerror(errno));
150 talloc_set_destructor(uev, user_event_destructor);
152 memset(&addr, 0, sizeof(addr));
153 addr.sun_family = AF_UNIX;
154 strcpy(addr.sun_path, PBOOT_USER_EVENT_SOCKET);
156 if (bind(uev->socket, (struct sockaddr *)&addr, sizeof(addr))) {
157 pb_log("Error binding event handler socket: %s\n",
161 waiter_register(waitset, uev->socket, WAIT_IN, user_event_process, uev);
163 pb_log("%s: waiting on %s\n", __func__, PBOOT_USER_EVENT_SOCKET);
173 * user_event_trigger - Trigger known user events
175 * SIGUSR1 causes udhcpc to renew the current lease or obtain a new lease.
178 void user_event_trigger(struct user_event __attribute__((unused)) *uev)
183 void user_event_destroy(struct user_event *uev)