История изменений
Исправление goodwin, (текущая версия) :
Строки в расте не нуль-терминированные.
Точно! Я валенок, забыл про это, в этом косяк и был.
&mut T коэрсится в *mut T, так что p_oid_len можно убрать и писать &mut _oid_len прямо в вызове функции.
Да, так зашло.
Спасибо большое!
Получилось так, продолжу осваивать:
pub struct SNMPValue {
_oid: Vec<u8>,
data: Vec<u8>,
}
fn snmp_conv(_vars: *mut netsnmp_variable_list) -> SNMPValue {
let mut value: SNMPValue = SNMPValue { _oid: vec![], data: vec![] };
unsafe {
if (*_vars)._type != SNMP_ENDOFMIBVIEW && (*_vars)._type != SNMP_NOSUCHOBJECT && (*_vars)._type != SNMP_NOSUCHINSTANCE {
value._oid = vec![0; ((*_vars).name_length + 1) * 2];
snprint_objid(value._oid.as_mut_ptr() as *mut c_char, value._oid.len(), (*_vars).name, (*_vars).name_length);
if (*_vars)._type == ASN_OCTET_STR || (*_vars)._type == ASN_IPADDRESS {
value.data = vec![0; (*_vars).val_len];
memmove(value.data.as_mut_ptr() as *mut c_void, (*(*_vars).val.string()) as *const c_void, (*_vars).val_len);
}
}
}
return value;
}
fn snmp_get(snmp_sess: *mut netsnmp_session, _oid_str: &str) -> SNMPValue {
let mut result: SNMPValue = SNMPValue { _oid: vec![], data: vec![] };
let request: *mut netsnmp_pdu;
let mut response: *mut netsnmp_pdu = null_mut();
let status: raw::c_int;
unsafe {
let c_oid_str = CString::new(_oid_str).unwrap();
let mut _oid: Vec<oid> = vec![0; MAX_OID_LEN];
let mut _oid_len: size_t = MAX_OID_LEN;
if snmp_parse_oid(c_oid_str.as_ptr(), _oid.as_mut_ptr(), &mut _oid_len) != null_mut() {
request = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(request, _oid.as_ptr(), _oid_len);
status = snmp_synch_response(snmp_sess, request, &mut response);
if status == STAT_SUCCESS && response != null_mut() {
if (*response).errstat == SNMP_ERR_NOERROR && (*response).variables != null_mut() {
result = snmp_conv((*response).variables);
} else {
println!("SNMP: Failed to send SNMP_MSG_GET");
}
snmp_free_pdu(response);
}
}
}
return result;
}
Исходная версия goodwin, :
Строки в расте не нуль-терминированные.
Точно! Я валенок, забыл про это, в этом косяк и был.
&mut T коэрсится в *mut T, так что p_oid_len можно убрать и писать &mut _oid_len прямо в вызове функции.
Да, так зашло.
Спасибо большое!
pub struct SNMPValue {
_oid: Vec<u8>,
data: Vec<u8>,
}
fn snmp_conv(_vars: *mut netsnmp_variable_list) -> SNMPValue {
let mut value: SNMPValue = SNMPValue { _oid: vec![], data: vec![] };
unsafe {
if (*_vars)._type != SNMP_ENDOFMIBVIEW && (*_vars)._type != SNMP_NOSUCHOBJECT && (*_vars)._type != SNMP_NOSUCHINSTANCE {
value._oid = vec![0; ((*_vars).name_length + 1) * 2];
snprint_objid(value._oid.as_mut_ptr() as *mut c_char, value._oid.len(), (*_vars).name, (*_vars).name_length);
if (*_vars)._type == ASN_OCTET_STR || (*_vars)._type == ASN_IPADDRESS {
value.data = vec![0; (*_vars).val_len];
memmove(value.data.as_mut_ptr() as *mut c_void, (*(*_vars).val.string()) as *const c_void, (*_vars).val_len);
}
}
}
return value;
}
fn snmp_get(snmp_sess: *mut netsnmp_session, _oid_str: &str) -> SNMPValue {
let mut result: SNMPValue = SNMPValue { _oid: vec![], data: vec![] };
let request: *mut netsnmp_pdu;
let mut response: *mut netsnmp_pdu = null_mut();
let status: raw::c_int;
unsafe {
let c_oid_str = CString::new(_oid_str).unwrap();
let mut _oid: Vec<oid> = vec![0; MAX_OID_LEN];
let mut _oid_len: size_t = MAX_OID_LEN;
if snmp_parse_oid(c_oid_str.as_ptr(), _oid.as_mut_ptr(), &mut _oid_len) != null_mut() {
request = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(request, _oid.as_ptr(), _oid_len);
status = snmp_synch_response(snmp_sess, request, &mut response);
if status == STAT_SUCCESS && response != null_mut() {
if (*response).errstat == SNMP_ERR_NOERROR && (*response).variables != null_mut() {
result = snmp_conv((*response).variables);
} else {
println!("SNMP: Failed to send SNMP_MSG_GET");
}
snmp_free_pdu(response);
}
}
}
return result;
}