cvs: /php4/ext/snmp snmp.c php3_snmp.h

From: Date: Wed, 04 Aug 1999 20:56:34 +0000
Subject: cvs: /php4/ext/snmp snmp.c php3_snmp.h
Groups: php.version4 
Request: Send a blank email to php-version4+get-3121@lists.php.net to get a copy of this message
slawrance Wed Aug 4 16:56:34 1999 EDT Modified files: /php4/ext/snmp snmp.c php3_snmp.h Log: Updated the files so that they have all the functionality of PHP 3.0.12. These include snmpwalkoid, snmp_get_quick_print, snmp_set_quick_print, and snmpset. Index: php4/ext/snmp/snmp.c diff -u php4/ext/snmp/snmp.c:1.6 php4/ext/snmp/snmp.c:1.7 --- php4/ext/snmp/snmp.c:1.6 Mon Aug 2 15:16:50 1999 +++ php4/ext/snmp/snmp.c Wed Aug 4 16:56:33 1999 @@ -1,21 +1,23 @@ /* - +----------------------------------------------------------------------+ - | PHP version 4.0 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997, 1998, 1999 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.0 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/2_0.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@lerdorf.on.ca> | - +----------------------------------------------------------------------+ - */ -/* $Id: snmp.c,v 1.6 1999/08/02 19:16:50 zeev Exp $ */ ++----------------------------------------------------------------------+ +| PHP version 4.0 | ++----------------------------------------------------------------------+ +| Copyright (c) 1997, 1998, 1999 The PHP Group | ++----------------------------------------------------------------------+ +| This source file is subject to version 2.0 of the PHP license, | +| that is bundled with this package in the file LICENSE, and is | +| available at through the world-wide-web at | +| http://www.php.net/license/2_0.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@lerdorf.on.ca> | +| Mike Jackson <mhjack@tscnet.com> | +| Steven Lawrance <slawrance@technologist.com> | ++----------------------------------------------------------------------+ +*/ +/* $Id: snmp.c,v 1.7 1999/08/04 20:56:33 slawrance Exp $ */ #include "php.h" #if defined(COMPILE_DL) @@ -33,7 +35,11 @@ #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> -#include <sys/errno.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 @@ -73,8 +79,12 @@ function_entry snmp_functions[] = { PHP_FE(snmpget, NULL) - PHP_FE(snmpwalk, NULL) - PHP_FE(snmprealwalk, NULL) + PHP_FE(snmpwalk, NULL) + PHP_FE(snmprealwalk, NULL) + PHP_FE(snmpwalkoid, NULL) + PHP_FE(snmp_get_quick_print, NULL) + PHP_FE(snmp_set_quick_print, NULL) + PHP_FE(snmpset, NULL) {NULL,NULL,NULL} }; @@ -99,14 +109,22 @@ /* - * Generic SNMP object fetcher - * - * st=1 GET - * st=2 WALK - * st=3 WALK (returns OIDs additionally) - */ +* Generic SNMP object fetcher +* +* 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,4 snmprealwalk() and snmpwalkoid() - walk the mib and return an +* array of oid,value pairs. +* st=5-8 ** Reserved ** +* st=9 snmp_get_quick_print() - Return the current value for quickprint +* (default setting is 0 (false)). +* st=10 snmp_set_quick_print() - Set the current value for quickprint +* st=11 snmpset() - query an agent and set a single value +* +*/ void _php3_snmp(INTERNAL_FUNCTION_PARAMETERS, int st) { - pval *a1, *a2, *a3, *a4, *a5; + pval *a1, *a2, *a3, *a4, *a5, *a6, *a7; struct snmp_session session, *ss; struct snmp_pdu *pdu=NULL, *response; struct variable_list *vars; @@ -121,171 +139,244 @@ long timeout=SNMP_DEFAULT_TIMEOUT; long retries=SNMP_DEFAULT_RETRIES; int myargc = ARG_COUNT(ht); - - if (myargc<3 || myargc>5 || getParameters(ht, myargc, &a1, &a2, &a3, &a4, &a5) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_string(a1); - convert_to_string(a2); - convert_to_string(a3); - if(myargc>3) { - convert_to_long(a4); - timeout=a4->value.lval; - } - if(myargc>4) { - convert_to_long(a5); - retries=a5->value.lval; - } - objid=a3->value.str.val; - - if (st>=2) { /* walk */ - rootlen = MAX_NAME_LEN; - if (strlen(objid)) { /* on a walk, an empty string means top of tree - no error */ - if (read_objid(objid, root, &rootlen)) { - gotroot = 1; - } else { - php_error(E_WARNING,"Invalid object identifier: %s\n", objid); - } - } - if (gotroot == 0) { - memmove((char *)root, (char *)objid_mib, sizeof(objid_mib)); - rootlen = sizeof(objid_mib) / sizeof(oid); - gotroot = 1; - } - } - - memset(&session, 0, sizeof(struct snmp_session)); - session.peername = a1->value.str.val; - - session.version = SNMP_VERSION_1; - /* - * FIXME: potential memory leak - * This is a workaround for an "artifact" (Mike Slifcak) - * in (at least) ucd-snmp 3.6.1 which frees - * memory it did not allocate - */ -#ifdef UCD_SNMP_HACK - session.community = (u_char *) strdup(a2->value.str.val); -#else - session.community = (u_char *) a2->value.str.val; -#endif - session.community_len = a2->value.str.len; - session.retries = retries; - session.timeout = timeout; - - session.authenticator = NULL; - snmp_synch_setup(&session); - ss = snmp_open(&session); - if (ss == NULL){ - php_error(E_WARNING,"Couldn't open snmp\n"); - RETURN_FALSE; - } - if (st>=2) { - memmove((char *)name, (char *)root, rootlen * sizeof(oid)); - name_length = rootlen; - /* prepare result array */ - array_init(return_value); - } - - while(keepwalking) { - keepwalking=0; - if (st==1) pdu = snmp_pdu_create(SNMP_MSG_GET); - else if (st>=2) pdu = snmp_pdu_create(SNMP_MSG_GETNEXT); - - if (st==1) { - name_length = MAX_NAME_LEN; - if (!read_objid(objid, name, &name_length)) { - php_error(E_WARNING,"Invalid object identifier: %s\n", objid); - RETURN_FALSE; - } - } - snmp_add_null_var(pdu, name, name_length); - -retry: - status = snmp_synch_response(ss, pdu, &response); - if (status == STAT_SUCCESS) { - if (response->errstat == SNMP_ERR_NOERROR) { - for(vars = response->variables; vars; vars = vars->next_variable) { - if (st>=2 && (vars->name_length < rootlen || memcmp(root, vars->name, rootlen * sizeof(oid)))) - continue; /* not part of this subtree */ - - sprint_value(buf,vars->name, vars->name_length, vars); -#if 0 - Debug("snmp response is: %s\n",buf); -#endif - if (st==1) { - RETVAL_STRING(buf,1); - } else if (st==2) { - /* Add to returned array */ - add_next_index_string(return_value,buf,1); - } else if (st==3) { - sprint_objid(buf2, name, name_length); - add_assoc_string(return_value,buf2,buf,1); - } - if (st>=2) { - if (vars->type != SNMP_ENDOFMIBVIEW && vars->type != SNMP_NOSUCHOBJECT && vars->type != SNMP_NOSUCHINSTANCE) { - memmove((char *)name, (char *)vars->name,vars->name_length * sizeof(oid)); - name_length = vars->name_length; - keepwalking = 1; - } - } - } - } else { - if (st!=2 || response->errstat != SNMP_ERR_NOSUCHNAME) { - php_error(E_WARNING,"Error in packet.\nReason: %s\n", snmp_errstring(response->errstat)); - if (response->errstat == SNMP_ERR_NOSUCHNAME) { - for(count=1, vars = response->variables; vars && count != response->errindex; - vars = vars->next_variable, count++); - if (vars) sprint_objid(buf,vars->name, vars->name_length); - php_error(E_WARNING,"This name does not exist: %s\n",buf); - } - if (st==1) { - if ((pdu = snmp_fix_pdu(response, SNMP_MSG_GET)) != NULL) goto retry; - } else if (st>=2) { - if ((pdu = snmp_fix_pdu(response, SNMP_MSG_GETNEXT)) != NULL) goto retry; - } - RETURN_FALSE; - } - } - } else if (status == STAT_TIMEOUT) { - php_error(E_WARNING,"No Response from %s\n", a1->value.str.val); - RETURN_FALSE; - } else { /* status == STAT_ERROR */ - php_error(E_WARNING,"An error occurred, Quitting\n"); - RETURN_FALSE; - } - if (response) snmp_free_pdu(response); - } /* keepwalking */ - snmp_close(ss); + char type; + char *value; + + switch(st) { + case 4: + st = 3; /* This is temporary until snmprealwalk() is removed */ + break; + case 9: + RETURN_LONG(snmp_get_quick_print()?1:0); + case 10: + if(myargc != 1 || getParameters(ht, myargc, &a1)) WRONG_PARAM_COUNT; + convert_to_long(a1); + snmp_set_quick_print((int) a1->value.lval); + RETURN_TRUE; + } + + if (myargc<3 || myargc>7 || getParameters(ht, myargc, &a1, &a2, &a3, &a4, &a5, &a6, &a7) == FAILURE) { + WRONG_PARAM_COUNT; + } + convert_to_string(a1); + convert_to_string(a2); + convert_to_string(a3); + if (st==11) { + if (myargc<5) WRONG_PARAM_COUNT; + convert_to_string(a4); + convert_to_string(a5); + if(myargc>5) { + convert_to_long(a6); + timeout=a6->value.lval; + } + if(myargc>6) { + convert_to_long(a7); + retries=a7->value.lval; + } + type = a4->value.str.val[0]; + value = a5->value.str.val; + } else { + if(myargc>3) { + convert_to_long(a4); + timeout=a4->value.lval; + } + if(myargc>4) { + convert_to_long(a5); + retries=a5->value.lval; + } + } + objid=a3->value.str.val; + + if (st>=2) { /* walk */ + rootlen = MAX_NAME_LEN; + if (strlen(objid)) { /* on a walk, an empty string means top of tree - no error */ + if (read_objid(objid, root, &rootlen)) { + gotroot = 1; + } else { + php_error(E_WARNING,"Invalid object identifier: %s\n", objid); + } + } + if (gotroot == 0) { + memmove((char *)root, (char *)objid_mib, sizeof(objid_mib)); + rootlen = sizeof(objid_mib) / sizeof(oid); + gotroot = 1; + } + } + + memset(&session, 0, sizeof(struct snmp_session)); + session.peername = a1->value.str.val; + + session.version = SNMP_VERSION_1; + /* + * FIXME: potential memory leak + * This is a workaround for an "artifact" (Mike Slifcak) + * in (at least) ucd-snmp 3.6.1 which frees + * memory it did not allocate + */ +#ifdef UCD_SNMP_HACK + session.community = (u_char *) strdup(a2->value.str.val); +#else + session.community = (u_char *) a2->value.str.val; +#endif + session.community_len = a2->value.str.len; + session.retries = retries; + session.timeout = timeout; + + session.authenticator = NULL; + snmp_synch_setup(&session); + ss = snmp_open(&session); + if (ss == NULL){ + php_error(E_WARNING,"Couldn't open snmp\n"); + RETURN_FALSE; + } + if (st>=2) { + memmove((char *)name, (char *)root, rootlen * sizeof(oid)); + name_length = rootlen; + /* prepare result array */ + array_init(return_value); + } + + while(keepwalking) { + keepwalking=0; + if (st==1) pdu = snmp_pdu_create(SNMP_MSG_GET); + else if (st==11) pdu = snmp_pdu_create(SNMP_MSG_SET); + else if (st>=2) pdu = snmp_pdu_create(SNMP_MSG_GETNEXT); + + if (st==1) { + name_length = MAX_NAME_LEN; + if (!read_objid(objid, name, &name_length)) { + php_error(E_WARNING,"Invalid object identifier: %s\n", objid); + RETURN_FALSE; + } + } + if (st!=11) + snmp_add_null_var(pdu, name, name_length); + else { + if (snmp_add_var(pdu, name, name_length, type, value)) { + php_error(E_WARNING,"Could not add variable: %s\n", name); + RETURN_FALSE; + } + } + +retry: + status = snmp_synch_response(ss, pdu, &response); + if (status == STAT_SUCCESS) { + if (response->errstat == SNMP_ERR_NOERROR) { + for(vars = response->variables; vars; vars = vars->next_variable) { + if (st>=2 && st!=11 && (vars->name_length < rootlen || memcmp(root, vars->name, rootlen * sizeof(oid)))) + continue; /* not part of this subtree */ + + if (st!=11) + sprint_value(buf,vars->name, vars->name_length, vars); +#if 0 + Debug("snmp response is: %s\n",buf); +#endif + if (st==1) { + RETVAL_STRING(buf,1); + } else if (st==2) { + /* Add to returned array */ + add_next_index_string(return_value,buf,1); + } else if (st==3) { + sprint_objid(buf2, vars->name, vars->name_length); + add_assoc_string(return_value,buf2,buf,1); + } + if (st>=2 && st!=11) { + if (vars->type != SNMP_ENDOFMIBVIEW && vars->type != SNMP_NOSUCHOBJECT && vars->type != SNMP_NOSUCHINSTANCE) { + memmove((char *)name, (char *)vars->name,vars->name_length * sizeof(oid)); + name_length = vars->name_length; + keepwalking = 1; + } + } + } + } else { + if (st!=2 || response->errstat != SNMP_ERR_NOSUCHNAME) { + php_error(E_WARNING,"Error in packet.\nReason: %s\n", snmp_errstring(response->errstat)); + if (response->errstat == SNMP_ERR_NOSUCHNAME) { + for(count=1, vars = response->variables; vars && count != response->errindex; + vars = vars->next_variable, count++); + if (vars) sprint_objid(buf,vars->name, vars->name_length); + php_error(E_WARNING,"This name does not exist: %s\n",buf); + } + if (st==1) { + if ((pdu = snmp_fix_pdu(response, SNMP_MSG_GET)) != NULL) goto retry; + } else if (st==11) { + if ((pdu = snmp_fix_pdu(response, SNMP_MSG_SET)) != NULL) goto retry; + } else if (st>=2) { + if ((pdu = snmp_fix_pdu(response, SNMP_MSG_GETNEXT)) != NULL) goto retry; + } + RETURN_FALSE; + } + } + } else if (status == STAT_TIMEOUT) { + php_error(E_WARNING,"No Response from %s\n", a1->value.str.val); + RETURN_FALSE; + } else { /* status == STAT_ERROR */ + php_error(E_WARNING,"An error occurred, Quitting\n"); + RETURN_FALSE; + } + if (response) snmp_free_pdu(response); + } /* keepwalking */ + snmp_close(ss); } /* {{{ proto string snmpget(string host, string community, string object_id [, int timeout [, int retries]]) - Fetch an SNMP object */ +Fetch an SNMP object */ PHP_FUNCTION(snmpget) { _php3_snmp(INTERNAL_FUNCTION_PARAM_PASSTHRU,1); } /* }}} */ /* {{{ proto string snmpwalk(string host, string community, string object_id [, int timeout [, int retries]]) - Return all objects under the specified object id */ +Return all objects under the specified object id */ PHP_FUNCTION(snmpwalk) { return _php3_snmp(INTERNAL_FUNCTION_PARAM_PASSTHRU,2); } /* }}} */ /* {{{ proto string snmprealwalk(string host, string community, string object_id [, int timeout [, int retries]]) - Return all objects including their respective object id withing the specified one */ +Return all objects including their respective object id withing the specified one */ PHP_FUNCTION(snmprealwalk) { return _php3_snmp(INTERNAL_FUNCTION_PARAM_PASSTHRU,3); } /* }}} */ + +/* {{{ proto string snmprealoid(string host, string community, string object_id [, int timeout [, int retries]]) +Return all objects including their respective object id withing the specified one */ +PHP_FUNCTION(snmpwalkoid) +{ + _php3_snmp(INTERNAL_FUNCTION_PARAM_PASSTHRU,4); +} +/* }}} */ + +/* {{{ proto int snmp_get_quick_print(void) +Return the current status of quick_print */ +PHP_FUNCTION(snmp_get_quick_print) +{ + _php3_snmp(INTERNAL_FUNCTION_PARAM_PASSTHRU,9); +} +/* }}} */ + +/* {{{ proto void snmp_set_quick_print(int quick_print) +Return all objects including their respective object id withing the specified one */ +PHP_FUNCTION(snmp_set_quick_print) +{ + _php3_snmp(INTERNAL_FUNCTION_PARAM_PASSTHRU,10); +} +/* }}} */ + +/* {{{ proto int snmpset(string host, string community, string object_id, string type, mixed value [, int timeout [, int retries]]) +Set the value of a SNMP object */ +PHP_FUNCTION(php3_snmpset) { + _php3_snmp(INTERNAL_FUNCTION_PARAM_PASSTHRU,11); +} +/* }}} */ #endif /* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ +* Local variables: +* tab-width: 4 +* c-basic-offset: 4 +* End: +*/ Index: php4/ext/snmp/php3_snmp.h diff -u php4/ext/snmp/php3_snmp.h:1.3 php4/ext/snmp/php3_snmp.h:1.4 --- php4/ext/snmp/php3_snmp.h:1.3 Fri May 21 06:06:18 1999 +++ php4/ext/snmp/php3_snmp.h Wed Aug 4 16:56:33 1999 @@ -1,32 +1,24 @@ -/* - +----------------------------------------------------------------------+ - | PHP HTML Embedded Scripting Language Version 3.0 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997,1998 PHP Development Team (See Credits file) | - +----------------------------------------------------------------------+ - | This program is free software; you can redistribute it and/or modify | - | it under the terms of one of the following licenses: | - | | - | A) the GNU General Public License as published by the Free Software | - | Foundation; either version 2 of the License, or (at your option) | - | any later version. | - | | - | B) the PHP License as published by the PHP Development Team and | - | included in the distribution in the file: LICENSE | - | | - | This program is distributed in the hope that it will be useful, | - | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | GNU General Public License for more details. | - | | - | You should have received a copy of both licenses referred to here. | - | If you did not, or have any questions about PHP licensing, please | - | contact core@php.net. | - +----------------------------------------------------------------------+ - | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> | - +----------------------------------------------------------------------+ - */ -/* $Id: php3_snmp.h,v 1.3 1999/05/21 10:06:18 sas Exp $ */ +/* ++----------------------------------------------------------------------+ +| PHP version 4.0 | ++----------------------------------------------------------------------+ +| Copyright (c) 1997, 1998, 1999 The PHP Group | ++----------------------------------------------------------------------+ +| This source file is subject to version 2.0 of the PHP license, | +| that is bundled with this package in the file LICENSE, and is | +| available at through the world-wide-web at | +| http://www.php.net/license/2_0.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@lerdorf.on.ca> | +| Mike Jackson <mhjack@tscnet.com> | +| Steven Lawrance <slawrance@technologist.com> | ++----------------------------------------------------------------------+ +*/ + +/* $Id: php3_snmp.h,v 1.4 1999/08/04 20:56:33 slawrance Exp $ */ #ifndef _PHP3_SNMP_H #define _PHP3_SNMP_H @@ -46,6 +38,10 @@ PHP_FUNCTION(snmpget); PHP_FUNCTION(snmpwalk); PHP_FUNCTION(snmprealwalk); +PHP_FUNCTION(snmpwalkoid); +PHP_FUNCTION(snmp_get_quick_print); +PHP_FUNCTION(snmp_set_quick_print); +PHP_FUNCTION(snmpset); void php3_info_snmp(ZEND_MODULE_INFO_FUNC_ARGS); #else

« previous php.version4 (#3121) next »