--- iputils-s20121011/arping.c.orig 2012-10-16 11:46:12.000000000 +0200 +++ iputils-s20121011/arping.c 2012-10-16 11:49:09.746673028 +0200 @@ -40,7 +40,7 @@ static void usage(void) __attribute__((noreturn)); int quit_on_reply=0; -char *device="eth0"; +char *device=NULL; int ifindex; char *source; struct in_addr src, dst; @@ -69,6 +69,11 @@ int received, brd_recv, req_recv; #define SYSFS_PATH_LEN 256 #define SOCKADDR_LEN (2 * sizeof(struct sockaddr_ll)) +#define PREF_ETH "eth" +#define PREF_EM "em" + +static char *dev_file = "/proc/self/net/dev"; + #define MS_TDIFF(tv1,tv2) ( ((tv1).tv_sec-(tv2).tv_sec)*1000 + \ ((tv1).tv_usec-(tv2).tv_usec)/1000 ) @@ -380,6 +385,46 @@ char * read_sysfs_broadcast(char *brdcas return brdcast; } +/* + * get_first_ethernet - return the name of the first ethernet-style + * interface on this system. + */ +char * get_first_ethernet(void) +{ + FILE *f; + char buf[255], *dv, *smc; + char pci[16]; + + memset(pci, 0, sizeof(pci)); + if ((f = fopen(dev_file, "r")) != NULL) + { + // go through network dev file + while (fgets (buf, sizeof(buf), f) != NULL) + { + // the line describes interface + if ((smc = strchr(buf, ':')) != NULL) + { + // trim white characters + for (dv=buf, *smc=0; *dv <= ' '; dv++) ; + // is "eth" (originial ethernet name) or "em" (ethernet on board) + if (!strncmp(dv, PREF_ETH, strlen(PREF_ETH)) || + !strncmp(dv, PREF_EM, strlen(PREF_EM))) + { + return strdup(dv); + } + // remember the first pci NIC-card + if (strlen(pci) == 0 && dv[0] == 'p' && isdigit(dv[1])) + { + strcpy(pci, dv); + } + } + } + fclose(f); + } + // return pci NIC-card or nil if no if name + return strlen(pci) > 0 ? strdup(pci) : 0L; +} + int main(int argc, char **argv) { @@ -417,6 +462,8 @@ main(int argc, char **argv) exit(1); } + device = get_first_ethernet(); + while ((ch = getopt(argc, argv, "h?bfDUAqc:w:s:I:V")) != EOF) { switch(ch) { case 'b': @@ -443,6 +490,10 @@ main(int argc, char **argv) timeout = atoi(optarg); break; case 'I': + if (device) { + free(device); + device = NULL; + } device = strdup(optarg); break; case 'f':