Module Name: src
Committed By: roy
Date: Wed Jan 20 17:03:35 UTC 2016
Modified Files:
src/external/bsd/wpa/dist/hostapd: hostapd_cli.c main.c
src/external/bsd/wpa/dist/src/utils: eloop.c eloop.h
src/external/bsd/wpa/dist/wpa_supplicant: wpa_cli.c wpa_supplicant.c
Log Message:
Re-queue kqueue events after forking.
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/external/bsd/wpa/dist/hostapd/hostapd_cli.c
cvs rdiff -u -r1.1.1.5 -r1.2 src/external/bsd/wpa/dist/hostapd/main.c
cvs rdiff -u -r1.8 -r1.9 src/external/bsd/wpa/dist/src/utils/eloop.c
cvs rdiff -u -r1.1.1.4 -r1.2 src/external/bsd/wpa/dist/src/utils/eloop.h
cvs rdiff -u -r1.7 -r1.8 src/external/bsd/wpa/dist/wpa_supplicant/wpa_cli.c
cvs rdiff -u -r1.3 -r1.4 \
src/external/bsd/wpa/dist/wpa_supplicant/wpa_supplicant.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/bsd/wpa/dist/hostapd/hostapd_cli.c
diff -u src/external/bsd/wpa/dist/hostapd/hostapd_cli.c:1.7 src/external/bsd/wpa/dist/hostapd/hostapd_cli.c:1.8
--- src/external/bsd/wpa/dist/hostapd/hostapd_cli.c:1.7 Wed Apr 1 19:45:14 2015
+++ src/external/bsd/wpa/dist/hostapd/hostapd_cli.c Wed Jan 20 17:03:35 2016
@@ -1375,7 +1375,7 @@ int main(int argc, char *argv[])
}
}
- if (daemonize && os_daemonize(pid_file))
+ if (daemonize && os_daemonize(pid_file) && eloop_sock_requeue())
return -1;
if (interactive)
Index: src/external/bsd/wpa/dist/hostapd/main.c
diff -u src/external/bsd/wpa/dist/hostapd/main.c:1.1.1.5 src/external/bsd/wpa/dist/hostapd/main.c:1.2
--- src/external/bsd/wpa/dist/hostapd/main.c:1.1.1.5 Wed Apr 1 19:24:48 2015
+++ src/external/bsd/wpa/dist/hostapd/main.c Wed Jan 20 17:03:35 2016
@@ -407,9 +407,16 @@ static int hostapd_global_run(struct hap
}
#endif /* EAP_SERVER_TNC */
- if (daemonize && os_daemonize(pid_file)) {
- wpa_printf(MSG_ERROR, "daemon: %s", strerror(errno));
- return -1;
+ if (daemonize) {
+ if (os_daemonize(pid_file)) {
+ wpa_printf(MSG_ERROR, "daemon: %s", strerror(errno));
+ return -1;
+ }
+ if (eloop_sock_requeue()) {
+ wpa_printf(MSG_ERROR, "eloop_sock_requeue: %s",
+ strerror(errno));
+ return -1;
+ }
}
eloop_run();
Index: src/external/bsd/wpa/dist/src/utils/eloop.c
diff -u src/external/bsd/wpa/dist/src/utils/eloop.c:1.8 src/external/bsd/wpa/dist/src/utils/eloop.c:1.9
--- src/external/bsd/wpa/dist/src/utils/eloop.c:1.8 Wed Jan 20 15:26:13 2016
+++ src/external/bsd/wpa/dist/src/utils/eloop.c Wed Jan 20 17:03:35 2016
@@ -169,9 +169,6 @@ int eloop_init(void)
__func__, strerror(errno));
return -1;
}
- eloop.readers.type = EVENT_TYPE_READ;
- eloop.writers.type = EVENT_TYPE_WRITE;
- eloop.exceptions.type = EVENT_TYPE_EXCEPTION;
#endif /* CONFIG_ELOOP_EPOLL */
#ifdef CONFIG_ELOOP_KQUEUE
eloop.kqueuefd = kqueue();
@@ -181,26 +178,85 @@ int eloop_init(void)
return -1;
}
#endif /* CONFIG_ELOOP_KQUEUE */
+#if defined(CONFIG_ELOOP_EPOLL) || defined(CONFIG_ELOOP_KQUEUE)
+ eloop.readers.type = EVENT_TYPE_READ;
+ eloop.writers.type = EVENT_TYPE_WRITE;
+ eloop.exceptions.type = EVENT_TYPE_EXCEPTION;
+#endif
#ifdef WPA_TRACE
signal(SIGSEGV, eloop_sigsegv_handler);
#endif /* WPA_TRACE */
return 0;
}
+#ifdef CONFIG_ELOOP_EPOLL
+static int eloop_sock_queue(int sock, eloop_event_type type)
+{
+ struct epoll_event ev;
+
+ os_memset(&ev, 0, sizeof(ev));
+ switch (type) {
+ case EVENT_TYPE_READ:
+ ev.events = EPOLLIN;
+ break;
+ case EVENT_TYPE_WRITE:
+ ev.events = EPOLLOUT;
+ break;
+ /*
+ * Exceptions are always checked when using epoll, but I suppose it's
+ * possible that someone registered a socket *only* for exception
+ * handling.
+ */
+ case EVENT_TYPE_EXCEPTION:
+ ev.events = EPOLLERR | EPOLLHUP;
+ break;
+ }
+ ev.data.fd = sock;
+ if (epoll_ctl(eloop.epollfd, EPOLL_CTL_ADD, sock, &ev) < 0) {
+ wpa_printf(MSG_ERROR, "%s: epoll_ctl(ADD) for fd=%d "
+ "failed. %s\n", __func__, sock, strerror(errno));
+ return -1;
+ }
+ return 0;
+}
+#endif /* CONFIG_ELOOP_EPOLL */
+
+#ifdef CONFIG_ELOOP_KQUEUE
+static int eloop_sock_queue(int sock, eloop_event_type type)
+{
+ int filter;
+ struct kevent ke;
+
+ switch (type) {
+ case EVENT_TYPE_READ:
+ filter = EVFILT_READ;
+ break;
+ case EVENT_TYPE_WRITE:
+ filter = EVFILT_WRITE;
+ break;
+ default:
+ filter = 0;
+ }
+ EV_SET(&ke, sock, filter, EV_ADD, 0, 0, NULL);
+ if (kevent(eloop.kqueuefd, &ke, 1, NULL, 0, NULL) == -1) {
+ wpa_printf(MSG_ERROR, "%s: kevent(ADD) for fd=%d "
+ "failed. %s\n", __func__, sock, strerror(errno));
+ return -1;
+ }
+ return 0;
+}
+#endif /* CONFIG_ELOOP_KQUEUE */
static int eloop_sock_table_add_sock(struct eloop_sock_table *table,
int sock, eloop_sock_handler handler,
void *eloop_data, void *user_data)
{
#ifdef CONFIG_ELOOP_EPOLL
- struct eloop_sock *temp_table;
- struct epoll_event ev, *temp_events;
- int next;
+ struct epoll_event *temp_events;
#endif /* CONFIG_ELOOP_EPOLL */
-#ifdef CONFIG_ELOOP_KQUEUE
+#if defined(CONFIG_ELOOP_EPOLL) || defined(CONFIG_ELOOP_KQUEUE)
struct eloop_sock *temp_table;
- int next, filter;
- struct kevent ke;
+ int next;
#endif
struct eloop_sock *tmp;
int new_max_sock;
@@ -302,53 +358,12 @@ static int eloop_sock_table_add_sock(str
table->changed = 1;
eloop_trace_sock_add_ref(table);
-#ifdef CONFIG_ELOOP_EPOLL
- os_memset(&ev, 0, sizeof(ev));
- switch (table->type) {
- case EVENT_TYPE_READ:
- ev.events = EPOLLIN;
- break;
- case EVENT_TYPE_WRITE:
- ev.events = EPOLLOUT;
- break;
- /*
- * Exceptions are always checked when using epoll, but I suppose it's
- * possible that someone registered a socket *only* for exception
- * handling.
- */
- case EVENT_TYPE_EXCEPTION:
- ev.events = EPOLLERR | EPOLLHUP;
- break;
- }
- ev.data.fd = sock;
- if (epoll_ctl(eloop.epollfd, EPOLL_CTL_ADD, sock, &ev) < 0) {
- wpa_printf(MSG_ERROR, "%s: epoll_ctl(ADD) for fd=%d "
- "failed. %s\n", __func__, sock, strerror(errno));
- return -1;
- }
- os_memcpy(&eloop.fd_table[sock], &table->table[table->count - 1],
- sizeof(struct eloop_sock));
-#endif /* CONFIG_ELOOP_EPOLL */
-#ifdef CONFIG_ELOOP_KQUEUE
- switch (table->type) {
- case EVENT_TYPE_READ:
- filter = EVFILT_READ;
- break;
- case EVENT_TYPE_WRITE:
- filter = EVFILT_WRITE;
- break;
- default:
- filter = 0;
- }
- EV_SET(&ke, sock, filter, EV_ADD, 0, 0, NULL);
- if (kevent(eloop.kqueuefd, &ke, 1, NULL, 0, NULL) == -1) {
- wpa_printf(MSG_ERROR, "%s: kevent(ADD) for fd=%d "
- "failed. %s\n", __func__, sock, strerror(errno));
+#if defined(CONFIG_ELOOP_EPOLL) || defined(CONFIG_ELOOP_KQUEUE)
+ if (eloop_sock_queue(sock, table->type) == -1)
return -1;
- }
os_memcpy(&eloop.fd_table[sock], &table->table[table->count - 1],
sizeof(struct eloop_sock));
-#endif /* CONFIG_ELOOP_KQUEUE */
+#endif
return 0;
}
@@ -621,7 +636,48 @@ static void eloop_sock_table_dispatch(st
break;
}
}
-#endif /* CONFIG_ELOOP_KQUEUE */
+
+static int eloop_sock_table_requeue(struct eloop_sock_table *table)
+{
+ int i, r;
+ struct kevent ke;
+
+ r = 0;
+ for (i = 0; i < table->count && table->table; i++) {
+ if (eloop_sock_queue(table->table[i].sock, table->type) == -1)
+ r = -1;
+ }
+ return r;
+}
+
+int eloop_sock_requeue(void)
+{
+ int r = 0;
+
+ close(eloop.kqueuefd);
+ eloop.kqueuefd = kqueue();
+ if (eloop.kqueuefd < 0) {
+ wpa_printf(MSG_ERROR, "%s: kqueue failed. %s\n",
+ __func__, strerror(errno));
+ return -1;
+ }
+
+ if (eloop_sock_table_requeue(&eloop.readers) == -1)
+ r = -1;
+ if (eloop_sock_table_requeue(&eloop.writers) == -1)
+ r = -1;
+ if (eloop_sock_table_requeue(&eloop.exceptions) == -1)
+ r = -1;
+
+ return r;
+}
+#else /* CONFIG_ELOOP_KQUEUE */
+int eloop_sock_requeue(void)
+{
+
+ return 0;
+}
+#endif /* !CONFIG_ELOOP_KQUEUE */
static void eloop_sock_table_destroy(struct eloop_sock_table *table)
{
Index: src/external/bsd/wpa/dist/src/utils/eloop.h
diff -u src/external/bsd/wpa/dist/src/utils/eloop.h:1.1.1.4 src/external/bsd/wpa/dist/src/utils/eloop.h:1.2
--- src/external/bsd/wpa/dist/src/utils/eloop.h:1.1.1.4 Thu Oct 16 19:16:08 2014
+++ src/external/bsd/wpa/dist/src/utils/eloop.h Wed Jan 20 17:03:35 2016
@@ -313,6 +313,14 @@ int eloop_register_signal_reconfig(eloop
void *user_data);
/**
+ * eloop_sock_requeue - Requeue sockets
+ *
+ * Requeue sockets after forking because some implementations require this,
+ * such as epoll and kqueue.
+ */
+int eloop_sock_requeue(void);
+
+/**
* eloop_run - Start the event loop
*
* Start the event loop and continue running as long as there are any
Index: src/external/bsd/wpa/dist/wpa_supplicant/wpa_cli.c
diff -u src/external/bsd/wpa/dist/wpa_supplicant/wpa_cli.c:1.7 src/external/bsd/wpa/dist/wpa_supplicant/wpa_cli.c:1.8
--- src/external/bsd/wpa/dist/wpa_supplicant/wpa_cli.c:1.7 Fri Aug 28 13:05:13 2015
+++ src/external/bsd/wpa/dist/wpa_supplicant/wpa_cli.c Wed Jan 20 17:03:35 2016
@@ -4085,7 +4085,7 @@ int main(int argc, char *argv[])
}
}
- if (daemonize && os_daemonize(pid_file))
+ if (daemonize && os_daemonize(pid_file) && eloop_sock_requeue())
return -1;
if (action_file)
Index: src/external/bsd/wpa/dist/wpa_supplicant/wpa_supplicant.c
diff -u src/external/bsd/wpa/dist/wpa_supplicant/wpa_supplicant.c:1.3 src/external/bsd/wpa/dist/wpa_supplicant/wpa_supplicant.c:1.4
--- src/external/bsd/wpa/dist/wpa_supplicant/wpa_supplicant.c:1.3 Wed Apr 1 19:45:15 2015
+++ src/external/bsd/wpa/dist/wpa_supplicant/wpa_supplicant.c Wed Jan 20 17:03:35 2016
@@ -4630,7 +4630,8 @@ int wpa_supplicant_run(struct wpa_global
struct wpa_supplicant *wpa_s;
if (global->params.daemonize &&
- wpa_supplicant_daemon(global->params.pid_file))
+ (wpa_supplicant_daemon(global->params.pid_file) ||
+ eloop_sock_requeue()))
return -1;
if (global->params.wait_for_monitor) {