allow passing a socket via emperor proxy

This commit is contained in:
Unbit
2014-09-15 06:04:22 +02:00
parent f4d04b2777
commit 4eef332850
4 changed files with 45 additions and 14 deletions
+41 -12
View File
@@ -2525,17 +2525,38 @@ void uwsgi_check_emperor() {
free(env_emperor_fd);
int i;
for(i=1;i<count;i++) {
uwsgi_log("SOCKET NAME = %s\n", uwsgi_getsockname(fds[i]));
char *env_emperor_fd_config = uwsgi_num2str(fds[i]);
if (setenv("UWSGI_EMPEROR_FD_CONFIG", env_emperor_fd_config, 1)) {
uwsgi_error("uwsgi_check_emperor()/setenv(UWSGI_EMPEROR_FD_CONFIG)");
free(env_emperor_fd_config);
char *socket_name = uwsgi_num2str(fds[i]);
if (!socket_name) {
int j;
for (j = 0; j < count; j++)
close(fds[j]);
goto next;
for (j = 0; j < count; j++)
close(fds[j]);
goto next;
}
if (socket_name[0] != 0) {
// map the socket to fd0
if (fds[i] != 0) {
if (dup2(fds[i], 0) < 0) {
uwsgi_error("uwsgi_check_emperor()/dup2()");
int j;
for (j = 0; j < count; j++)
close(fds[j]);
goto next;
}
close(fds[i]);
}
}
else {
char *env_emperor_fd_config = uwsgi_num2str(fds[i]);
if (setenv("UWSGI_EMPEROR_FD_CONFIG", env_emperor_fd_config, 1)) {
uwsgi_error("uwsgi_check_emperor()/setenv(UWSGI_EMPEROR_FD_CONFIG)");
free(env_emperor_fd_config);
int j;
for (j = 0; j < count; j++)
close(fds[j]);
goto next;
}
free(env_emperor_fd_config);
}
free(env_emperor_fd_config);
}
break;
}
@@ -2700,7 +2721,7 @@ void uwsgi_master_manage_emperor() {
}
void uwsgi_master_manage_emperor_proxy(int server_fd, int emperor_fd, int emperor_fd_config) {
void uwsgi_master_manage_emperor_proxy(int server_fd, int emperor_fd, int emperor_fd_config, int socket_fd) {
struct sockaddr_un epsun;
socklen_t epsun_len = sizeof(struct sockaddr_un);
@@ -2714,6 +2735,8 @@ void uwsgi_master_manage_emperor_proxy(int server_fd, int emperor_fd, int empero
int num_fds = 1;
if (emperor_fd_config > -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) {
+1 -1
View File
@@ -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;
}
+2
View File
@@ -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);
}
+1 -1
View File
@@ -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);