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) {

Reply via email to