From: Fumitoshi UKAI Date: 2002-12-20T11:36:04+09:00 Subject: [ruby-dev:19134] lib/snmp bugs 鵜飼です。 どこになげればいいのかよくわからなかったので、ここになげてみます。 lib/snmp なんですがいくつかバグとかがあるのでなおしてみました。 * MIBView.new で OIDを指定してとれないのが悲しいのでOIDも指定できる ようにした * get, getnext, walk で get_node()よりも snmp_parse_oid()した方が便利 * SNMPValue.value で OIDの時にvalueの方もnameと同じものとれていた。 また IP Address はそのままintよりも a dotted-quad IP address に なってた方が便利 (rubyではIP addressはだいたいこの形式で使われるので) # OIDが value で int arrayになっているので # 引数であたえる時も int array でつかえるように # できた方が便利かも。 Index: mib.c =================================================================== RCS file: /src/lib/snmp/mib.c,v retrieving revision 1.3 diff -u -u -p -r1.3 mib.c --- mib.c 6 May 2002 04:11:24 -0000 1.3 +++ mib.c 20 Dec 2002 02:26:28 -0000 @@ -134,6 +134,13 @@ VALUE rb_cmibview_new(VALUE cmibview, VA /* Find in any modules. */ tp = find_tree_node(RSTRING(mib_str)->ptr, -1); + if (tp == NULL) { + oid anOID[MAX_OID_LEN]; + size_t oidlen = MAX_OID_LEN; + if (snmp_parse_oid(RSTRING(mib_str)->ptr, anOID, &oidlen)) { + tp = get_tree(anOID, oidlen, get_tree_head()); + } + } if (tp == NULL) rb_raise(rb_eSNMP, "%s not found in MIB tree.", RSTRING(mib_str)->ptr); Index: snmp_sess.c =================================================================== RCS file: /src/lib/snmp/snmp_sess.c,v retrieving revision 1.3 diff -u -u -p -r1.3 snmp_sess.c --- snmp_sess.c 6 May 2002 04:11:24 -0000 1.3 +++ snmp_sess.c 20 Dec 2002 02:26:28 -0000 @@ -297,7 +297,7 @@ static VALUE rb_csnmp_get(VALUE csnmp, V for(i=0;ilen;i++) { obj = rb_ary_entry(obj_name, i); - if(!get_node(RSTRING(obj)->ptr, anOID, &anOID_len)) { + if(!snmp_parse_oid(RSTRING(obj)->ptr, anOID, &anOID_len)) { snmp_free_pdu(pdu); rb_raise(rb_eSNMPUnknownOID, snmp_api_errstring(snmp_errno)); } @@ -347,7 +347,7 @@ static VALUE rb_csnmp_getnext(VALUE csnm pdu = snmp_pdu_create(SNMP_MSG_GETNEXT); for(i=0;ilen;i++) { obj = rb_ary_entry(obj_name, i); - if(!get_node(RSTRING(obj)->ptr, anOID, &anOID_len)) { + if(!snmp_parse_oid(RSTRING(obj)->ptr, anOID, &anOID_len)) { snmp_free_pdu(pdu); rb_raise(rb_eSNMPUnknownOID, snmp_api_errstring(snmp_errno)); } @@ -429,7 +429,7 @@ static VALUE rb_csnmp_walk(VALUE csnmp, rp = results+i; obj = rb_ary_entry(obj_names, i); op->len = MAX_OID_LEN; - if(!get_node(RSTRING(obj)->ptr, op->OID, &(op->len))) { + if(!snmp_parse_oid(RSTRING(obj)->ptr, op->OID, &(op->len))) { rb_raise(rb_eSNMPUnknownOID, snmp_api_errstring(snmp_errno)); } memcpy((void*)rp->OID, (void*)op->OID, sizeof(oid)*MAX_OID_LEN); @@ -535,9 +535,9 @@ static VALUE rb_csnmpvar_value(VALUE csn case ASN_OPAQUE: return Qnil; case ASN_OBJECT_ID: - ary = rb_ary_new2(var->name_length); - for(i=0;iname_length;i++) - rb_ary_store(ary, (int)i, INT2FIX((int)((var->name)[i]))); + ary = rb_ary_new2(var->val_len/sizeof(int)); + for(i=0;ival_len/sizeof(int);i++) + rb_ary_store(ary, (int)i, INT2FIX((int)((var->val.objid)[i]))); return ary; case ASN_TIMETICKS: return rb_uint2inum(*var->val.integer); @@ -546,7 +546,12 @@ static VALUE rb_csnmpvar_value(VALUE csn case ASN_COUNTER: return rb_uint2inum(*var->val.integer); case ASN_IPADDRESS: - return rb_uint2inum(*var->val.integer); + { + char ip[32]; + unsigned char *s = var->val.string; + snprintf(ip, sizeof(ip), "%d.%d.%d.%d", s[0], s[1], s[2], s[3]); + return rb_str_new(ip, strlen(ip)); + } case ASN_NULL: return Qnil; case ASN_UINTEGER: -- 鵜飼文敏