lytboris Sat, 20 Aug 2011 16:10:48 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=315237
Log: merge from trunk two commits: Adding IPv6 support (FR #42918) more code coverage Bug: https://bugs.php.net/42918 (Assigned) IPv6 addresses not supported in SNMP extension Changed paths: _U php/php-src/branches/PHP_5_4/ext/snmp/ U php/php-src/branches/PHP_5_4/ext/snmp/snmp.c U php/php-src/branches/PHP_5_4/ext/snmp/tests/README U php/php-src/branches/PHP_5_4/ext/snmp/tests/generic_timeout_error.phpt A + php/php-src/branches/PHP_5_4/ext/snmp/tests/ipv6.phpt (from php/php-src/trunk/ext/snmp/tests/ipv6.phpt:r315236) U php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp-object-errno-errstr.phpt U php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp_include.inc U php/php-src/branches/PHP_5_4/ext/snmp/tests/wrong_hostname.phpt
Property changes on: php/php-src/branches/PHP_5_4/ext/snmp ___________________________________________________________________ Modified: svn:mergeinfo - /php/php-src/trunk/ext/snmp:284726,311033-313324,313341,313532 + /php/php-src/trunk/ext/snmp:284726,311033-315236 Modified: php/php-src/branches/PHP_5_4/ext/snmp/snmp.c =================================================================== --- php/php-src/branches/PHP_5_4/ext/snmp/snmp.c 2011-08-20 15:53:44 UTC (rev 315236) +++ php/php-src/branches/PHP_5_4/ext/snmp/snmp.c 2011-08-20 16:10:48 UTC (rev 315237) @@ -28,6 +28,7 @@ #endif #include "php.h" +#include "main/php_network.h" #include "ext/standard/info.h" #include "php_snmp.h" @@ -1075,9 +1076,13 @@ */ static int netsnmp_session_init(php_snmp_session **session_p, int version, char *hostname, char *community, int timeout, int retries TSRMLS_DC) { - int remote_port = SNMP_PORT; php_snmp_session *session; char *pptr; + char buf[MAX_NAME_LEN]; + int force_ipv6 = FALSE; + int n; + struct sockaddr **psal; + struct sockaddr **res; *session_p = (php_snmp_session *)emalloc(sizeof(php_snmp_session)); session = *session_p; @@ -1085,26 +1090,87 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING, "emalloc() failed allocating session"); return (-1); } + memset(session, 0, sizeof(php_snmp_session)); + strlcpy(buf, hostname, sizeof(buf)); + snmp_sess_init(session); session->version = version; + session->remote_port = SNMP_PORT; session->peername = emalloc(MAX_NAME_LEN); - if(session->peername == NULL) { + if (session->peername == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "emalloc() failed while copying hostname"); - netsnmp_session_free(&session); return (-1); } + *(session->peername) = '\0'; /* Reading the hostname and its optional non-default port number */ - strlcpy(session->peername, hostname, MAX_NAME_LEN); - if ((pptr = strchr(session->peername, ':'))) { - remote_port = strtol(pptr + 1, NULL, 0); + if (*hostname == '[') { /* IPv6 address */ + force_ipv6 = TRUE; + hostname++; + if ((pptr = strchr(hostname, ']'))) { + if (pptr[1] == ':') { + session->remote_port = atoi(pptr + 2); + } + *pptr = '\0'; + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "mailformed IPv6 address, closing square bracket missing"); + return (-1); + } + } else { /* IPv4 address */ + if ((pptr = strchr(hostname, ':'))) { + session->remote_port = atoi(pptr + 1); + *pptr = '\0'; + } } - session->remote_port = remote_port; + /* since Net-SNMP library requires 'udp6:' prefix for all IPv6 addresses (in FQDN form too) we need to + perform possible name resolution before running any SNMP queries */ + if ((n = php_network_getaddresses(hostname, SOCK_DGRAM, &psal, NULL TSRMLS_CC)) == 0) { /* some resover error */ + /* warnings sent, bailing out */ + return (-1); + } + res = psal; + while (n-- > 0) { + pptr = session->peername; +#if HAVE_GETADDRINFO && HAVE_IPV6 && HAVE_INET_NTOP + if (force_ipv6 && (*res)->sa_family != AF_INET6) { + res++; + continue; + } + if ((*res)->sa_family == AF_INET6) { + strcpy(session->peername, "udp6:"); + pptr = session->peername + strlen(session->peername); + inet_ntop((*res)->sa_family, &(((struct sockaddr_in6*)(*res))->sin6_addr), pptr, MAX_NAME_LEN); + } else if ((*res)->sa_family == AF_INET) { + inet_ntop((*res)->sa_family, &(((struct sockaddr_in*)(*res))->sin_addr), pptr, MAX_NAME_LEN); + } else { + res++; + continue; + } +#else + if (res->sa_family != AF_INET) { + res++; + continue; + } + strcat(pptr, inet_ntoa(res)); +#endif + break; + } + + if (strlen(session->peername) == 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown failure while resolving '%s'", buf); + return (-1); + } + /* XXX FIXME + There should be check for non-empty session->peername! + */ + + php_network_freeaddresses(psal); + if (version == SNMP_VERSION_3) { /* Setting the security name. */ session->securityName = estrdup(community); Modified: php/php-src/branches/PHP_5_4/ext/snmp/tests/README =================================================================== --- php/php-src/branches/PHP_5_4/ext/snmp/tests/README 2011-08-20 15:53:44 UTC (rev 315236) +++ php/php-src/branches/PHP_5_4/ext/snmp/tests/README 2011-08-20 16:10:48 UTC (rev 315237) @@ -9,7 +9,9 @@ ** How to test ** You need to give credentials with environment vars if default ones are not sutable (see snmp_include.inc for more info): -SNMP_HOSTNAME : IP or IP:PORT to connect to +SNMP_HOSTNAME : IPv4 of remote SNMP agent +SNMP_HOSTNAME : IPv6 or remote SNMP agent +SNMP_PORT : SNMP port for queries SNMP_COMMUNITY : community name SNMP_COMMUNITY_WRITE : community used for write tests (snmpset()). SNMP_MIBDIR : Directory containing MIBS @@ -26,6 +28,7 @@ ###### Config file ##### rocommunity public 127.0.0.1 +rocommunity6 public ::1 rwcommunity private 127.0.0.1 Do not enable them - being set here they make appropriate OID switch into r/o Modified: php/php-src/branches/PHP_5_4/ext/snmp/tests/generic_timeout_error.phpt =================================================================== --- php/php-src/branches/PHP_5_4/ext/snmp/tests/generic_timeout_error.phpt 2011-08-20 15:53:44 UTC (rev 315236) +++ php/php-src/branches/PHP_5_4/ext/snmp/tests/generic_timeout_error.phpt 2011-08-20 16:10:48 UTC (rev 315237) @@ -15,8 +15,13 @@ snmp_set_valueretrieval(SNMP_VALUE_PLAIN); var_dump(snmpget($hostname, 'timeout_community_432', '.1.3.6.1.2.1.1.1.0', $timeout, $retries)); +var_dump(snmpget($hostname, 'timeout_community_432', array('.1.3.6.1.2.1.1.1.0'), $timeout, $retries)); ?> --EXPECTF-- Warning: snmpget(): No response from %s in %s on line %d bool(false) + +Warning: snmpget(): No response from %s in %s on line %d +bool(false) + Copied: php/php-src/branches/PHP_5_4/ext/snmp/tests/ipv6.phpt (from rev 315236, php/php-src/trunk/ext/snmp/tests/ipv6.phpt) =================================================================== --- php/php-src/branches/PHP_5_4/ext/snmp/tests/ipv6.phpt (rev 0) +++ php/php-src/branches/PHP_5_4/ext/snmp/tests/ipv6.phpt 2011-08-20 16:10:48 UTC (rev 315237) @@ -0,0 +1,24 @@ +--TEST-- +IPv6 support +--CREDITS-- +Boris Lytochkin +--SKIPIF-- +<?php + require_once(dirname(__FILE__).'/skipif.inc'); + + if (!function_exists("inet_ntop")) die("skip no inet_ntop()"); +?> +--FILE-- +<?php +require_once(dirname(__FILE__).'/snmp_include.inc'); + +$default_port = 161; + +//EXPECTF format is quickprint OFF +snmp_set_quick_print(false); +snmp_set_valueretrieval(SNMP_VALUE_PLAIN); + +var_dump(snmpget($hostname6_port, $community, '.1.3.6.1.2.1.1.1.0')); +?> +--EXPECTF-- +%unicode|string%(%d) "%s" Modified: php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp-object-errno-errstr.phpt =================================================================== --- php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp-object-errno-errstr.phpt 2011-08-20 15:53:44 UTC (rev 315236) +++ php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp-object-errno-errstr.phpt 2011-08-20 16:10:48 UTC (rev 315237) @@ -42,6 +42,7 @@ var_dump(@$session->get('.1.3.6.1.2.1.1.1.0')); var_dump($session->getErrno() == SNMP::ERRNO_GENERIC); var_dump($session->getError()); +var_dump(@$session->get(array('.1.3.6.1.2.1.1.1.0'))); $session->close(); ?> --EXPECTF-- @@ -61,3 +62,4 @@ bool(false) bool(true) %string|unicode%(%d) "Fatal error: Unknown user name" +bool(false) Modified: php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp_include.inc =================================================================== --- php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp_include.inc 2011-08-20 15:53:44 UTC (rev 315236) +++ php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp_include.inc 2011-08-20 16:10:48 UTC (rev 315237) @@ -6,9 +6,11 @@ Default timeout is 1000ms and there will be one request performed. */ -$hostname = getenv('SNMP_HOSTNAME') ? getenv('SNMP_HOSTNAME') : '127.0.0.1'; +$hostname4 = getenv('SNMP_HOSTNAME') ? getenv('SNMP_HOSTNAME') : '127.0.0.1'; +$hostname6 = getenv('SNMP_HOSTNAME6') ? getenv('SNMP_HOSTNAME6') : '::1'; $port = getenv('SNMP_PORT') ? getenv('SNMP_PORT') : '161'; -$hostname .= ":$port"; +$hostname = "$hostname4:$port"; +$hostname6_port = "[$hostname6]:$port"; $community = getenv('SNMP_COMMUNITY') ? getenv('SNMP_COMMUNITY') : 'public'; $communityWrite = getenv('SNMP_COMMUNITY_WRITE')? getenv('SNMP_COMMUNITY_WRITE'):'private'; Modified: php/php-src/branches/PHP_5_4/ext/snmp/tests/wrong_hostname.phpt =================================================================== --- php/php-src/branches/PHP_5_4/ext/snmp/tests/wrong_hostname.phpt 2011-08-20 15:53:44 UTC (rev 315236) +++ php/php-src/branches/PHP_5_4/ext/snmp/tests/wrong_hostname.phpt 2011-08-20 16:10:48 UTC (rev 315237) @@ -18,5 +18,5 @@ ?> --EXPECTF-- -Warning: snmpget(): Could not open snmp connection: Unknown host (192.168..6.1) (%s) in %s on line %d +Warning: snmpget(): php_network_getaddresses: getaddrinfo failed: hostname nor servname provided, or not known in %s on line %d bool(false)
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php