diff options
author | Steven Lawrance <slawrance@php.net> | 1999-08-04 20:56:33 +0000 |
---|---|---|
committer | Steven Lawrance <slawrance@php.net> | 1999-08-04 20:56:33 +0000 |
commit | 2aa4138668388c3526a4ca3d20a235b051a774fc (patch) | |
tree | 7b9d1fc6197c5cf8261a81bdf09fc32ef91668e1 /ext | |
parent | 1570c5b30e02ddec9ade660df3198b3cf5d28554 (diff) | |
download | php-git-2aa4138668388c3526a4ca3d20a235b051a774fc.tar.gz |
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.
Diffstat (limited to 'ext')
-rw-r--r-- | ext/snmp/php3_snmp.h | 50 | ||||
-rw-r--r-- | ext/snmp/snmp.c | 217 |
2 files changed, 177 insertions, 90 deletions
diff --git a/ext/snmp/php3_snmp.h b/ext/snmp/php3_snmp.h index de68105ff7..047d3ebf1a 100644 --- a/ext/snmp/php3_snmp.h +++ b/ext/snmp/php3_snmp.h @@ -1,31 +1,23 @@ /* - +----------------------------------------------------------------------+ - | 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> | - +----------------------------------------------------------------------+ - */ ++----------------------------------------------------------------------+ +| 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$ */ #ifndef _PHP3_SNMP_H #define _PHP3_SNMP_H @@ -46,6 +38,10 @@ extern int php3i_snmp_init(INIT_FUNC_ARGS); 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 diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index fa709fe097..e354b0de95 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -1,20 +1,22 @@ /* - +----------------------------------------------------------------------+ - | 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> | - +----------------------------------------------------------------------+ - */ ++----------------------------------------------------------------------+ +| 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$ */ #include "php.h" @@ -33,7 +35,11 @@ #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 @@ -73,8 +79,12 @@ void sprint_variable(char *, oid *, int, struct variable_list *); 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 @@ void php3_info_snmp(ZEND_MODULE_INFO_FUNC_ARGS) { /* - * 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,20 +139,51 @@ void _php3_snmp(INTERNAL_FUNCTION_PARAMETERS, int st) { long timeout=SNMP_DEFAULT_TIMEOUT; long retries=SNMP_DEFAULT_RETRIES; int myargc = ARG_COUNT(ht); + char type; + char *value; - if (myargc<3 || myargc>5 || getParameters(ht, myargc, &a1, &a2, &a3, &a4, &a5) == FAILURE) { + 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(myargc>3) { - convert_to_long(a4); - timeout=a4->value.lval; - } - if(myargc>4) { - convert_to_long(a5); - retries=a5->value.lval; + 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; @@ -147,23 +196,23 @@ void _php3_snmp(INTERNAL_FUNCTION_PARAMETERS, int st) { php_error(E_WARNING,"Invalid object identifier: %s\n", objid); } } - if (gotroot == 0) { + if (gotroot == 0) { memmove((char *)root, (char *)objid_mib, sizeof(objid_mib)); - rootlen = sizeof(objid_mib) / sizeof(oid); - gotroot = 1; - } + 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 - */ + * 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 @@ -172,7 +221,7 @@ void _php3_snmp(INTERNAL_FUNCTION_PARAMETERS, int st) { session.community_len = a2->value.str.len; session.retries = retries; session.timeout = timeout; - + session.authenticator = NULL; snmp_synch_setup(&session); ss = snmp_open(&session); @@ -186,12 +235,13 @@ void _php3_snmp(INTERNAL_FUNCTION_PARAMETERS, int st) { /* 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)) { @@ -199,17 +249,25 @@ void _php3_snmp(INTERNAL_FUNCTION_PARAMETERS, int st) { RETURN_FALSE; } } - snmp_add_null_var(pdu, name, name_length); - + 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 && (vars->name_length < rootlen || memcmp(root, vars->name, rootlen * sizeof(oid)))) + if (st>=2 && st!=11 && (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 (st!=11) + sprint_value(buf,vars->name, vars->name_length, vars); #if 0 Debug("snmp response is: %s\n",buf); #endif @@ -219,10 +277,10 @@ retry: /* Add to returned array */ add_next_index_string(return_value,buf,1); } else if (st==3) { - sprint_objid(buf2, name, name_length); + sprint_objid(buf2, vars->name, vars->name_length); add_assoc_string(return_value,buf2,buf,1); } - if (st>=2) { + 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; @@ -235,12 +293,14 @@ retry: 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++); + 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; } @@ -260,32 +320,63 @@ retry: } /* {{{ 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: +*/ |