iputils/iputils-20101006-eth.patch

91 lines
2.2 KiB
Diff
Raw Normal View History

2012-10-16 11:19:12 +00:00
--- 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;
2012-10-16 11:19:12 +00:00
@@ -69,6 +69,11 @@ int received, brd_recv, req_recv;
#define SYSFS_PATH_LEN 256
2012-10-16 11:19:12 +00:00
#define SOCKADDR_LEN (2 * sizeof(struct sockaddr_ll))
2012-10-16 11:19:12 +00:00
+#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 )
2012-10-16 11:19:12 +00:00
@@ -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)
+{
2012-10-16 11:19:12 +00:00
+ FILE *f;
+ char buf[255], *dv, *smc;
+ char pci[16];
+
2012-10-16 11:19:12 +00:00
+ 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)
{
2012-10-16 11:19:12 +00:00
@@ -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':
2012-10-16 11:19:12 +00:00
@@ -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':