mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-08-19 03:57:21 +00:00
allow passing a socket via emperor proxy
This commit is contained in:
+41
-12
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user