2021-10-11 18:37:13 -03:00

81 lines
1.8 KiB
C

#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <ctype.h>
#include <string.h>
#include <sys/ioctl.h>
/*
* Name: get_ether0name()
*
* Description: Get the name of the first ethernet interface
*
* Copyright (c) 1990 by Sun Microsystems, Inc.
*
*/
#ifndef lint
static char sccsid[] = "@(#)get_ether0name.c 1.1 94/10/31 SMI";
#endif
#define DEFAULT_NAME "xx"
#define LOOPBACK_NAME "lo"
#define LOOPBACK_NAME_LEN 2
int
get_ether0name(ether_name, namelen)
char * ether_name;
int namelen;
{
char buf[1024]; /* buffer for socket info */
int sd; /* socket descriptor */
struct ifconf ifc; /* interface config buffer */
struct ifreq * ifr; /* ptr to interface request */
int i; /* loop index */
sd = socket(AF_INET, SOCK_DGRAM, 0);
if (sd < 0)
return -1;
bzero(buf,sizeof(buf));
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = (caddr_t) buf;
if (ioctl(sd, SIOCGIFCONF, (char *) &ifc) < 0) {
(void) close(sd);
return -1;
}
(void) close(sd);
/*
* Now find the 0 interface
*/
for (ifr = ifc.ifc_req; ifr->ifr_name[0]; ifr++) {
/*
* Extract the first alpha-only string as the
* interface name. Skip loopback interface
*/
if (!strncmp(ifr->ifr_name, LOOPBACK_NAME, LOOPBACK_NAME_LEN))
continue;
for (i = 0; isalpha(ifr->ifr_name[i]) && i < namelen; i++)
ether_name[i] = ifr->ifr_name[i];
ether_name[i] = NULL;
/*
* If it's the system interface return it. This works
* because there is only 1 '0' interface.
*/
if (ifr->ifr_name[i] == '0')
return 0;
}
/*
* We're here because the only thing we found was loopback. The only
* thing to do is to fill in the default
*/
strcpy(ether_name, DEFAULT_NAME);
return 0;
} /* end get_ether0name() */