From: Tadashi Oh-Ya Date: 2002-12-17T19:59:00+09:00 Subject: [ruby-list:36796] Ruby SNMPについて おおやと申します。 RubyでSNMPが使いたくて http://www.ruby-lang.org/~knu/cgi-bin/cvsweb.cgi/lib/snmp/ からソースを頂いて試してみました。 # Akinori MUSHA 様ありがとうございます。 OCTET STRING(MACアドレスなど)がうまくデコードできないよう でしたので、UCD-SNMP-4.2.6/appsのソースを見たりして、直して みたところ、一応 OCTET が表示されるようにはなったのですが、 表示形式がうまく行きません。 <最初に得られた出力> 1.3.6.1.2.1.17.1.1.0 =^@F"vN (コントロールコードは無視してください) <ソースに手を入れた後で得られる出力> 1.3.6.1.2.1.17.1.1.0 = 80462276ce <欲しい出力> 1.3.6.1.2.1.17.1.1.0 = 08 00 46 22 76 ce プログラム初心者で恥ずかしいのですが、diff -cの結果を添付 いたします。 どなたかアドバイスいただけましたら嬉しいです。 -------------------------------ここから------------------------------- *** snmp_sess.c.orig Sat Dec 14 11:55:27 2002 --- snmp_sess.c Tue Dec 17 19:13:26 2002 *************** *** 525,537 **** struct variable_list *var; size_t i; VALUE ary; Data_Get_Struct(csnmpvar, struct variable_list, var); switch(var->type) { case ASN_INTEGER: return INT2NUM(*var->val.integer); case ASN_OCTET_STR: ! return rb_str_new(var->val.string, var->val_len); case ASN_OPAQUE: return Qnil; case ASN_OBJECT_ID: --- 525,555 ---- struct variable_list *var; size_t i; VALUE ary; + int ishex = 0, x = 0; + u_char *cp; Data_Get_Struct(csnmpvar, struct variable_list, var); switch(var->type) { case ASN_INTEGER: return INT2NUM(*var->val.integer); case ASN_OCTET_STR: ! ishex = 0; ! for(cp = var->val.string, x = 0; x < (int)var->val_len; x++, cp++) { ! if (!(isprint(*cp) || isspace(*cp))) { ! ishex = 1; ! } ! } ! ! if(ishex) { /* value is hex */ ! /* ary = rb_ary_new2((int)var->val_len); */ ! ary = rb_ary_new(); ! for(cp = var->val.string, x = 0; x < (int)var->val_len; x++, cp++) { ! rb_ary_push(ary, rb_big2str(rb_int2inum(*cp), 16)); ! } ! return ary; ! } else { /* value is string */ ! return rb_str_new(var->val.string, var->val_len); ! } case ASN_OPAQUE: return Qnil; case ASN_OBJECT_ID: -------------------------------ここまで-------------------------------