{EAI_MEMORY, "Memory allocation failure"},
# ifdef EAI_NODATA
{EAI_NODATA, "No address associated with hostname"},
-# endif
+# endif
{EAI_NONAME, "Name or service not known"},
{EAI_SERVICE, "Servname not supported for ai_socktype"},
{EAI_SOCKTYPE, "ai_socktype not supported"},
return (char *)values[i].msg;
}
}
-
+
return "Unknown error";
}
/* }}} */
}
#if HAVE_GETADDRINFO
memset(&hints, '\0', sizeof(hints));
-
+
hints.ai_family = AF_INET; /* default to regular inet (see below) */
hints.ai_socktype = socktype;
-
+
# if HAVE_IPV6
/* probe for a working IPv6 stack; even if detected as having v6 at compile
* time, at runtime some stacks are slow to resolve or have other issues
sai = res;
for (n = 1; (sai = sai->ai_next) != NULL; n++)
;
-
+
*sal = safe_emalloc((n + 1), sizeof(*sal), 0);
sai = res;
sap = *sal;
-
+
do {
*sap = emalloc(sai->ai_addrlen);
memcpy(*sap, sai->ai_addr, sai->ai_addrlen);
sap++;
} while ((sai = sai->ai_next) != NULL);
-
+
freeaddrinfo(res);
#else
if (!inet_aton(host, &in)) {
int ret = 0;
SET_SOCKET_BLOCKING_MODE(sockfd, orig_flags);
-
+
if ((n = connect(sockfd, addr, addrlen)) != 0) {
error = php_socket_errno();
if (sa) {
/* attempt to bind */
-
+
#ifdef SO_REUSEADDR
{
int val = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&val, sizeof(val));
}
#endif
-
+
n = bind(sock, sa, socklen);
if (n != SOCK_CONN_ERR) {
if (error_string) {
*error_string = php_socket_strerror(err, NULL, 0);
}
-
+
bound:
php_network_freeaddresses(psal);
-
+
return sock;
-
+
}
/* }}} */
/* generally not thread safe, but it *is* thread safe under win32 */
buf = inet_ntoa(((struct sockaddr_in*)sa)->sin_addr);
if (buf) {
- *textaddrlen = spprintf(textaddr, 0, "%s:%d",
+ *textaddrlen = spprintf(textaddr, 0, "%s:%d",
buf, ntohs(((struct sockaddr_in*)sa)->sin_port));
}
case AF_INET6:
buf = (char*)inet_ntop(sa->sa_family, &((struct sockaddr_in6*)sa)->sin6_addr, (char *)&abuf, sizeof(abuf));
if (buf) {
- *textaddrlen = spprintf(textaddr, 0, "%s:%d",
+ *textaddrlen = spprintf(textaddr, 0, "%s:%d",
buf, ntohs(((struct sockaddr_in6*)sa)->sin6_port));
}
}
}
-PHPAPI int php_network_get_peer_name(php_socket_t sock,
+PHPAPI int php_network_get_peer_name(php_socket_t sock,
char **textaddr, long *textaddrlen,
struct sockaddr **addr,
socklen_t *addrlen
php_sockaddr_storage sa;
socklen_t sl = sizeof(sa);
memset(&sa, 0, sizeof(sa));
-
+
if (getpeername(sock, (struct sockaddr*)&sa, &sl) == 0) {
php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl,
textaddr, textaddrlen,
return -1;
}
-PHPAPI int php_network_get_sock_name(php_socket_t sock,
+PHPAPI int php_network_get_sock_name(php_socket_t sock,
char **textaddr, long *textaddrlen,
struct sockaddr **addr,
socklen_t *addrlen
php_sockaddr_storage sa;
socklen_t sl = sizeof(sa);
memset(&sa, 0, sizeof(sa));
-
+
if (getsockname(sock, (struct sockaddr*)&sa, &sl) == 0) {
php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl,
textaddr, textaddrlen,
int error = 0, n;
php_sockaddr_storage sa;
socklen_t sl;
-
+
n = php_pollfd_for(srvsock, PHP_POLLREADABLE, timeout);
if (n == 0) {
error = php_socket_errno();
}
}
-
+
if (error_code) {
*error_code = error;
}
if (error_string) {
*error_string = php_socket_strerror(error, NULL, 0);
}
-
+
return clisock;
}
/* }}} */
-
+
/* Connect to a remote host using an interruptible connect with optional timeout.
/* {{{ php_network_connect_socket_to_host */
php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short port,
int socktype, int asynchronous, struct timeval *timeout, char **error_string,
- int *error_code, char *bindto, unsigned short bindport
+ int *error_code, char *bindto, unsigned short bindport
TSRMLS_DC)
{
int num_addrs, n, fatal = 0;
local_address = (struct sockaddr*)in4;
local_address_len = sizeof(struct sockaddr_in);
-
+
in4->sin_family = sa->sa_family;
in4->sin_port = htons(bindport);
if (!inet_aton(bindto, &in4->sin_addr)) {
local_address = (struct sockaddr*)in6;
local_address_len = sizeof(struct sockaddr_in6);
-
+
in6->sin6_family = sa->sa_family;
in6->sin6_port = htons(bindport);
if (inet_pton(AF_INET6, bindto, &in6->sin6_addr) < 1) {
efree(*error_string);
*error_string = NULL;
}
-
+
n = php_network_connect_socket(sock, sa, socklen, asynchronous,
timeout ? &working_timeout : NULL,
error_string, error_code);
connected:
php_network_freeaddresses(psal);
-
+
return sock;
}
/* }}} */
int free_it = 1;
if (!FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
flags = !block;
if (ioctlsocket(socketd, FIONBIO, &flags) == SOCKET_ERROR) {
char *error_string;
-
+
error_string = php_socket_strerror(WSAGetLastError(), NULL, 0);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", error_string);
efree(error_string);