All those EAI things, where are they coming from? They don't exist in
Windows (apparently)
At 13:48 13/1/2001, Stig Venaas wrote:
>venaas Sat Jan 13 03:48:47 2001 EDT
>
> Modified files:
> /php4 configure.in
> /php4/main network.c
> Log:
> Simplified code a bit, added detailed error reporting, and fixed a bug
> when getaddrinfo returned a non-IP family before IP families
>
>
>Index: php4/configure.in
>diff -u php4/configure.in:1.209 php4/configure.in:1.210
>--- php4/configure.in:1.209 Tue Jan 9 17:34:40 2001
>+++ php4/configure.in Sat Jan 13 03:48:47 2001
>@@ -1,4 +1,4 @@
>-dnl ## $Id: configure.in,v 1.209 2001/01/10 01:34:40 ssb Exp $ -*- sh -*-
>+dnl ## $Id: configure.in,v 1.210 2001/01/13 11:48:47 venaas Exp $ -*- sh -*-
> dnl ## Process this file with autoconf to produce a configure script.
>
> divert(1)
>@@ -356,6 +356,7 @@
> ctime_r \
> cuserid \
> flock \
>+gai_strerror \
> gcvt \
> getlogin \
> gethostbyaddr \
>Index: php4/main/network.c
>diff -u php4/main/network.c:1.10 php4/main/network.c:1.11
>--- php4/main/network.c:1.10 Thu Oct 19 05:18:02 2000
>+++ php4/main/network.c Sat Jan 13 03:48:47 2001
>@@ -15,7 +15,7 @@
> | Authors: Stig Venaas <[EMAIL PROTECTED]> |
> +----------------------------------------------------------------------+
> */
>-/* $Id: network.c,v 1.10 2000/10/19 12:18:02 venaas Exp $ */
>+/* $Id: network.c,v 1.11 2001/01/13 11:48:47 venaas Exp $ */
>
> #include "php.h"
>
>@@ -59,6 +59,44 @@
> # define SOCK_CONN_ERR -1
> #endif
>
>+#ifdef HAVE_GAI_STRERROR
>+# define PHP_GAI_STRERROR(x) (gai_strerror(x))
>+#else
>+# define PHP_GAI_STRERROR(x) (php_gai_strerror(x))
>+static char *php_gai_strerror(int code) {
>+ static struct {
>+ int code;
>+ const char *msg;
>+ } values[] = {
>+# ifdef EAI_ADDRFAMILY
>+ {EAI_ADDRFAMILY, "Address family for hostname not
>supported"},
>+# endif
>+ {EAI_AGAIN, "Temporary failure in name resolution"},
>+ {EAI_BADFLAGS, "Bad value for ai_flags"},
>+ {EAI_FAIL, "Non-recoverable failure in name resolution"},
>+ {EAI_FAMILY, "ai_family not supported"},
>+ {EAI_MEMORY, "Memory allocation failure"},
>+# ifdef EAI_NODATA
>+ {EAI_NODATA, "No address associated with hostname"},
>+# endif
>+ {EAI_NONAME, "Name or service not known"},
>+ {EAI_SERVICE, "Servname not supported for ai_socktype"},
>+ {EAI_SOCKTYPE, "ai_socktype not supported"},
>+ {EAI_SYSTEM, "System error"},
>+ {0, NULL}
>+ };
>+ int i;
>+
>+ for (i = 0; values[i].msg != NULL; i++) {
>+ if (values[i].code == code) {
>+ return (char *)values[i].msg;
>+ }
>+ }
>+
>+ return "Unknown error";
>+}
>+#endif
>+
> static void php_network_freeaddresses(struct sockaddr **sal)
> {
> struct sockaddr **sap;
>@@ -73,53 +111,47 @@
> static int php_network_getaddresses(const char *host, struct sockaddr
> ***sal)
> {
> struct sockaddr **sap;
>-
>- if (host != NULL) {
>+
>+ if (host == NULL) {
>+ return -1;
>+ }
>+
>+ {
> #ifdef HAVE_GETADDRINFO
>- struct addrinfo hints, *res, *sai;
>+ struct addrinfo hints, *res, *sai;
> int n;
>
>- memset( &hints, '\0', sizeof(hints) );
>- hints.ai_family = AF_UNSPEC;
>- if (getaddrinfo(host, NULL, &hints, &res))
>- return -1;
>- sai = res;
>- for (n=2; (sai = sai->ai_next) != NULL; n++);
>- *sal = emalloc(n * sizeof(*sal));
>- if (*sal == NULL)
>+ memset(&hints, '\0', sizeof(hints));
>+ hints.ai_family = AF_UNSPEC;
>+ if (n = getaddrinfo(host, NULL, &hints, &res)) {
>+ php_error(E_WARNING, "php_network_getaddresses:
>getaddrinfo failed: %s", PHP_GAI_STRERROR(n));
> return -1;
>+ }
>
>- sai = res;
>+ sai = res;
>+ for (n=2; (sai = sai->ai_next) != NULL; n++);
>+ *sal = emalloc(n * sizeof(*sal));
>+ sai = res;
> sap = *sal;
>- do {
>- switch (sai->ai_family) {
>+ do {
>+ switch (sai->ai_family) {
> # ifdef HAVE_IPV6
>- case AF_INET6: {
>+ case AF_INET6:
> *sap = emalloc(sizeof(struct sockaddr_in6));
>- if (*sap == NULL) {
>- freeaddrinfo(res);
>- goto errexit;
>- }
> *(struct sockaddr_in6 *)*sap =
> *((struct sockaddr_in6
> *)sai->ai_addr);
>- } break;
>+ sap++;
>+ break;
> # endif
>- case AF_INET: {
>+ case AF_INET:
> *sap = emalloc(sizeof(struct sockaddr_in));
>- if (*sap == NULL) {
>- freeaddrinfo(res);
>- goto errexit;
>- }
> *(struct sockaddr_in *)*sap =
> *((struct sockaddr_in
> *)sai->ai_addr);
>- } break;
>- default:
>- *sap = NULL;
>+ sap++;
> break;
>- }
>- sap++;
>- } while ((sai = sai->ai_next) != NULL);
>- freeaddrinfo(res);
>+ }
>+ } while ((sai = sai->ai_next) != NULL);
>+ freeaddrinfo(res);
> #else
> struct hostent *host_info;
> struct in_addr in;
>@@ -127,29 +159,23 @@
> if (!inet_aton(host, &in)) {
> /* XXX NOT THREAD SAFE */
> host_info = gethostbyname(host);
>- if (host_info == NULL)
>+ if (host_info == NULL) {
>+ php_error(E_WARNING,
>"php_network_getaddresses: gethostbyname failed");
> return -1;
>+ }
> in = *((struct in_addr *) host_info->h_addr);
> }
>
> *sal = emalloc(2 * sizeof(*sal));
>- if (*sal == NULL)
>- return -1;
> sap = *sal;
> *sap = emalloc(sizeof(struct sockaddr_in));
>- if (*sap == NULL)
>- goto errexit;
>-
> (*sap)->sa_family = AF_INET;
> ((struct sockaddr_in *)*sap)->sin_addr = in;
> sap++;
> #endif
>- *sap = NULL;
>- return 0;
>- errexit:
>- php_network_freeaddresses(*sal);
>- }
>- return -1;
>+ }
>+ *sap = NULL;
>+ return 0;
> }
>
> /*
>@@ -199,6 +225,7 @@
> sal++;
> }
> php_network_freeaddresses(psal);
>+ php_error(E_WARNING, "php_hostconnect: connect failed");
> return -1;
>
> ok:
>
>
>
>--
>PHP CVS Mailing List (http://www.php.net/)
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>To contact the list administrators, e-mail: [EMAIL PROTECTED]
--
Zeev Suraski <[EMAIL PROTECTED]>
CTO & co-founder, Zend Technologies Ltd. http://www.zend.com/
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]