diff options
-rw-r--r-- | sapi/fpm/fpm/fpm_sockets.c | 89 | ||||
-rw-r--r-- | sapi/fpm/fpm/fpm_sockets.h | 3 |
2 files changed, 69 insertions, 23 deletions
diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c index f16bdfb938..9a81ca5ee7 100644 --- a/sapi/fpm/fpm/fpm_sockets.c +++ b/sapi/fpm/fpm/fpm_sockets.c @@ -44,6 +44,10 @@ enum { FPM_GET_USE_SOCKET = 1, FPM_STORE_SOCKET = 2, FPM_STORE_USE_SOCKET = 3 }; static void fpm_sockets_cleanup(int which, void *arg) /* {{{ */ { unsigned i; + unsigned socket_set_count = 0; + unsigned socket_set[FPM_ENV_SOCKET_SET_MAX]; + unsigned socket_set_buf = 0; + char envname[32]; char *env_value = 0; int p = 0; struct listening_socket_s *ls = sockets_list.data; @@ -54,8 +58,20 @@ static void fpm_sockets_cleanup(int which, void *arg) /* {{{ */ } else { /* on PARENT EXEC we want socket fds to be inherited through environment variable */ char fd[32]; sprintf(fd, "%d", ls->sock); - env_value = realloc(env_value, p + (p ? 1 : 0) + strlen(ls->key) + 1 + strlen(fd) + 1); - p += sprintf(env_value + p, "%s%s=%s", p ? "," : "", ls->key, fd); + + socket_set_buf = (i % FPM_ENV_SOCKET_SET_SIZE == 0 && i) ? 1 : 0; + env_value = realloc(env_value, p + (p ? 1 : 0) + strlen(ls->key) + 1 + strlen(fd) + socket_set_buf + 1); + + if (i % FPM_ENV_SOCKET_SET_SIZE == 0) { + socket_set[socket_set_count] = p + socket_set_buf; + socket_set_count++; + if (i) { + *(env_value + p + 1) = 0; + } + } + + p += sprintf(env_value + p + socket_set_buf, "%s%s=%s", (p && !socket_set_buf) ? "," : "", ls->key, fd); + p += socket_set_buf; } if (which == FPM_CLEANUP_PARENT_EXIT_MAIN) { @@ -67,7 +83,14 @@ static void fpm_sockets_cleanup(int which, void *arg) /* {{{ */ } if (env_value) { - setenv("FPM_SOCKETS", env_value, 1); + for (i = 0; i < socket_set_count; i++) { + if (!i) { + strcpy(envname, "FPM_SOCKETS"); + } else { + sprintf(envname, "FPM_SOCKETS_%d", i); + } + setenv(envname, env_value + socket_set[i], 1); + } free(env_value); } @@ -352,7 +375,9 @@ int fpm_sockets_init_main() /* {{{ */ { unsigned i, lq_len; struct fpm_worker_pool_s *wp; - char *inherited = getenv("FPM_SOCKETS"); + char sockname[32]; + char sockpath[256]; + char *inherited; struct listening_socket_s *ls; if (0 == fpm_array_init(&sockets_list, sizeof(struct listening_socket_s), 10)) { @@ -360,28 +385,46 @@ int fpm_sockets_init_main() /* {{{ */ } /* import inherited sockets */ - while (inherited && *inherited) { - char *comma = strchr(inherited, ','); - int type, fd_no; - char *eq; - - if (comma) { - *comma = '\0'; + for (i = 0; i < FPM_ENV_SOCKET_SET_MAX; i++) { + if (!i) { + strcpy(sockname, "FPM_SOCKETS"); + } else { + sprintf(sockname, "FPM_SOCKETS_%d", i); } - - eq = strchr(inherited, '='); - if (eq) { - *eq = '\0'; - fd_no = atoi(eq + 1); - type = fpm_sockets_domain_from_address(inherited); - zlog(ZLOG_NOTICE, "using inherited socket fd=%d, \"%s\"", fd_no, inherited); - fpm_sockets_hash_op(fd_no, 0, inherited, type, FPM_STORE_SOCKET); + inherited = getenv(sockname); + if (!inherited) { + break; } - if (comma) { - inherited = comma + 1; - } else { - inherited = 0; + while (inherited && *inherited) { + char *comma = strchr(inherited, ','); + int type, fd_no; + char *eq; + + if (comma) { + *comma = '\0'; + } + + eq = strchr(inherited, '='); + if (eq) { + int sockpath_len = eq - inherited; + if (sockpath_len > 255) { + /* this should never happen as UDS limit is lower */ + sockpath_len = 255; + } + memcpy(sockpath, inherited, sockpath_len); + sockpath[sockpath_len] = '\0'; + fd_no = atoi(eq + 1); + type = fpm_sockets_domain_from_address(sockpath); + zlog(ZLOG_NOTICE, "using inherited socket fd=%d, \"%s\"", fd_no, sockpath); + fpm_sockets_hash_op(fd_no, 0, sockpath, type, FPM_STORE_SOCKET); + } + + if (comma) { + inherited = comma + 1; + } else { + inherited = 0; + } } } diff --git a/sapi/fpm/fpm/fpm_sockets.h b/sapi/fpm/fpm/fpm_sockets.h index 64dc7bab2c..98b40ff206 100644 --- a/sapi/fpm/fpm/fpm_sockets.h +++ b/sapi/fpm/fpm/fpm_sockets.h @@ -22,6 +22,9 @@ #define FPM_BACKLOG_DEFAULT 511 #endif +#define FPM_ENV_SOCKET_SET_MAX 256 +#define FPM_ENV_SOCKET_SET_SIZE 128 + enum fpm_address_domain fpm_sockets_domain_from_address(char *addr); int fpm_sockets_init_main(); int fpm_socket_get_listening_queue(int sock, unsigned *cur_lq, unsigned *max_lq); |