summaryrefslogtreecommitdiff
path: root/sapi
diff options
context:
space:
mode:
authorJerome Loyet <fat@php.net>2012-05-25 19:22:54 (GMT)
committerJerome Loyet <fat@php.net>2012-05-25 19:22:54 (GMT)
commitd90003b5491c576ab28c3999c8f3121d6c0d06f1 (patch)
tree7576a96a8cc289a6e1a51ae95a9df8d130d19cd3 /sapi
parentc2f33fb1293cbcdc94daefb8583ca13e98b5c826 (diff)
downloadphp-d90003b5491c576ab28c3999c8f3121d6c0d06f1.tar.gz
- Fixed bug #62153 (when using unix sockets, multiples FPM instances can be launched without errors)
Diffstat (limited to 'sapi')
-rw-r--r--sapi/fpm/fpm/fpm_sockets.c25
-rw-r--r--sapi/fpm/fpm/fpm_sockets.h1
2 files changed, 26 insertions, 0 deletions
diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c
index cb4897e..d24dccc 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 447fbff..b7ff0b2 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) /* {{{ */