@@ -421,6 +421,10 @@ const zend_function_entry snmp_functions[] = {
421
421
#define SNMP_CMD_WALK (1<<3)
422
422
/* force values-only output */
423
423
#define SNMP_NUMERIC_KEYS (1<<7)
424
+ /* use user-supplied OID names for keys in array output mode in GET method */
425
+ #define SNMP_ORIGINAL_NAMES_AS_KEYS (1<<8)
426
+ /* use OID suffix (`index') for keys in array output mode in WALK method */
427
+ #define SNMP_USE_SUFFIX_AS_KEYS (1<<9)
424
428
425
429
#ifdef COMPILE_DL_SNMP
426
430
ZEND_GET_MODULE (snmp )
@@ -677,7 +681,7 @@ static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st,
677
681
oid root [MAX_NAME_LEN ];
678
682
size_t rootlen = 0 ;
679
683
int gotroot = 0 ;
680
- int status , count ;
684
+ int status , count , found ;
681
685
char buf [2048 ];
682
686
char buf2 [2048 ];
683
687
int keepwalking = 1 ;
@@ -716,6 +720,10 @@ static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st,
716
720
memmove ((char * )name , (char * )root , rootlen * sizeof (oid ));
717
721
name_length = rootlen ;
718
722
objid_query -> offset = objid_query -> count ;
723
+
724
+ memmove ((char * )objid_query -> vars [0 ].name , (char * )root , rootlen * sizeof (oid ));
725
+ objid_query -> vars [0 ].name_length = rootlen ;
726
+
719
727
}
720
728
721
729
if ((ss = snmp_open (session )) == NULL ) {
@@ -731,11 +739,11 @@ static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st,
731
739
if (st & (SNMP_CMD_GET | SNMP_CMD_GETNEXT )) {
732
740
pdu = snmp_pdu_create ((st & SNMP_CMD_GET ) ? SNMP_MSG_GET : SNMP_MSG_GETNEXT );
733
741
for (count = 0 ; objid_query -> offset < objid_query -> count && count < objid_query -> step ; objid_query -> offset ++ , count ++ ){
734
- name_length = MAX_OID_LEN ;
735
- if (!snmp_parse_oid (objid_query -> vars [objid_query -> offset ].oid , name , & name_length )) {
742
+ objid_query -> vars [ objid_query -> offset ]. name_length = MAX_OID_LEN ;
743
+ if (!snmp_parse_oid (objid_query -> vars [objid_query -> offset ].oid , objid_query -> vars [ objid_query -> offset ]. name , & ( objid_query -> vars [ objid_query -> offset ]. name_length ) )) {
736
744
php_error_docref (NULL TSRMLS_CC , E_WARNING , "Invalid object identifier: %s" , objid_query -> vars [objid_query -> offset ].oid );
737
745
} else {
738
- snmp_add_null_var (pdu , name , name_length );
746
+ snmp_add_null_var (pdu , objid_query -> vars [ objid_query -> offset ]. name , objid_query -> vars [ objid_query -> offset ]. name_length );
739
747
}
740
748
}
741
749
if (pdu -> variables == NULL ){
@@ -747,16 +755,16 @@ static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st,
747
755
} else if (st & SNMP_CMD_SET ) {
748
756
pdu = snmp_pdu_create (SNMP_MSG_SET );
749
757
for (count = 0 ; objid_query -> offset < objid_query -> count && count < objid_query -> step ; objid_query -> offset ++ , count ++ ){
750
- name_length = MAX_OID_LEN ;
751
- if (!snmp_parse_oid (objid_query -> vars [objid_query -> offset ].oid , name , & name_length )) {
758
+ objid_query -> vars [ objid_query -> offset ]. name_length = MAX_OID_LEN ;
759
+ if (!snmp_parse_oid (objid_query -> vars [objid_query -> offset ].oid , objid_query -> vars [ objid_query -> offset ]. name , & ( objid_query -> vars [ objid_query -> offset ]. name_length ) )) {
752
760
php_error_docref (NULL TSRMLS_CC , E_WARNING , "Invalid object identifier: %s" , objid_query -> vars [objid_query -> offset ].oid );
753
761
snmp_free_pdu (pdu );
754
762
snmp_close (ss );
755
763
RETVAL_FALSE ;
756
764
return ;
757
765
} else {
758
- if ((snmp_errno = snmp_add_var (pdu , name , name_length , objid_query -> vars [objid_query -> offset ].type , objid_query -> vars [objid_query -> offset ].value ))) {
759
- snprint_objid (buf , sizeof (buf ), name , name_length );
766
+ if ((snmp_errno = snmp_add_var (pdu , objid_query -> vars [ objid_query -> offset ]. name , objid_query -> vars [ objid_query -> offset ]. name_length , objid_query -> vars [objid_query -> offset ].type , objid_query -> vars [objid_query -> offset ].value ))) {
767
+ snprint_objid (buf , sizeof (buf ), objid_query -> vars [ objid_query -> offset ]. name , objid_query -> vars [ objid_query -> offset ]. name_length );
760
768
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 ));
761
769
snmp_free_pdu (pdu );
762
770
snmp_close (ss );
@@ -823,6 +831,34 @@ static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st,
823
831
}
824
832
if (st & SNMP_NUMERIC_KEYS ) {
825
833
add_next_index_zval (return_value , snmpval );
834
+ } else if (st & SNMP_ORIGINAL_NAMES_AS_KEYS && st & SNMP_CMD_GET ) {
835
+ found = 0 ;
836
+ for (count = 0 ; count < objid_query -> count ; count ++ ) {
837
+ if (objid_query -> vars [count ].name_length == vars -> name_length && snmp_oid_compare (objid_query -> vars [count ].name , objid_query -> vars [count ].name_length , vars -> name , vars -> name_length ) == 0 ) {
838
+ found = 1 ;
839
+ objid_query -> vars [count ].name_length = 0 ; /* mark this name as used */
840
+ break ;
841
+ }
842
+ }
843
+ if (found ) {
844
+ add_assoc_zval (return_value , objid_query -> vars [count ].oid , snmpval );
845
+ } else {
846
+ snprint_objid (buf2 , sizeof (buf2 ), vars -> name , vars -> name_length );
847
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Could not find original OID name for '%s'" , buf2 );
848
+ }
849
+ } else if (st & SNMP_USE_SUFFIX_AS_KEYS && st & SNMP_CMD_WALK ) {
850
+ snprint_objid (buf2 , sizeof (buf2 ), vars -> name , vars -> name_length );
851
+ if (objid_query -> vars [0 ].name_length <= vars -> name_length && snmp_oid_compare (objid_query -> vars [0 ].name , objid_query -> vars [0 ].name_length , vars -> name , objid_query -> vars [0 ].name_length ) == 0 ) {
852
+ buf2 [0 ] = '\0' ;
853
+ count = objid_query -> vars [0 ].name_length ;
854
+ while (count < vars -> name_length ){
855
+ sprintf (buf , "%lu." , vars -> name [count ]);
856
+ strcat (buf2 , buf );
857
+ count ++ ;
858
+ }
859
+ buf2 [strlen (buf2 ) - 1 ] = '\0' ; /* remove trailing '.' */
860
+ }
861
+ add_assoc_zval (return_value , buf2 , snmpval );
826
862
} else {
827
863
snprint_objid (buf2 , sizeof (buf2 ), vars -> name , vars -> name_length );
828
864
add_assoc_zval (return_value , buf2 , snmpval );
@@ -1276,6 +1312,7 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
1276
1312
zval * * oid , * * value , * * type ;
1277
1313
char * a1 , * a2 , * a3 , * a4 , * a5 , * a6 , * a7 ;
1278
1314
int a1_len , a2_len , a3_len , a4_len , a5_len , a6_len , a7_len ;
1315
+ zend_bool use_orignames = 0 , suffix_keys = 0 ;
1279
1316
long timeout = SNMP_DEFAULT_TIMEOUT ;
1280
1317
long retries = SNMP_DEFAULT_RETRIES ;
1281
1318
int argc = ZEND_NUM_ARGS ();
@@ -1327,12 +1364,21 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
1327
1364
RETURN_FALSE ;
1328
1365
}
1329
1366
} else if (st & SNMP_CMD_WALK ) {
1330
- if (zend_parse_parameters (argc TSRMLS_CC , "Z|ll " , & oid , & (objid_query .non_repeaters ), & (objid_query .max_repetitions )) == FAILURE ) {
1367
+ if (zend_parse_parameters (argc TSRMLS_CC , "Z|bll " , & oid , & suffix_keys , & (objid_query .non_repeaters ), & (objid_query .max_repetitions )) == FAILURE ) {
1331
1368
RETURN_FALSE ;
1332
1369
}
1370
+ if (suffix_keys ) {
1371
+ st |= SNMP_USE_SUFFIX_AS_KEYS ;
1372
+ }
1373
+ } else if (st & SNMP_CMD_GET ) {
1374
+ if (zend_parse_parameters (argc TSRMLS_CC , "Z|b" , & oid , & use_orignames ) == FAILURE ) {
1375
+ RETURN_FALSE ;
1376
+ }
1377
+ if (use_orignames ) {
1378
+ st |= SNMP_ORIGINAL_NAMES_AS_KEYS ;
1379
+ }
1333
1380
} else {
1334
- /* SNMP_CMD_GET
1335
- * SNMP_CMD_GETNEXT
1381
+ /* SNMP_CMD_GETNEXT
1336
1382
*/
1337
1383
if (zend_parse_parameters (argc TSRMLS_CC , "Z" , & oid ) == FAILURE ) {
1338
1384
RETURN_FALSE ;
0 commit comments