diff --git a/core/emperor.c b/core/emperor.c index 5bec9c04..404c95d8 100644 --- a/core/emperor.c +++ b/core/emperor.c @@ -2525,17 +2525,38 @@ void uwsgi_check_emperor() { free(env_emperor_fd); int i; for(i=1;i -1) num_fds++; + if (socket_fd > -1) + num_fds++; struct msghdr ep_msg; void *ep_msg_control = uwsgi_malloc(CMSG_SPACE(sizeof(int) * num_fds)); @@ -2743,8 +2766,14 @@ void uwsgi_master_manage_emperor_proxy(int server_fd, int emperor_fd, int empero unsigned char *ep_fd_ptr = CMSG_DATA(cmsg); memcpy(ep_fd_ptr, &emperor_fd, sizeof(int)); - if (num_fds > 1) { - memcpy(ep_fd_ptr + sizeof(int), &emperor_fd_config, sizeof(int)); + if (emperor_fd_config > -1) { + ep_fd_ptr += sizeof(int); + memcpy(ep_fd_ptr, &emperor_fd_config, sizeof(int)); + } + + if (socket_fd > -1) { + ep_fd_ptr += sizeof(int); + memcpy(ep_fd_ptr, &socket_fd, sizeof(int)); } if (sendmsg(ep_client, &ep_msg, 0) < 0) { diff --git a/core/master_events.c b/core/master_events.c index 8d4f3980..a8bec0fa 100644 --- a/core/master_events.c +++ b/core/master_events.c @@ -45,7 +45,7 @@ int uwsgi_master_manage_events(int interesting_fd) { // emperor event ? if (uwsgi.has_emperor) { if (uwsgi.emperor_fd_proxy > -1 && interesting_fd == uwsgi.emperor_fd_proxy) { - uwsgi_master_manage_emperor_proxy(uwsgi.emperor_fd_proxy, uwsgi.emperor_fd, uwsgi.emperor_fd_config); + uwsgi_master_manage_emperor_proxy(uwsgi.emperor_fd_proxy, uwsgi.emperor_fd, uwsgi.emperor_fd_config, -1); return 0; } diff --git a/core/socket.c b/core/socket.c index cbce4ecd..d649c7ab 100644 --- a/core/socket.c +++ b/core/socket.c @@ -51,6 +51,8 @@ char *uwsgi_getsockname(int fd) { if (!getsockname(fd, gsa.sa, &socket_type_len)) { if (gsa.sa->sa_family == AF_UNIX) { + // unnamed socket ? + if (socket_type_len == sizeof(sa_family_t)) return ""; if (usa.sa_un.sun_path[0] == 0) { return uwsgi_concat2("@", usa.sa_un.sun_path + 1); } diff --git a/uwsgi.h b/uwsgi.h index 57e97108..cc746596 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -4674,7 +4674,7 @@ void uwsgi_go_cheap(); char **uwsgi_split_quoted(char *, size_t, char *, size_t *); -void uwsgi_master_manage_emperor_proxy(int, int, int); +void uwsgi_master_manage_emperor_proxy(int, int, int, int); struct uwsgi_string_list *uwsgi_register_scheme(char *, char * (*)(char *, size_t *, int)); void uwsgi_setup_schemes(void);