--- embedtools/src/get1steth.c 2009/12/18 14:12:24 1.1.2.1 +++ embedtools/src/get1steth.c 2009/12/18 16:18:51 1.1.2.2 @@ -1,7 +1,89 @@ #include "global.h" +#include "get1steth.h" -int main() +char szIface[MAX_STR]; +int Verbose; +extern char compiled[], compiledby[], compilehost[]; + + +static void Usage() { + printf("-= GET_FIRST_ETHERNET =- Get First Ethernet Interface tool\n" + "=== %s === %s@%s ===\n\n" + "Syntax: get1steth [option] [custom_first_interface]\n\n" + "\t-v\t\tVerbose (more -v more verbosity)\n" + "\t-g\t\tOnly get first interface, print and exit ...\n" + "\n", compiled, compiledby, compilehost); +} + +// ------------------------------- + +int main(int argc, char **argv) +{ + char ch, GetOnly = 0; + struct ifaddrs *ifa, *ifp; + struct sockaddr_dl *sdl; + struct ifreq ifr; + int s; + + while ((ch = getopt(argc, argv, "hvg")) != -1) + switch (ch) { + case 'g': + GetOnly = 1; + break; + case 'v': + Verbose++; + break; + case 'h': + default: + Usage(); + return 1; + } + argc -= optind; + argv += optind; + + openlog("get1steth", LOG_CONS, LOG_CONSOLE); + + if (argc) { + strlcpy(szIface, *argv, MAX_STR); + VERB(1) syslog(LOG_NOTICE, "Info:: Get CUSTOM first interface %s\n", szIface); + } else { + getifaddrs(&ifa); + for (ifp = ifa; ifp; ifp = ifp->ifa_next) { + if (PF_LINK == ifp->ifa_addr->sa_family && + IFT_ETHER == ((struct sockaddr_dl*) ifp->ifa_addr)->sdl_type) { + strlcpy(szIface, ifp->ifa_name, MAX_STR); + sdl = (struct sockaddr_dl*) ifp->ifa_addr; + VERB(2) syslog(LOG_NOTICE, "Info:: Get first interface=%s MAC=%s\n", szIface, + ether_ntoa((struct ether_addr*) LLADDR(sdl))); + break; + } + } + freeifaddrs(ifa); + } + if (GetOnly) { + printf("%s\n", szIface); + + closelog(); + return 0; + } + + memset(&ifr, 0, sizeof ifr); + strlcpy(ifr.ifr_name, szIface, sizeof ifr.ifr_name); + + s = socket(PF_LOCAL, SOCK_DGRAM, 0); + if (-1 == s) { + syslog(LOG_ERR, "Error:: socket(LOCAL) #%d - %s\n", errno, strerror(errno)); + return 2; + } + if (ioctl(s, SIOCIFCREATE2, &ifr) == -1) { + syslog(LOG_ERR, "Error:: ioctl(SIOCIFCREATE2) #%d - %s\n", errno, strerror(errno)); + close(s); + return 2; + } + + close(s); + closelog(); return 0; }