独自の SNMP エージェントを使用していますが、文字列の処理に問題があります。私もSNMPにはかなり慣れていません。
独自のエージェントの実装については、次のリンクを参照しました。
http://www.net-snmp.org/dev/agent/ucdDemoPublic_8c_source.html
http://www.net-snmp.org/dev/agent/example_8h_source.html
2 番目のリンクは、ユーザーが整数型の MIB オブジェクトを設定しようとしたときの処理方法を正確に示しています。
行 657 ショー:
intval = *((long *) var_val);
私の質問: 文字列を使ってどうすればいいですか? strncpy、snprintfなどをキャストしてみました。
私の仕事 :
私は、以下が合法であることを知っているか、少なくとも考えています。
int
setString(int action,
u_char * var_val,
u_char var_val_type,
size_t var_val_len,
u_char * statP, oid * name, size_t name_len)
{
unsigned char publicString[10];
static long intval;
char *cmd_string = NULL;
/*
* Define an arbitrary maximum permissible value
*/
switch (action) {
case RESERVE1:
//intval = *((long *) var_val);
/*
* Check that the value being set is acceptable
*/
if (var_val_type != ASN_OCTET_STR) {
DEBUGMSGTL(("setString", "%x not string type", var_val_type));
return SNMP_ERR_WRONGTYPE;
}
if (var_val_len > 1 ) {
DEBUGMSGTL(("setString", "wrong length %" NETSNMP_PRIz "u",
var_val_len));
return SNMP_ERR_WRONGLENGTH;
}
if ( !(var_val[0] == '1' || var_val[0] == '0') )
{
DEBUGMSGTL(("setString", "wrong value %s", var_val));
return SNMP_ERR_WRONGVALUE;
}
私はそれがいくらか機能していることを知っています
# snmpset -v 2c -c xxx 10.20.30.40 1.3.6.1.4.1.54321.3.0 s 3
Error in packet.
Reason: wrongValue (The set value is illegal or unsupported in some way)
Failed object: MY-TEST-MIB::testSnmp.3.0
と
snmpset -v 2c -c xxx 10.20.30.40 1.3.6.1.4.1.54321.3.0 s 1
MY-TEST-MIB::testSnmp.3.0 = STRING: "1"
これは、少なくとも最後のコード コレクションが機能していることを証明しています。
アクション部分は次のとおりです。
case ACTION:
/*
* Set the variable as requested.
* Note that this may need to be reversed,
* so save any information needed to do this.
*/
if ( var_val[0] == '1' )
{
//do stuff - there realy is a script call here that does something
}
if ( var_val[0] == '0' )
{
//do stuff - there realy is a script call here that does something
}
break;
上記のセクションは、私が仕事をすることができません。
オブジェクトを INTEGER (ASN.1) 型にすることで必要なものを取得できましたが、このオブジェクトを読み取ると STRING (ASN.1) が返されるため、それはできません。