>Я никак не могу понять, как можно програмно определить сетевые интерфейсы(желательно без
>/proc =) ). Есть подозрение, что через ioctl.
ОС нужно указывать, относительно freebsd 4.10,4.11 (5.4 не проверено(?))
....
void
list_ifaces(arg)
int arg[];
{
arg[0] = CTL_NET;
arg[1] = PF_ROUTE;
arg[5] = arg[3] = arg[2] = 0;
arg[4] = NET_RT_IFLIST;
}
int mib[6];
char *ptr, *nptr, *limit, *next;
size_t if_buf = 0, needed = 0;
....
list_ifaces(&mib);
if(sysctl(mib, 6, NULL, &if_buf, NULL, 0) < 0) {
printf("sysctl() %s\n", strerror(errno));
return EXIT_FAILURE;
}
next = ptr = malloc(if_buf);
if (sysctl(mib, 6, ptr, &if_buf, NULL, 0) < 0) {
printf("sysctl() %s\n", strerror(errno));
free(ptr);
return EXIT_FAILURE;
}
limit = ptr + if_buf;
while(next < limit) {
ifm = (struct if_msghdr *) next;
if((ifm->ifm_flags & IFF_UP) && (ifm->ifm_flags | IFF_LOOPBACK)) {
memset(if_name, 0, IFNAMSIZ);
if_indextoname(ifm->ifm_index, (char *)&if_name);
#if RELEASE == 410
sdl = (struct sockaddr_dl *)(ifm + 1);
#else
sdl = (struct sockaddr_dl *)((char *)ifm + sizeof(struct if_msghdr) - sizeof(struct if_data) + ifm->ifm_data.ifi_datalen);
#endif
printf("index:%s, mtu:%ld\n", if_name, ifm->ifm_data.ifi_mtu);
printf("\tinput:%lu\n\toutput:%lu\n",ifm->ifm_data.ifi_ibytes, ifm->ifm_data.ifi_obytes);
printf("\t%s\n", ether_ntoa((struct ether_addr *)LLADDR(sdl)));
}
next += ifm->ifm_msglen;
ifam = NULL;
while(next < limit) {
nextifm = (struct if_msghdr *)next;
if (nextifm->ifm_type != RTM_NEWADDR)
break;
if (ifam == NULL)
ifam = (struct ifa_msghdr *)nextifm;
next += nextifm->ifm_msglen;
}
}
free(ptr);
...