Beispiel #1
0
char *
Net_rt_iflist(int family, int flags, size_t *lenp)
{
	char	*ptr;

	if ( (ptr = net_rt_iflist(family, flags, lenp)) == NULL)
		err_sys("net_rt_iflist error");
	return(ptr);
}
Beispiel #2
0
// Net route interface list
char *Net_rt_iflist(int family, int flags, size_t *lenp)
{
  char *ptr;

  if ( (ptr = net_rt_iflist(family, flags, lenp)) == NULL)
    {
      perror("net_rt_iflist error");
      exit(0);
    }
  return(ptr);
}
Beispiel #3
0
unsigned int if_nametoindex(const char *name)
{
    unsigned int        idx, namelen;
    char                *buf, *next, *lim;
    size_t               len;
    struct if_msghdr    *ifm;
    struct sockaddr     *sa, *rti_info[RTAX_MAX];
    struct sockaddr_dl  *sdl;

    // 获取接口列表
    if ((buf = net_rt_iflist(0, 0, &len)) == NULL) {
        return(0);
    }

    // 查找符合给定名称的接口,并返回其索引
    namelen = strlen(name);
    lim = buf + len;
    for (next = buf; next < lim; next += ifm->ifm_msglen) {
        ifm = (struct if_msghdr *) next;
        if (ifm->ifm_type == RTM_IFINFO) {
            sa = (struct sockaddr *) (ifm + 1);
            get_rtaddrs(ifm->ifm_addrs, sa, rti_info);
            if ((sa = rti_info[RTAX_IFP]) != NULL) {
                if (sa->sa_family == AF_LINK) {
                    sdl = (struct sockaddr_d *) sa;
                    if (sdl->sdl_nlen == namelen && strncmp(&sdl->sdl_data[0], name, sdl->sdl_nlen) == 0) {
                        idx = sdl->sdl_index; // save before free()
                        free(buf);
                        return(idx);
                    }
                }
            }
        }
    }
    free(buf);
    return(0);  // no match for name
}
Beispiel #4
0
// interface name to index
unsigned int if_nametoindex(const char *name)
{
  unsigned int index;
  char *buf, *next, *lim;
  size_t len;
  struct if_msghdr *ifm;
  struct sockaddr *sa, *rti_info[RTAX_MAX];
  struct sockaddr_dl *sdl;

  if ((buf = net_rt_iflist(0, 0, &len)) == NULL)
    return 0;
  lim = buf + len;
  for (next = buf; next < lim; next += ifm->ifm_msglen) 
    {
      ifm = (struct if_msghdr *) next;
      if (ifm->ifm_type == RTM_IFINFO)
	{
	  sa = (struct sockaddr *) (ifm + 1);
	  get_rtaddrs(ifm->ifm_addrs, sa, rti_info);
	  if ((sa = rti_info[RTAX_IFP]) != NULL)
	    {
	      if (sa->sa_family == AF_LINK)
		{
		  sdl = (struct sockaddr_dl *) sa;
		  if (strncmp(&sdl->sdl_data[0], name, sdl->sdl_nlen) == 0) 
		    {
		      index = sdl->sdl_index;
		      free(buf);
		      return index;
		    }
		}
	    }
	}
    }
  free(buf);
  return 0;
}
Beispiel #5
0
char *
if_indextoname(unsigned int idx, char *name)
{
	char				*buf, *next, *lim;
	size_t				len;
	struct if_msghdr	*ifm;
	struct sockaddr		*sa, *rti_info[RTAX_MAX];
	struct sockaddr_dl	*sdl;

	if ( (buf = net_rt_iflist(0, idx, &len)) == NULL)
		return(NULL);

	lim = buf + len;
	for (next = buf; next < lim; next += ifm->ifm_msglen) {
		ifm = (struct if_msghdr *) next;
		if (ifm->ifm_type == RTM_IFINFO) {
			sa = (struct sockaddr *) (ifm + 1);
			get_rtaddrs(ifm->ifm_addrs, sa, rti_info);
			if ( (sa = rti_info[RTAX_IFP]) != NULL) {
				if (sa->sa_family == AF_LINK) {
					sdl = (struct sockaddr_dl *) sa;
					if (sdl->sdl_index == idx) {
						int slen = min(IFNAMSIZ - 1, sdl->sdl_nlen);
						strncpy(name, sdl->sdl_data, slen);
						name[slen] = 0;	/* null terminate */
						free(buf);
						return(name);
					}
				}
			}

		}
	}
	free(buf);
	return(NULL);		/* no match for index */
}