Exemple #1
0
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;
}
Exemple #2
0
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;
}