⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snmp.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*  +----------------------------------------------------------------------+  | PHP Version 4                                                        |  +----------------------------------------------------------------------+  | Copyright (c) 1997-2007 The PHP Group                                |  +----------------------------------------------------------------------+  | This source file is subject to version 3.01 of the PHP license,      |  | that is bundled with this package in the file LICENSE, and is        |  | available through the world-wide-web at the following url:           |  | http://www.php.net/license/3_01.txt                                  |  | If you did not receive a copy of the PHP license and are unable to   |  | obtain it through the world-wide-web, please send a note to          |  | license@php.net so we can mail you a copy immediately.               |  +----------------------------------------------------------------------+  | Authors: Rasmus Lerdorf <rasmus@php.net>                             |  |          Mike Jackson <mhjack@tscnet.com>                            |  |          Steven Lawrance <slawrance@technologist.com>                |  |          Harrie Hazewinkel <harrie@lisanza.net>                      |  |          Johann Hanne <jonny@nurfuerspam.de>                         |  +----------------------------------------------------------------------+*//* $Id: snmp.c,v 1.70.2.22.2.2 2007/01/01 09:46:47 sebastian Exp $ */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "php.h"#include "ext/standard/info.h"#include "php_snmp.h"#if HAVE_SNMP#include <sys/types.h>#ifdef PHP_WIN32#include <winsock.h>#include <errno.h>#include <process.h>#include "win32/time.h"#elif defined(NETWARE)#ifdef USE_WINSOCK/*#include <ws2nlm.h>*/#include <novsock2.h>#else#include <sys/socket.h>#endif#include <errno.h>/*#include <process.h>*/#ifdef NEW_LIBC#include <sys/timeval.h>#else#include "netware/time_nw.h"#endif#else#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#ifndef _OSD_POSIX#include <sys/errno.h>#else#include <errno.h>  /* BS2000/OSD uses <errno.h>, not <sys/errno.h> */#endif#include <netdb.h>#endif#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#ifndef __P#ifdef __GNUC__#define __P(args) args#else#define __P(args) ()#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"#include "version.h"#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))/* For really old ucd-snmp versions.. */#ifndef HAVE_SNMP_PARSE_OID#define snmp_parse_oid read_objid#endif/* ucd-snmp 3.3.1 changed the name of a few #defines... They've been changed back to the original ones in 3.5.3! */#ifndef SNMP_MSG_GET#define SNMP_MSG_GET GET_REQ_MSG#define SNMP_MSG_GETNEXT GETNEXT_REQ_MSG#endif#define SNMP_VALUE_LIBRARY	0#define SNMP_VALUE_PLAIN	1#define SNMP_VALUE_OBJECT	2ZEND_DECLARE_MODULE_GLOBALS(snmp)/* constant - can be shared among threads */static oid objid_mib[] = {1, 3, 6, 1, 2, 1};/* {{{ snmp_functions[] */function_entry snmp_functions[] = {	PHP_FE(snmpget, NULL)	PHP_FE(snmpwalk, NULL)	PHP_FE(snmprealwalk, NULL)	PHP_FALIAS(snmpwalkoid, snmprealwalk, NULL)	PHP_FE(snmp_get_quick_print, NULL)	PHP_FE(snmp_set_quick_print, NULL)#ifdef HAVE_NET_SNMP	PHP_FE(snmp_set_enum_print, NULL)	PHP_FE(snmp_set_oid_numeric_print, NULL)#endif	PHP_FE(snmpset, NULL)	PHP_FE(snmp2_get, NULL)	PHP_FE(snmp2_walk, NULL)	PHP_FE(snmp2_real_walk, NULL)	PHP_FE(snmp2_set, NULL)	PHP_FE(snmp3_get, NULL)	PHP_FE(snmp3_walk, NULL)	PHP_FE(snmp3_real_walk, NULL)	PHP_FE(snmp3_set, NULL)	PHP_FE(snmp_set_valueretrieval, NULL)	PHP_FE(snmp_get_valueretrieval, NULL)	{NULL,NULL,NULL}};/* }}} *//* {{{ snmp_module_entry */zend_module_entry snmp_module_entry = {	STANDARD_MODULE_HEADER,	"snmp",	snmp_functions,	PHP_MINIT(snmp),	NULL,	NULL,	NULL,	PHP_MINFO(snmp),	NO_VERSION_YET,	STANDARD_MODULE_PROPERTIES};/* }}} */#ifdef COMPILE_DL_SNMPZEND_GET_MODULE(snmp)#endif/* THREAD_LS snmp_module php_snmp_module; - may need one of these at some point *//* {{{ php_snmp_init_globals */static void php_snmp_init_globals(zend_snmp_globals *snmp_globals){	snmp_globals->valueretrieval = 0;}/* }}} *//* {{{ PHP_MINIT_FUNCTION */PHP_MINIT_FUNCTION(snmp){	init_snmp("snmpapp");	ZEND_INIT_MODULE_GLOBALS(snmp, php_snmp_init_globals, NULL);	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);	REGISTER_LONG_CONSTANT("SNMP_VALUE_OBJECT", SNMP_VALUE_OBJECT, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SNMP_BIT_STR", ASN_BIT_STR, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SNMP_OCTET_STR", ASN_OCTET_STR, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SNMP_OPAQUE", ASN_OPAQUE, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SNMP_NULL", ASN_NULL, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SNMP_OBJECT_ID", ASN_OBJECT_ID, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SNMP_IPADDRESS", ASN_IPADDRESS, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SNMP_COUNTER", ASN_GAUGE, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SNMP_UNSIGNED", ASN_UNSIGNED, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SNMP_TIMETICKS", ASN_TIMETICKS, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SNMP_UINTEGER", ASN_UINTEGER, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SNMP_INTEGER", ASN_INTEGER, CONST_CS | CONST_PERSISTENT);	REGISTER_LONG_CONSTANT("SNMP_COUNTER64", ASN_COUNTER64, CONST_CS | CONST_PERSISTENT);	return SUCCESS;}/* }}} *//* {{{ PHP_MINFO_FUNCTION */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_end();}/* }}} */static void php_snmp_getvalue(struct variable_list *vars, zval *snmpval TSRMLS_DC){	zval *val;#if I64CHARSZ > 2047	char buf[I64CHARSZ + 1];#else	char buf[2048];#endif	buf[0] = 0;	if (SNMP_G(valueretrieval) == 0) {#ifdef HAVE_NET_SNMP		snprint_value(buf, sizeof(buf), vars->name, vars->name_length, vars);#else		sprint_value(buf,vars->name, vars->name_length, vars);#endif		ZVAL_STRING(snmpval, buf, 1);		return;	}	MAKE_STD_ZVAL(val);	switch (vars->type) {	case ASN_BIT_STR:		/* 0x03, asn1.h */		ZVAL_STRINGL(val, vars->val.bitstring, vars->val_len, 1);		break;	case ASN_OCTET_STR:		/* 0x04, asn1.h */	case ASN_OPAQUE:		/* 0x44, snmp_impl.h */		ZVAL_STRINGL(val, vars->val.string, vars->val_len, 1);		break;	case ASN_NULL:			/* 0x05, asn1.h */		ZVAL_NULL(val);		break;	case ASN_OBJECT_ID:		/* 0x06, asn1.h */#ifdef HAVE_NET_SNMP		snprint_objid(buf, sizeof(buf), vars->val.objid, vars->val_len / sizeof(oid));#else		sprint_objid(buf, vars->val.objid, vars->val_len / sizeof(oid));#endif		ZVAL_STRING(val, buf, 1);		break;	case ASN_IPADDRESS:		/* 0x40, snmp_impl.h */		snprintf(buf, sizeof(buf)-1, "%d.%d.%d.%d",		         (vars->val.string)[0], (vars->val.string)[1],		         (vars->val.string)[2], (vars->val.string)[3]);		buf[sizeof(buf)-1]=0;		ZVAL_STRING(val, buf, 1);		break;	case ASN_COUNTER:		/* 0x41, snmp_impl.h */	case ASN_GAUGE:			/* 0x42, snmp_impl.h */	/* ASN_UNSIGNED is the same as ASN_GAUGE */	case ASN_TIMETICKS:		/* 0x43, snmp_impl.h */	case ASN_UINTEGER:		/* 0x47, snmp_impl.h */		snprintf(buf, sizeof(buf)-1, "%lu", *vars->val.integer);		buf[sizeof(buf)-1]=0;		ZVAL_STRING(val, buf, 1);		break;	case ASN_INTEGER:		/* 0x02, asn1.h */		snprintf(buf, sizeof(buf)-1, "%ld", *vars->val.integer);		buf[sizeof(buf)-1]=0;		ZVAL_STRING(val, buf, 1);		break;	case ASN_COUNTER64:		/* 0x46, snmp_impl.h */		printU64(buf, vars->val.counter64);		ZVAL_STRING(val, buf, 1);		break;	default:		ZVAL_STRING(val, "Unknown value type", 1);		break;	}	if (SNMP_G(valueretrieval) == 1) {		*snmpval = *val;		zval_copy_ctor(snmpval);	} else {		object_init(snmpval);		add_property_long(snmpval, "type", vars->type);		add_property_zval(snmpval, "value", val);	}}/* {{{ php_snmp_internal** Generic SNMP object fetcher (for all SNMP versions)** st=1   snmpget()  - query an agent and return a single value.* st=2   snmpwalk() - walk the mib and return a single dimensional array *                     containing the values.* st=3   snmprealwalk() and snmpwalkoid() - walk the mib and return an *                                           array of oid,value pairs.* st=5-8 ** Reserved *** st=11  snmpset()  - query an agent and set a single value**/static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS,		int st,		struct snmp_session *session,		char *objid, char type, char* value) {	struct snmp_session *ss;	struct snmp_pdu *pdu=NULL, *response;	struct variable_list *vars;	oid name[MAX_NAME_LEN];	size_t name_length;	oid root[MAX_NAME_LEN];	size_t rootlen = 0;	int gotroot = 0;	int status, count;	char buf[2048];	char buf2[2048];	int keepwalking=1;	char *err;	zval *snmpval = NULL;	if (st >= 2) { /* walk */		rootlen = MAX_NAME_LEN;		if (strlen(objid)) { /* on a walk, an empty string means top of tree - no error */			if (snmp_parse_oid(objid, root, &rootlen)) {				gotroot = 1;			} else {				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object identifier: %s", objid);			}		}		if (!gotroot) {			memmove((char *) root, (char *) objid_mib, sizeof(objid_mib));			rootlen = sizeof(objid_mib) / sizeof(oid);			gotroot = 1;		}	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -