summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSascha Schumann <sas@php.net>2002-09-23 00:49:12 +0000
committerSascha Schumann <sas@php.net>2002-09-23 00:49:12 +0000
commit625e7b202bee50d4d2689e23e326aef1f94f08b4 (patch)
tree8d0d1202c6ba391063c0b5e88b46ae6cacc86a13
parent1664a7c18fdbbfc79042b9f15e92ae1455a82729 (diff)
downloadphp-git-625e7b202bee50d4d2689e23e326aef1f94f08b4.tar.gz
Use generic getnameinfo for address-to-name translation, if available.
This adds support for IPv6 addresses.
-rw-r--r--sapi/thttpd/thttpd.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/sapi/thttpd/thttpd.c b/sapi/thttpd/thttpd.c
index 896b4d7161..0b66836e19 100644
--- a/sapi/thttpd/thttpd.c
+++ b/sapi/thttpd/thttpd.c
@@ -34,6 +34,11 @@
#include <stdlib.h>
#include <unistd.h>
+#ifdef HAVE_GETNAMEINFO
+#include <sys/socket.h>
+#include <netdb.h>
+#endif
+
typedef struct {
httpd_conn *hc;
int read_post_data;
@@ -277,6 +282,7 @@ static void sapi_thttpd_register_variables(zval *track_vars_array TSRMLS_DC)
{
char buf[BUF_SIZE + 1];
char *p;
+ int sa_len;
php_register_variable("PHP_SELF", SG(request_info).request_uri, track_vars_array TSRMLS_CC);
php_register_variable("SERVER_SOFTWARE", SERVER_SOFTWARE, track_vars_array TSRMLS_CC);
@@ -290,11 +296,22 @@ static void sapi_thttpd_register_variables(zval *track_vars_array TSRMLS_DC)
} else {
php_register_variable("SERVER_PROTOCOL", "HTTP/1.0", track_vars_array TSRMLS_CC);
}
-
+
+#ifdef HAVE_GETNAMEINFO
+ switch (TG(hc)->client_addr.sa.sa_family) {
+ case AF_INET: sa_len = sizeof(struct sockaddr_in); break;
+ case AF_INET6: sa_len = sizeof(struct sockaddr_in6); break;
+ default: sa_len = 0;
+ }
+
+ if (getnameinfo(&TG(hc)->client_addr.sa, sa_len, buf, sizeof(buf), 0, 0, NI_NUMERICHOST) == 0) {
+#else
p = inet_ntoa(TG(hc)->client_addr.sa_in.sin_addr);
+
/* string representation of IPs are never larger than 512 bytes */
if (p) {
memcpy(buf, p, strlen(p) + 1);
+#endif
ADD_STRING("REMOTE_ADDR");
ADD_STRING("REMOTE_HOST");
}