LINUX.ORG.RU

История изменений

Исправление 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;
}