summaryrefslogtreecommitdiff
path: root/core/fork_server.c
diff options
context:
space:
mode:
authorRoberto De Ioris <roberto@unbit.it>2014-05-12 02:33:41 +0200
committerRoberto De Ioris <roberto@unbit.it>2014-05-12 02:33:41 +0200
commitc94aa42a021b1935122e4b37c5042a09d1bb9ef7 (patch)
treec81f9f80f64438aae2e718fc750e89e2ecb20dff /core/fork_server.c
parentc01d6242adbe03742bd4920663cef2bf69aefcbe (diff)
downloaduwsgi-c94aa42a021b1935122e4b37c5042a09d1bb9ef7.tar.gz
added support for emperor protocol in the fork server
Diffstat (limited to 'core/fork_server.c')
-rw-r--r--core/fork_server.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/core/fork_server.c b/core/fork_server.c
index 232678c4..18beb88c 100644
--- a/core/fork_server.c
+++ b/core/fork_server.c
@@ -33,8 +33,27 @@ void uwsgi_fork_server(char *socket) {
// automatically receive credentials (TODO make something useful with them, like checking the pid is from the Emperor)
if (uwsgi_socket_passcred(fd)) exit(1);
+ // initialize the event queue
+ int eq = event_queue_init();
+ if (uwsgi.has_emperor) {
+ event_queue_add_fd_read(eq, uwsgi.emperor_fd);
+ }
+ event_queue_add_fd_read(eq, fd);
+
// now start waiting for connections
for(;;) {
+ int interesting_fd = -1;
+ int rlen = event_queue_wait(eq, -1, &interesting_fd);
+ if (rlen <= 0) continue;
+ if (uwsgi.has_emperor && interesting_fd == uwsgi.emperor_fd) {
+ char byte;
+ ssize_t rlen = read(uwsgi.emperor_fd, &byte, 1);
+ if (rlen > 0) {
+ uwsgi_log_verbose("received message %d from emperor\n", byte);
+ }
+ exit(0);
+ }
+ if (interesting_fd != fd) continue;
struct sockaddr_un client_src;
socklen_t client_src_len = 0;
int client_fd = accept(fd, (struct sockaddr *) &client_src, &client_src_len);