Hi everyone,
I have a need not fullfilled by the current short set of dns functions
(no way to retrieve aliases), so I wrote a 'gethostent' function, which
accepts either hostname or ip, and returns a hash equivelant of the C
hostent struct. patch is attached, if no objections in the next couple
hours I'll commit it.
Shane
? dns.diff
Index: basic_functions.c
===================================================================
RCS file: /repository/php4/ext/standard/basic_functions.c,v
retrieving revision 1.470
diff -d -u -r1.470 basic_functions.c
--- basic_functions.c 16 Apr 2002 22:14:19 -0000 1.470
+++ basic_functions.c 18 Apr 2002 20:50:42 -0000
@@ -406,6 +406,7 @@
PHP_FE(gethostbyaddr,
NULL)
PHP_FE(gethostbyname,
NULL)
PHP_FE(gethostbynamel,
NULL)
+ PHP_FE(gethostent,
+ NULL)
#if HAVE_RES_SEARCH && !(defined(__BEOS__) || defined(PHP_WIN32))
PHP_FE(checkdnsrr,
NULL)
Index: dns.c
===================================================================
RCS file: /repository/php4/ext/standard/dns.c,v
retrieving revision 1.38
diff -d -u -r1.38 dns.c
--- dns.c 28 Feb 2002 08:26:44 -0000 1.38
+++ dns.c 18 Apr 2002 20:50:42 -0000
@@ -63,7 +63,7 @@
#include "dns.h"
/* }}} */
-static char *php_gethostbyaddr(char *ip);
+struct hostent *php_gethostbyaddr(char *ip);
static char *php_gethostbyname(char *name);
/* {{{ proto string gethostbyaddr(string ip_address)
@@ -71,7 +71,8 @@
PHP_FUNCTION(gethostbyaddr)
{
zval **arg;
- char *addr;
+ char *addr, *ip;
+ struct hostent *hp;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {
ZEND_WRONG_PARAM_COUNT();
@@ -79,7 +80,14 @@
convert_to_string_ex(arg);
- addr = php_gethostbyaddr(Z_STRVAL_PP(arg));
+ ip = Z_STRVAL_PP(arg);
+ hp = php_gethostbyaddr(ip);
+ if (!hp) {
+ addr = estrdup(ip);
+ } else {
+ addr = estrdup(hp->h_name);
+ }
+
if(addr == NULL) {
#if HAVE_IPV6 && !defined(__MacOSX__)
@@ -96,9 +104,80 @@
}
/* }}} */
+
+/* {{{ proto string gethostent(string ip_address|host)
+ Get the Internet hostent structure corresponding to a given IP address or host
+name */
+PHP_FUNCTION(gethostent)
+{
+ zval **arg, *hostent_alias=NULL, *hostent_addr_list=NULL;
+ char *ip;
+ struct hostent *hp;
+ struct in_addr in;
+ int i;
+
+ if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {
+ ZEND_WRONG_PARAM_COUNT();
+ }
+
+ convert_to_string_ex(arg);
+
+ /* start with clean arrays */
+ pval_destructor(return_value);
+ if ( array_init(return_value) == FAILURE ) {
+ RETURN_FALSE;
+ }
+
+ ip = Z_STRVAL_PP(arg);
+ hp = php_gethostbyaddr(ip);
+ if (!hp) {
+ /* not an ip address, try it as a hostname */
+ hp = gethostbyname(ip);
+ }
+
+ if (!hp) {
+ RETVAL_FALSE;
+ }
+
+ MAKE_STD_ZVAL(hostent_alias);
+ MAKE_STD_ZVAL(hostent_addr_list);
+ if ( array_init(hostent_alias) == FAILURE ||
+ array_init(hostent_addr_list) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ add_assoc_string(return_value, "name", hp->h_name, 1);
+ add_assoc_long(return_value, "addrtype", hp->h_addrtype);
+ add_assoc_long(return_value, "length", hp->h_length);
+ /* make a sublist of aliases */
+ if (hp->h_aliases[0]) {
+ for (i = 0 ; hp->h_aliases[i] != 0 ; i++) {
+ add_next_index_string(hostent_alias, hp->h_aliases[i], 1);
+ }
+ zend_hash_update(return_value->value.ht, "aliases", strlen("aliases")
++ 1, (void *)&hostent_alias, sizeof(zval *), NULL);
+ } else {
+ add_assoc_null(return_value, "aliases");
+ }
+ if (hp->h_addr_list[0]) {
+ for (i = 0 ; hp->h_addr_list[i] != 0 ; i++) {
+ in = *(struct in_addr *) hp->h_addr_list[i];
+ add_next_index_string(hostent_addr_list, inet_ntoa(in), 1);
+ if (i ==0) {
+ add_assoc_string(return_value, "addr", inet_ntoa(in),
+1);
+ }
+ }
+ zend_hash_update(return_value->value.ht, "addr_list",
+strlen("addr_list") + 1, (void *)&hostent_addr_list, sizeof(zval *), NULL);
+ } else {
+ add_assoc_null(return_value, "addr");
+ add_assoc_null(return_value, "addr_list");
+ }
+}
+/* }}} */
+
+
+
/* {{{ php_gethostbyaddr
*/
-static char *php_gethostbyaddr(char *ip)
+struct hostent *php_gethostbyaddr(char *ip)
{
#if HAVE_IPV6 && !defined(__MacOSX__)
/* MacOSX at this time has support for IPv6, but not inet_pton()
@@ -128,11 +207,7 @@
hp = gethostbyaddr((char *) &addr, sizeof(addr), AF_INET);
#endif
- if (!hp) {
- return estrdup(ip);
- }
-
- return estrdup(hp->h_name);
+ return hp;
}
/* }}} */
Index: dns.h
===================================================================
RCS file: /repository/php4/ext/standard/dns.h,v
retrieving revision 1.11
diff -d -u -r1.11 dns.h
--- dns.h 28 Feb 2002 08:26:44 -0000 1.11
+++ dns.h 18 Apr 2002 20:50:42 -0000
@@ -24,6 +24,7 @@
PHP_FUNCTION(gethostbyaddr);
PHP_FUNCTION(gethostbyname);
PHP_FUNCTION(gethostbynamel);
+PHP_FUNCTION(gethostent);
#if HAVE_RES_SEARCH && !(defined(__BEOS__)||defined(PHP_WIN32))
PHP_FUNCTION(checkdnsrr);
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php