struct if_nameindex* if_nameindex() { struct ifnameindexctx _ctx, *ctx = &_ctx; struct if_nameindex *ifs = 0, *d; struct ifnamemap* s; char* p; int i; int cs; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); memset(ctx, 0, sizeof(*ctx)); if (__rtnetlink_enumerate(AF_UNSPEC, AF_INET, netlink_msg_to_nameindex, ctx) < 0) goto err; ifs = malloc(sizeof(struct if_nameindex[ctx->num + 1]) + ctx->str_bytes); if (!ifs) goto err; p = (char*)(ifs + ctx->num + 1); for (i = ctx->num, d = ifs, s = ctx->list; i; i--, s++, d++) { d->if_index = s->index; d->if_name = p; memcpy(p, s->name, s->namelen); p += s->namelen; *p++ = 0; } d->if_index = 0; d->if_name = 0; err: pthread_setcancelstate(cs, 0); free(ctx->list); errno = ENOBUFS; return ifs; }
int getifaddrs(struct ifaddrs **ifap) { struct ifaddrs_ctx _ctx, *ctx = &_ctx; int r; memset(ctx, 0, sizeof *ctx); r = __rtnetlink_enumerate(AF_UNSPEC, AF_UNSPEC, netlink_msg_to_ifaddr, ctx); if (r == 0) *ifap = &ctx->first->ifa; else freeifaddrs(&ctx->first->ifa); return r; }