Re: [Fwd: new dns function, gethostent]
| From: | (Marcus Börger) | Date: | Thu, 18 Apr 2002 22:33:57 +0000 |
| Subject: | Re: [Fwd: new dns function, gethostent] | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-82987@lists.php.net to get a copy of this message | ||
At 23:13 18.04.2002, Shane Caraveo wrote:
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. ShaneWhy not use a more meaningful functionname? Something like gethostentry?
? 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