/** * copy an ipaddress_entry * * @retval -1 : error * @retval 0 : no error */ int netsnmp_access_ipaddress_entry_copy(netsnmp_ipaddress_entry *lhs, netsnmp_ipaddress_entry *rhs) { int rc; /* * copy arch stuff. we don't care if it changed */ rc = netsnmp_arch_ipaddress_entry_copy(lhs,rhs); if (0 != rc) { snmp_log(LOG_ERR,"arch ipaddress copy failed\n"); return -1; } lhs->if_index = rhs->if_index; lhs->ia_storagetype = rhs->ia_storagetype; lhs->ia_address_len = rhs->ia_address_len; memcpy(lhs->ia_address, rhs->ia_address, rhs->ia_address_len); lhs->ia_type = rhs->ia_type; lhs->ia_status = rhs->ia_status; lhs->ia_origin = rhs->ia_origin; return 0; }
/** * copy an ipaddress_entry * * @retval -1 : error * @retval 0 : no error */ int netsnmp_access_ipaddress_entry_copy(netsnmp_ipaddress_entry *lhs, netsnmp_ipaddress_entry *rhs) { int rc; if (NULL != lhs->ia_prefix_oid) SNMP_FREE(lhs->ia_prefix_oid); snmp_clone_mem((void **) &lhs->ia_prefix_oid, rhs->ia_prefix_oid, rhs->ia_prefix_oid_len * sizeof(oid)); lhs->ia_prefix_oid_len = rhs->ia_prefix_oid_len; /* * copy arch stuff. we don't care if it changed */ rc = netsnmp_arch_ipaddress_entry_copy(lhs,rhs); if (0 != rc) { snmp_log(LOG_ERR,"arch ipaddress copy failed\n"); return -1; } lhs->if_index = rhs->if_index; lhs->ia_storagetype = rhs->ia_storagetype; lhs->ia_address_len = rhs->ia_address_len; memcpy(lhs->ia_address, rhs->ia_address, rhs->ia_address_len); lhs->ia_type = rhs->ia_type; lhs->ia_status = rhs->ia_status; lhs->ia_origin = rhs->ia_origin; return 0; }
/** * update an old ipaddress_entry from a new one * * @note: only mib related items are compared. Internal objects * such as oid_index, ns_ia_index and flags are not compared. * * @retval -1 : error * @retval >=0 : number of fields updated */ int netsnmp_access_ipaddress_entry_update(netsnmp_ipaddress_entry *lhs, netsnmp_ipaddress_entry *rhs) { int rc, changed = 0; /* * copy arch stuff. we don't care if it changed */ rc = netsnmp_arch_ipaddress_entry_copy(lhs,rhs); if (0 != rc) { snmp_log(LOG_ERR,"arch ipaddress copy failed\n"); return -1; } if (lhs->if_index != rhs->if_index) { ++changed; lhs->if_index = rhs->if_index; } if (lhs->ia_storagetype != rhs->ia_storagetype) { ++changed; lhs->ia_storagetype = rhs->ia_storagetype; } if (lhs->ia_address_len != rhs->ia_address_len) { changed += 2; lhs->ia_address_len = rhs->ia_address_len; memcpy(lhs->ia_address, rhs->ia_address, rhs->ia_address_len); } else if (memcmp(lhs->ia_address, rhs->ia_address, rhs->ia_address_len) != 0) { ++changed; memcpy(lhs->ia_address, rhs->ia_address, rhs->ia_address_len); } if (lhs->ia_type != rhs->ia_type) { ++changed; lhs->ia_type = rhs->ia_type; } if (lhs->ia_status != rhs->ia_status) { ++changed; lhs->ia_status = rhs->ia_status; } if (lhs->ia_origin != rhs->ia_origin) { ++changed; lhs->ia_origin = rhs->ia_origin; } return changed; }
/** * update an old ipaddress_entry from a new one * * @note: only mib related items are compared. Internal objects * such as oid_index, ns_ia_index and flags are not compared. * * @retval -1 : error * @retval >=0 : number of fields updated */ int netsnmp_access_ipaddress_entry_update(netsnmp_ipaddress_entry *lhs, netsnmp_ipaddress_entry *rhs) { int rc, changed = 0; /* * do any memory allocations first, using temp vars, so a failure can * return w/out chaning lhs entry. length is dealt with right afterwards. */ if (lhs->ia_prefix_oid != rhs->ia_prefix_oid) { oid *tmp_oid; if (NULL != rhs->ia_prefix_oid) { int tmp_len = rhs->ia_prefix_oid_len * sizeof(oid); tmp_oid = malloc(tmp_len); if (NULL == tmp_oid) { snmp_log(LOG_ERR, "malloc failed\n"); return -1; } memcpy(tmp_oid,rhs->ia_prefix_oid, tmp_len); } else tmp_oid = NULL; if (NULL != lhs->ia_prefix_oid) SNMP_FREE(lhs->ia_prefix_oid); lhs->ia_prefix_oid = tmp_oid; ++changed; } if (lhs->ia_prefix_oid_len != rhs->ia_prefix_oid_len) { ++changed; lhs->ia_prefix_oid_len = rhs->ia_prefix_oid_len; } /* * copy arch stuff. we don't care if it changed */ rc = netsnmp_arch_ipaddress_entry_copy(lhs,rhs); if (0 != rc) { snmp_log(LOG_ERR,"arch ipaddress copy failed\n"); return -1; } if (lhs->if_index != rhs->if_index) { ++changed; lhs->if_index = rhs->if_index; } if (lhs->ia_storagetype != rhs->ia_storagetype) { ++changed; lhs->ia_storagetype = rhs->ia_storagetype; } if (lhs->ia_address_len != rhs->ia_address_len) { changed += 2; lhs->ia_address_len = rhs->ia_address_len; memcpy(lhs->ia_address, rhs->ia_address, rhs->ia_address_len); } else if (memcmp(lhs->ia_address, rhs->ia_address, rhs->ia_address_len) != 0) { ++changed; memcpy(lhs->ia_address, rhs->ia_address, rhs->ia_address_len); } if (lhs->ia_type != rhs->ia_type) { ++changed; lhs->ia_type = rhs->ia_type; } if (lhs->ia_status != rhs->ia_status) { ++changed; lhs->ia_status = rhs->ia_status; } if (lhs->ia_origin != rhs->ia_origin) { ++changed; lhs->ia_origin = rhs->ia_origin; } return changed; }