/* *=========================================================================== * ipnet_cmd_sysctl_set *=========================================================================== * Description: * Parameters: * Returns: * */ IP_STATIC Ip_bool ipnet_cmd_sysctl_set(int *name, int namelen, void *newp, Ip_size_t newlenp) { if (ipcom_sysctl(name, namelen, IP_NULL, IP_NULL, newp, newlenp) < 0) return IP_FALSE; return IP_TRUE; }
/* *=========================================================================== * ipnet_cmd_sysctl_get *=========================================================================== * Description: * Parameters: * Returns: * */ IP_STATIC Ip_bool ipnet_cmd_sysctl_getint(int *name, int namelen, int *value) { Ip_size_t vallen = sizeof(*value); if (ipcom_sysctl(name, namelen, value, &vallen, IP_NULL, 0) < 0) return IP_FALSE; return IP_TRUE; }
/* *=========================================================================== * ipnet_cmd_sysctl_get *=========================================================================== * Description: * Parameters: * Returns: * */ IP_STATIC Ip_bool ipnet_cmd_sysctl_get(int *name, int namelen, void **oldp, Ip_size_t *oldlenp) { *oldlenp = 0; if (ipcom_sysctl(name, namelen, IP_NULL, oldlenp, IP_NULL, 0) < 0) return IP_FALSE; *oldp = ipcom_malloc(*oldlenp); if (*oldp == IP_NULL) return IP_FALSE; if (ipcom_sysctl(name, namelen, *oldp, oldlenp, IP_NULL, 0) < 0) { ipcom_free(*oldp); return IP_FALSE; } return IP_TRUE; }
/* *=========================================================================== * ipcom_getifaddrs *=========================================================================== * Description: * Parameters: * Returns: * */ IP_PUBLIC int ipcom_getifaddrs(struct Ip_ifaddrs **ifa) { int name[6]; Ip_u8 *if_data; Ip_size_t if_data_len; Ip_size_t if_data_offset; struct Ipnet_if_msghdr *ifm; struct Ip_ifaddrs **tail = ifa; struct Ip_sockaddr_dl *dl; struct Ipnet_rt_msghdr *rtm; Ip_fd fd = IP_INVALID_SOCKET; char ifname[IP_IFNAMSIZ]; Ip_size_t if_name_len; if(ifa == IP_NULL) return -1; *ifa = IP_NULL; name[0] = IP_CTL_NET; name[1] = IP_AF_ROUTE; name[2] = 0; /* Always 0 */ name[3] = 0; name[4] = IP_NET_RT_IFLIST; name[5] = 0; redo_alloc: if (ipcom_sysctl(name, 6, IP_NULL, &if_data_len, IP_NULL, 0) < 0) { IPCOM_LOG1(ERR, "ipcom_getifaddrs() :: ipcom_sysctl(%d) failed!"IP_LF, ipcom_errno); return -1; } if_data = ipcom_malloc(if_data_len); if (if_data == IP_NULL) { IPCOM_LOG1(ERR, "ipcom_getifaddrs() :: ipcom_malloc(%d) failed!"IP_LF, if_data_len); return -1; } if (ipcom_sysctl(name, 6, if_data, &if_data_len, IP_NULL, 0) < 0) { if (ipcom_errno == IP_ERRNO_ENOMEM) { ipcom_free(if_data); goto redo_alloc; } IPCOM_LOG1(ERR, "ipcom_getifaddrs() :: ipcom_sysctl(%d) failed!"IP_LF, ipcom_errno); goto cleanup; } #if defined(IPCOM_USE_INET) fd = ipcom_socket(IP_AF_INET, IP_SOCK_DGRAM, IP_IPPROTO_UDP); #elif defined(IPCOM_USE_INET6) fd = ipcom_socket(IP_AF_INET6, IP_SOCK_DGRAM, IP_IPPROTO_UDP); #endif if (fd == IP_INVALID_SOCKET) goto cleanup; if_data_offset = 0; while (if_data_len > if_data_offset + sizeof(struct Ipnet_if_msghdr)) { ifm = (struct Ipnet_if_msghdr *) &if_data[if_data_offset]; if_data_offset += ifm->ifm_msglen; rtm = (struct Ipnet_rt_msghdr *)(void *)ifm; switch (rtm->rtm_type) { case IPNET_RTM_IFINFO: if (ifm->ifm_addrs & IPNET_RTA_IFP) { dl = (struct Ip_sockaddr_dl *)(void *)(ifm + 1); ipcom_memset(ifname,0,IP_IFNAMSIZ); ipcom_memcpy(ifname, dl->sdl_data,(Ip_size_t)dl->sdl_nlen); break; /* Got the name! */ } default: continue; /* No name, continue */ } #ifdef IPCOM_USE_INET if_data_offset += ipcom_create_ifaddrs_inet(fd, ifname, &if_data[if_data_offset], if_data_len - if_data_offset, ifm, &tail); #endif /* IPCOM_USE_INET */ #ifdef IPCOM_USE_INET6 if_data_offset += ipcom_create_ifaddrs_inet6(fd, ifname, &if_data[if_data_offset], if_data_len - if_data_offset, ifm, &tail); #endif /* IPCOM_USE_INET6 */ } cleanup: if (fd != IP_INVALID_SOCKET) ipcom_socketclose(fd); ipcom_free(if_data); return 0; }
void test_if(char *parent) { int name[6]; Ip_u8 *if_data; Ip_size_t if_data_len; Ip_size_t if_data_offset; struct Ipnet_if_msghdr *ifm; struct Ip_sockaddr *hwaddr; char ifname[IP_IFNAMSIZ]; char ifname2[IP_IFNAMSIZ]; char str[80]; name[0] = IP_CTL_NET; name[1] = IP_AF_ROUTE; name[2] = 0; /* Always 0 */ name[3] = 0; name[4] = IP_NET_RT_IFLIST; name[5] = 0; if (ipcom_sysctl(name, 6, IP_NULL, &if_data_len, IP_NULL, 0) < 0) { printf("ifconfig: ipnet_sysctl() failed: %s"IP_LF, ipcom_strerror(ipcom_errno)); return; } if_data = ipcom_malloc(if_data_len); if (if_data == IP_NULL) { printf("ifconfig: out of memory"IP_LF); return; } if (ipcom_sysctl(name, 6, if_data, &if_data_len, IP_NULL, 0) < 0) { if (ipcom_errno == IP_ERRNO_ENOMEM) { ipcom_free(if_data); } printf("ifconfig: ipnet_sysctl() failed: %s"IP_LF, ipcom_strerror(ipcom_errno)); } if_data_offset = 0; while (if_data_len > if_data_offset + sizeof(struct Ipnet_if_msghdr)) { ifm = (struct Ipnet_if_msghdr *) &if_data[if_data_offset]; if_data_offset += ifm->ifm_msglen; /* Resolve the interface name */ if (ipcom_if_indextoname(ifm->ifm_index, ifname) == IP_NULL) continue; if (ifm->ifm_data.ifi_type == IP_IFT_L2VLAN) { if (( vlan_check(ifm->ifm_index, parent) == 0) || (vlan_check(ifm->ifm_index, parent) == -1)) continue; else { printf("Interface=%s\n", ifname); ipcom_if_indextoname(ifm->ifm_index, ifname2); return get_ip(ifname2); } } } }