diff --git a/master.c b/master.c index 684e2335..7bb70098 100644 --- a/master.c +++ b/master.c @@ -48,6 +48,12 @@ void master_loop(char **argv, char **environ) { int udp_managed = 0; int rlen; int udp_fd = -1 ; + + char *cluster_opt_buf = NULL; + int cluster_opt_size = 4; + char *cptrbuf; + uint16_t ustrlen; + struct uwsgi_header *uh; #endif int i,j; @@ -85,6 +91,35 @@ void master_loop(char **argv, char **environ) { uwsgi_poll[uwsgi_poll_size].fd = uwsgi.cluster_fd; uwsgi_poll[uwsgi_poll_size].events = POLLIN; uwsgi_poll_size++; + + for(i=0;ikey); + cluster_opt_size += 2+strlen(uwsgi.exported_opts[i]->value); + } + + cluster_opt_buf = malloc(cluster_opt_size); + + uh = (struct uwsgi_header *) cluster_opt_buf; + + uh->modifier1 = 99; + uh->pktsize = cluster_opt_size - 4; + uh->modifier2 = 1; + + cptrbuf = cluster_opt_buf+4; + + for(i=0;ikey); + *cptrbuf++ = (uint8_t) (ustrlen & 0xff); + *cptrbuf++ = (uint8_t) ((ustrlen >>8) & 0xff); + memcpy(cptrbuf, uwsgi.exported_opts[i]->key, ustrlen); + cptrbuf+=ustrlen; + + ustrlen = strlen(uwsgi.exported_opts[i]->value); + *cptrbuf++ = (uint8_t) (ustrlen & 0xff); + *cptrbuf++ = (uint8_t) ((ustrlen >>8) & 0xff); + memcpy(cptrbuf, uwsgi.exported_opts[i]->value, ustrlen); + cptrbuf+=ustrlen; + } } #endif #endif @@ -284,7 +319,15 @@ void master_loop(char **argv, char **environ) { } if (uwsgi_poll[i].fd == uwsgi.cluster_fd) { - uwsgi_log("received a cluster message\n"); + + if (uwsgi_get_dgram(uwsgi.cluster_fd, uwsgi.wsgi_requests[0])) { + continue; + } + + if (uwsgi.wsgi_requests[0]->uh.modifier1 == 99) { + uwsgi_log("requested configuration data\n"); + send(uwsgi.cluster_fd, cluster_opt_buf, cluster_opt_size, 0); + } } } } diff --git a/protocol.c b/protocol.c index caeb5e4a..4c0dc857 100644 --- a/protocol.c +++ b/protocol.c @@ -596,6 +596,52 @@ ssize_t uwsgi_send_empty_pkt(int fd, char *socket_name, uint8_t modifier1, uint8 return ret; } +int uwsgi_get_dgram(int fd, struct wsgi_request *wsgi_req) { + + ssize_t rlen; + struct uwsgi_header *uh; + static char *buffer = NULL; + + if (!buffer) { + buffer = malloc(uwsgi.buffer_size + 4); + if (!buffer) { + uwsgi_error("malloc()"); + exit(1); + } + } + + + rlen = read(fd, buffer, uwsgi.buffer_size + 4); + + if (rlen < 0) { + uwsgi_error("read()"); + return -1; + } + + if (rlen < 4) { + uwsgi_log("invalid uwsgi packet\n"); + return -1; + } + + uh = (struct uwsgi_header *) buffer; + + wsgi_req->uh.modifier1 = uh->modifier1; + wsgi_req->uh.pktsize = uh->pktsize; + wsgi_req->uh.modifier2 = uh->modifier2; + + if (wsgi_req->uh.pktsize > uwsgi.buffer_size) { + uwsgi_log("invalid uwsgi packet size, probably you need to increase buffer size\n"); + return -1; + } + + wsgi_req->buffer = buffer+4; + + uwsgi_log("request received %d %d\n", wsgi_req->uh.modifier1, wsgi_req->uh.modifier2); + + return 0; + +} + int uwsgi_hooked_parse_dict_dgram(int fd, char *buffer, size_t len, uint8_t modifier1, uint8_t modifier2, void (*hook)()) { struct uwsgi_header *uh; diff --git a/uwsgi.h b/uwsgi.h index 542003fe..8e5a1238 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -1155,3 +1155,5 @@ int uwsgi_waitfd(int, int); int uwsgi_hooked_parse_dict_dgram(int, char *, size_t, uint8_t, uint8_t, void (*)()); void manage_string_opt(char *, int, char*, int); + +int uwsgi_get_dgram(int, struct wsgi_request *);