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.
>
>Shane

Why 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


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to