diff options
author | Jerome Loyet <fat@php.net> | 2012-05-25 21:22:54 +0200 |
---|---|---|
committer | Jerome Loyet <fat@php.net> | 2012-05-25 21:22:54 +0200 |
commit | d90003b5491c576ab28c3999c8f3121d6c0d06f1 (patch) | |
tree | 7576a96a8cc289a6e1a51ae95a9df8d130d19cd3 | |
parent | c2f33fb1293cbcdc94daefb8583ca13e98b5c826 (diff) | |
download | php-git-d90003b5491c576ab28c3999c8f3121d6c0d06f1.tar.gz |
- Fixed bug #62153 (when using unix sockets, multiples FPM instances can be launched without errors)
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | sapi/fpm/fpm/fpm_sockets.c | 25 | ||||
-rw-r--r-- | sapi/fpm/fpm/fpm_sockets.h | 1 |
3 files changed, 28 insertions, 0 deletions
@@ -63,6 +63,8 @@ PHP NEWS . Fixed bug #61026 (FPM pools can listen on the same address). (fat) . Fixed bug #62033 (php-fpm exits with status 0 on some failures to start). (fat) + . Fixed bug #62153 (when using unix sockets, multiples FPM instances + can be launched without errors). (fat) - Intl . ResourceBundle constructor now accepts NULL for the first two arguments. diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c index cb4897e9b4..d24dcccc9a 100644 --- a/sapi/fpm/fpm/fpm_sockets.c +++ b/sapi/fpm/fpm/fpm_sockets.c @@ -179,6 +179,10 @@ static int fpm_sockets_new_listening_socket(struct fpm_worker_pool_s *wp, struct setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flags, sizeof(flags)); if (wp->listen_address_domain == FPM_AF_UNIX) { + if (fpm_socket_unix_test_connect((struct sockaddr_un *)sa, socklen) == 0) { + zlog(ZLOG_ERROR, "An another FPM instance seems to already listen on %s", ((struct sockaddr_un *) sa)->sun_path); + return -1; + } unlink( ((struct sockaddr_un *) sa)->sun_path); saved_umask = umask(0777 ^ wp->socket_mode); } @@ -450,3 +454,24 @@ int fpm_socket_get_listening_queue(int sock, unsigned *cur_lq, unsigned *max_lq) } #endif + +int fpm_socket_unix_test_connect(struct sockaddr_un *sun, size_t socklen) /* {{{ */ +{ + int fd; + + if (!sun || sun->sun_family != AF_UNIX) { + return -1; + } + + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { + return -1; + } + + if (connect(fd, (struct sockaddr *)sun, socklen) == -1) { + return -1; + } + + close(fd); + return 0; +} +/* }}} */ diff --git a/sapi/fpm/fpm/fpm_sockets.h b/sapi/fpm/fpm/fpm_sockets.h index 447fbff4b2..b7ff0b2296 100644 --- a/sapi/fpm/fpm/fpm_sockets.h +++ b/sapi/fpm/fpm/fpm_sockets.h @@ -22,6 +22,7 @@ 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); +int fpm_socket_unix_test_connect(struct sockaddr_un *sun, size_t socklen); static inline int fd_set_blocked(int fd, int blocked) /* {{{ */ |