PHP_ARG_WITH(openssl-dir,OpenSSL dir for SNMP,
[ --with-openssl-dir[=DIR] SNMP: openssl install prefix], no, no)
-PHP_ARG_ENABLE(ucd-snmp-hack, whether to enable UCD SNMP hack,
-[ --enable-ucd-snmp-hack SNMP: Enable UCD SNMP hack], no, no)
-
if test "$PHP_SNMP" != "no"; then
- dnl
- dnl Try net-snmp first
- dnl
if test "$PHP_SNMP" = "yes"; then
AC_PATH_PROG(SNMP_CONFIG,net-snmp-config,,[/usr/local/bin:$PATH])
else
if test -n "$SNMP_LIBS" && test -n "$SNMP_PREFIX"; then
PHP_ADD_INCLUDE(${SNMP_PREFIX}/include)
PHP_EVAL_LIBLINE($SNMP_LIBS, SNMP_SHARED_LIBADD)
- AC_DEFINE(HAVE_NET_SNMP,1,[ ])
SNMP_LIBNAME=netsnmp
else
AC_MSG_ERROR([Could not find the required paths. Please check your net-snmp installation.])
fi
else
-
- dnl
- dnl Try ucd-snmp if net-snmp test failed
- dnl
-
- if test "$PHP_SNMP" = "yes"; then
- for i in /usr/include /usr/local/include; do
- test -f $i/snmp.h && SNMP_INCDIR=$i
- test -f $i/ucd-snmp/snmp.h && SNMP_INCDIR=$i/ucd-snmp
- test -f $i/snmp/snmp.h && SNMP_INCDIR=$i/snmp
- test -f $i/snmp/include/ucd-snmp/snmp.h && SNMP_INCDIR=$i/snmp/include/ucd-snmp
- done
- for i in /usr/$PHP_LIBDIR /usr/snmp/lib /usr/local/$PHP_LIBDIR /usr/local/lib /usr/local/snmp/lib; do
- test -f $i/libsnmp.a || test -f $i/libsnmp.$SHLIB_SUFFIX_NAME && SNMP_LIBDIR=$i
- done
- else
- SNMP_INCDIR=$PHP_SNMP/include
- test -d $PHP_SNMP/include/ucd-snmp && SNMP_INCDIR=$PHP_SNMP/include/ucd-snmp
- SNMP_LIBDIR=$PHP_SNMP/lib
- fi
-
- if test -z "$SNMP_INCDIR"; then
- AC_MSG_ERROR(snmp.h not found. Check your SNMP installation.)
- elif test -z "$SNMP_LIBDIR"; then
- AC_MSG_ERROR(libsnmp not found. Check your SNMP installation.)
- fi
-
- old_CPPFLAGS=$CPPFLAGS
- CPPFLAGS=-I$SNMP_INCDIR
- AC_CHECK_HEADERS(default_store.h)
- if test "$ac_cv_header_default_store_h" = "yes"; then
- AC_MSG_CHECKING(for OpenSSL support in SNMP libraries)
- AC_EGREP_CPP(yes,[
-#include <ucd-snmp-config.h>
-#if USE_OPENSSL
- yes
-#endif
- ],[
- SNMP_SSL=yes
- ],[
- SNMP_SSL=no
- ])
- fi
- CPPFLAGS=$old_CPPFLAGS
- AC_MSG_RESULT($SNMP_SSL)
-
- if test "$SNMP_SSL" = "yes"; then
- if test "$PHP_OPENSSL_DIR" != "no"; then
- PHP_OPENSSL=$PHP_OPENSSL_DIR
- fi
-
- if test "$PHP_OPENSSL" = "no"; then
- AC_MSG_ERROR([The UCD-SNMP in this system is built with SSL support.
-
- Add --with-openssl-dir=DIR to your configure line.])
- else
- PHP_SETUP_OPENSSL(SNMP_SHARED_LIBADD, [], [
- AC_MSG_ERROR([SNMP: OpenSSL check failed. Please check config.log for more information.])
- ])
- fi
- fi
-
- AC_CHECK_LIB(kstat, kstat_read, [ PHP_ADD_LIBRARY(kstat,,SNMP_SHARED_LIBADD) ])
- PHP_ADD_INCLUDE($SNMP_INCDIR)
- PHP_ADD_LIBRARY_WITH_PATH(snmp, $SNMP_LIBDIR, SNMP_SHARED_LIBADD)
- SNMP_LIBNAME=snmp
+ AC_MSG_ERROR([Could not find net-snmp-config binary. Please check your net-snmp installation.])
fi
dnl Check whether snmp_parse_oid() exists.
$SNMP_SHARED_LIBADD
])
- if test "$PHP_UCD_SNMP_HACK" = "yes" ; then
- AC_DEFINE(UCD_SNMP_HACK, 1, [ ])
+ dnl Check for buggy snmp_snprint_value() (net-snmp BUGid 2027834)
+ AC_CACHE_CHECK([for buggy snmp_snprint_value], ac_cv_buggy_snprint_value,[
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -I${SNMP_PREFIX}/include"
+ AC_TRY_RUN( [
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+
+u_char uname[] = "Linux nex1.php.net 2.6.18-194.32.1.el5 #1 SMP Wed Jan 5 17:53:09 EST 2011 i686";
+
+int main(int argc, char **argv)
+{
+ int result = 0;
+ struct variable_list vars;
+ char buf1[2048];
+ char buf2[sizeof(buf1)];
+
+ memset(&(buf1[0]), 0, sizeof(buf1));
+ memset(&(buf2[0]), 0, sizeof(buf2));
+ memset(&vars, 0, sizeof(vars));
+ vars.type = 4;
+ vars.val.integer = (long *)&(uname[0]);
+ vars.val.string = &(uname[0]);
+ vars.val.bitstring = &(uname[0]);
+ vars.val.counter64 = (struct counter64 *)&(uname[0]);
+ vars.val.floatVal = (float *)&(uname[0]);
+ vars.val_len = sizeof(uname),
+ vars.name_loc[0] = 1;
+ vars.name_loc[1] = 3;
+ vars.name_loc[2] = 6;
+ vars.name_loc[3] = 1;
+ vars.name_loc[4] = 2;
+ vars.name_loc[5] = 1;
+ vars.name_loc[6] = 1;
+ vars.name_loc[7] = 1;
+ vars.name = (oid *)&(vars.name_loc);
+ vars.name_length = 9;
+
+ init_snmp("snmpapp");
+
+ netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT, 0);
+
+ snprint_value(buf1, (sizeof(uname) + 32), vars.name, vars.name_length, &vars);
+ snprint_value(buf2, sizeof(buf2), vars.name, vars.name_length, &vars);
+ exit((strncmp(buf1, buf2, sizeof(buf1)) != 0));
+}
+ ],[
+ ac_cv_buggy_snprint_value=no
+ ],[
+ ac_cv_buggy_snprint_value=yes
+ ],[
+ ac_cv_buggy_snprint_value=no
+ ])
+ CFLAGS="$save_CFLAGS"
+ ])
+ if test "ac_cv_buggy_snprint_value" = "yes"; then
+ AC_DEFINE(BUGGY_SNMPRINT_VALUE, 1, [ ])
fi
-
+
PHP_NEW_EXTENSION(snmp, snmp.c, $ext_shared)
PHP_SUBST(SNMP_SHARED_LIBADD)
fi
#endif
#endif
-#ifdef HAVE_NET_SNMP
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
-#else
-#ifdef HAVE_DEFAULT_STORE_H
-#include "default_store.h"
-#endif
-#include "asn1.h"
-#include "snmp_api.h"
-#include "snmp_client.h"
-#include "snmp_impl.h"
-#include "snmp.h"
-#include "snmpv3.h"
-#include "keytools.h"
-#include "parse.h"
-#include "mib.h"
-#ifndef PHP_WIN32
-/* this doesn't appear to be needed under win32 (perhaps at all)
- * and the header file is not present in my UCD-SNMP headers */
-# include "version.h"
-#endif
-#include "transform_oids.h"
-#endif
+
/* Ugly macro, since the length of OIDs in UCD-SNMP and NET-SNMP
* is different and this way the code is not full of 'ifdef's.
*/
#define OIDSIZE(p) (sizeof(p)/sizeof(oid))
-/* Another ugly macros, since UCD-SNMP has no snprint_* */
-#ifdef HAVE_NET_SNMP
-#define SNMP_SNPRINT_OBJID(dst, dstlen, src, srclen) (snprint_objid((dst), (dstlen), (src), (srclen)))
-#define SNMP_SNPRINT_VALUE(dst, dstlen, srcname, srcnamelen, src) (snprint_value((dst), (dstlen), (srcname), (srcnamelen), (src)))
-#else
-#define SNMP_SNPRINT_OBJID(dst, dstlen, src, srclen) (sprint_objid((dst), (src), (srclen)))
-#define SNMP_SNPRINT_VALUE(dst, dstlen, srcname, srcnamelen, src) (sprint_value((dst), (srcname), (srcnamelen), (src)))
-#endif
-
#if PHP_VERSION_ID < 50300
#define Z_ADDREF_P(pz) pz->refcount++
#define Z_ISREF_PP(oid) (PZVAL_IS_REF(*(oid)))
ZEND_ARG_INFO(0, quick_print)
ZEND_END_ARG_INFO()
-#ifdef HAVE_NET_SNMP
ZEND_BEGIN_ARG_INFO_EX(arginfo_snmp_set_enum_print, 0, 0, 1)
ZEND_ARG_INFO(0, enum_print)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_snmp_set_oid_output_format, 0, 0, 1)
ZEND_ARG_INFO(0, oid_format)
ZEND_END_ARG_INFO()
-#endif
ZEND_BEGIN_ARG_INFO_EX(arginfo_snmp2_get, 0, 0, 3)
ZEND_ARG_INFO(0, host)
PHP_FE(snmpset, arginfo_snmpset)
PHP_FE(snmp_get_quick_print, arginfo_snmp_get_quick_print)
PHP_FE(snmp_set_quick_print, arginfo_snmp_set_quick_print)
-#ifdef HAVE_NET_SNMP
PHP_FE(snmp_set_enum_print, arginfo_snmp_set_enum_print)
PHP_FE(snmp_set_oid_output_format, arginfo_snmp_set_oid_output_format)
PHP_FALIAS(snmp_set_oid_numeric_print, snmp_set_oid_output_format, arginfo_snmp_set_oid_output_format)
-#endif
PHP_FE(snmp2_get, arginfo_snmp2_get)
PHP_FE(snmp2_getnext, arginfo_snmp2_getnext)
static void php_snmp_getvalue(struct variable_list *vars, zval *snmpval TSRMLS_DC, int valueretrieval)
{
zval *val;
+#ifdef BUGGY_SNMPRINT_VALUE
+ char sbuf[2048];
+#else
char sbuf[64];
+#endif
char *buf = &(sbuf[0]);
char *dbuf = (char *)NULL;
int buflen = sizeof(sbuf) - 1;
*buf = 0;
if (valueretrieval == SNMP_VALUE_LIBRARY) {
- SNMP_SNPRINT_VALUE(buf, buflen, vars->name, vars->name_length, vars);
+ snprint_value(buf, buflen, vars->name, vars->name_length, vars);
ZVAL_STRING(snmpval, buf, 1);
if(dbuf){ /* malloc was used to store value */
efree(dbuf);
break;
case ASN_OBJECT_ID: /* 0x06, asn1.h */
- SNMP_SNPRINT_OBJID(buf, buflen, vars->val.objid, vars->val_len / sizeof(oid));
+ snprint_objid(buf, buflen, vars->val.objid, vars->val_len / sizeof(oid));
ZVAL_STRING(val, buf, 1);
break;
return;
} else {
if ((snmp_errno = snmp_add_var(pdu, name, name_length, objid_query->vars[objid_query->offset].type, objid_query->vars[objid_query->offset].value))) {
- SNMP_SNPRINT_OBJID(buf, sizeof(buf), name, name_length);
+ snprint_objid(buf, sizeof(buf), name, name_length);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not add variable: OID='%s' type='%c' value='%s': %s", buf, objid_query->vars[objid_query->offset].type, objid_query->vars[objid_query->offset].value, snmp_api_errstring(snmp_errno));
snmp_free_pdu(pdu);
snmp_close(ss);
if ((st & SNMP_CMD_WALK) && Z_TYPE_P(return_value) == IS_ARRAY) {
break;
}
- SNMP_SNPRINT_OBJID(buf, sizeof(buf), vars->name, vars->name_length);
- SNMP_SNPRINT_VALUE(buf2, sizeof(buf2), vars->name, vars->name_length, vars);
+ snprint_objid(buf, sizeof(buf), vars->name, vars->name_length);
+ snprint_value(buf2, sizeof(buf2), vars->name, vars->name_length, vars);
php_snmp_error(getThis(), NULL TSRMLS_CC, PHP_SNMP_ERRNO_ERROR_IN_REPLY, "Error in packet at '%s': %s", buf, buf2);
continue;
}
if (st & SNMP_NUMERIC_KEYS) {
add_next_index_zval(return_value, snmpval);
} else {
- SNMP_SNPRINT_OBJID(buf2, sizeof(buf2), vars->name, vars->name_length);
+ snprint_objid(buf2, sizeof(buf2), vars->name, vars->name_length);
add_assoc_zval(return_value, buf2, snmpval);
}
} else {
continue;
}
if (vars) {
- SNMP_SNPRINT_OBJID(buf, sizeof(buf), vars->name, vars->name_length);
+ snprint_objid(buf, sizeof(buf), vars->name, vars->name_length);
php_snmp_error(getThis(), NULL TSRMLS_CC, PHP_SNMP_ERRNO_ERROR_IN_REPLY, "Error in packet at '%s': %s", buf, snmp_errstring(response->errstat));
} else {
php_snmp_error(getThis(), NULL TSRMLS_CC, PHP_SNMP_ERRNO_ERROR_IN_REPLY, "Error in packet at %u object_id: %s", response->errindex, snmp_errstring(response->errstat));
}
}
objid_query.valueretrieval = snmp_object->valueretrieval;
-#ifdef HAVE_NET_SNMP
glob_snmp_object.enum_print = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM);
netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM, snmp_object->enum_print);
glob_snmp_object.quick_print = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT);
netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT, snmp_object->quick_print);
glob_snmp_object.oid_output_format = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT);
netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, snmp_object->oid_output_format);
-#else
- glob_snmp_object.quick_print = snmp_get_quick_print();
- snmp_set_quick_print(snmp_object->quick_print);
-#endif
}
if (objid_query.max_repetitions < 0) {
if (session_less_mode) {
netsnmp_session_free(&session);
} else {
-#ifdef HAVE_NET_SNMP
netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM, glob_snmp_object.enum_print);
netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT, glob_snmp_object.quick_print);
netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, glob_snmp_object.oid_output_format);
-#else
- snmp_set_quick_print(glob_snmp_object.quick_print);
-#endif
}
}
/* }}} */
return;
}
-#ifdef HAVE_NET_SNMP
RETURN_BOOL(netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT));
-#else
- RETURN_BOOL(snmp_get_quick_print());
-#endif
}
/* }}} */
RETURN_FALSE;
}
-#ifdef HAVE_NET_SNMP
netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT, (int)a1);
-#else
- snmp_set_quick_print((int)a1);
-#endif
RETURN_TRUE;
}
/* }}} */
-#ifdef HAVE_NET_SNMP
/* {{{ proto bool snmp_set_enum_print(int enum_print)
Return all values that are enums with their enum value instead of the raw integer */
PHP_FUNCTION(snmp_set_enum_print)
}
}
/* }}} */
-#endif
/* {{{ proto mixed snmp2_get(string host, string community, mixed object_id [, int timeout [, int retries]])
Fetch a SNMP object */
}
snmp_object->max_oids = 0;
snmp_object->valueretrieval = SNMP_G(valueretrieval);
-#ifdef HAVE_NET_SNMP
snmp_object->enum_print = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM);
snmp_object->oid_output_format = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT);
snmp_object->quick_print = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT);
-#else
- snmp_object->quick_print = snmp_get_quick_print();
-#endif
}
/* }}} */
}
/* }}} */
-#ifdef HAVE_NET_SNMP
/* {{{ */
static int php_snmp_read_enum_print(php_snmp_object *snmp_object, zval **retval TSRMLS_DC)
{
return SUCCESS;
}
/* }}} */
-#endif
/* {{{ */
static int php_snmp_write_info(php_snmp_object *snmp_object, zval *newval TSRMLS_DC)
}
/* }}} */
-#ifdef HAVE_NET_SNMP
/* {{{ */
static int php_snmp_write_enum_print(php_snmp_object *snmp_object, zval *newval TSRMLS_DC)
{
}
return ret;
}
-#endif
/* }}} */
/* {{{ php_snmp_class_methods[] */
PHP_SNMP_PROPERTY_ENTRY_RECORD(max_oids),
PHP_SNMP_PROPERTY_ENTRY_RECORD(valueretrieval),
PHP_SNMP_PROPERTY_ENTRY_RECORD(quick_print),
-#ifdef HAVE_NET_SNMP
PHP_SNMP_PROPERTY_ENTRY_RECORD(enum_print),
PHP_SNMP_PROPERTY_ENTRY_RECORD(oid_output_format),
-#endif
{ NULL, 0, NULL, NULL}
};
/* }}} */
zend_hash_init(&php_snmp_properties, 0, NULL, NULL, 1);
PHP_SNMP_ADD_PROPERTIES(&php_snmp_properties, php_snmp_property_entries);
-#ifdef HAVE_NET_SNMP
REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_SUFFIX", NETSNMP_OID_OUTPUT_SUFFIX, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_MODULE", NETSNMP_OID_OUTPUT_MODULE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_FULL", NETSNMP_OID_OUTPUT_FULL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_NUMERIC", NETSNMP_OID_OUTPUT_NUMERIC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_UCD", NETSNMP_OID_OUTPUT_UCD, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_NONE", NETSNMP_OID_OUTPUT_NONE, CONST_CS | CONST_PERSISTENT);
-#endif
REGISTER_LONG_CONSTANT("SNMP_VALUE_LIBRARY", SNMP_VALUE_LIBRARY, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SNMP_VALUE_PLAIN", SNMP_VALUE_PLAIN, CONST_CS | CONST_PERSISTENT);
PHP_MINFO_FUNCTION(snmp)
{
php_info_print_table_start();
-#ifdef HAVE_NET_SNMP
php_info_print_table_row(2, "NET-SNMP Support", "enabled");
php_info_print_table_row(2, "NET-SNMP Version", netsnmp_get_version());
-#else
- php_info_print_table_row(2, "UCD-SNMP Support", "enabled");
- php_info_print_table_row(2, "UCD-SNMP Version", VersionInfo);
-#endif
php_info_print_table_row(2, "PHP SNMP Version", PHP_SNMP_VERSION);
php_info_print_table_end();
}