ac1079b
diff -up net-tools-2.0/ether-wake.c.interfaces net-tools-2.0/ether-wake.c
906023f
--- net-tools-2.0/ether-wake.c.interfaces	2015-09-15 18:02:18.595968129 +0200
906023f
+++ net-tools-2.0/ether-wake.c	2015-09-15 18:02:18.607968095 +0200
ac1079b
@@ -22,7 +22,7 @@ static char usage_msg[] =
Jaromír Končický 0373077
 "	Options:\n"
Jaromír Končický 0373077
 "		-b	Send wake-up packet to the broadcast address.\n"
Jaromír Končický 0373077
 "		-D	Increase the debug level.\n"
Jaromír Končický 0373077
-"		-i ifname	Use interface IFNAME instead of the default 'eth0'.\n"
ba1d4f0
+"		-i ifname	Use interface ifname instead of sending a wake packet to all interfaces.\n"
Jaromír Končický 0373077
 "		-p <pw>		Append the four or six byte password PW to the packet.\n"
Jaromír Končický 0373077
 "					A password is only required for a few adapter types.\n"
Jaromír Končický 0373077
 "					The password may be specified in ethernet hex format\n"
ac1079b
@@ -89,6 +89,9 @@ static char usage_msg[] =
Jaromír Končický 0373077
 #include <netdb.h>
Jaromír Končický 0373077
 #include <netinet/ether.h>
Jaromír Končický 0373077
 
Jaromír Končický 0373077
+#include "interface.h"
Jaromír Končický 0373077
+#include "sockets.h"
Jaromír Končický 0373077
+
Jaromír Končický 0373077
 /* Grrr, no consistency between include versions.
Jaromír Končický 0373077
    Enable this if setsockopt() isn't declared with your library. */
Jaromír Končický 0373077
 #if 0
ac1079b
@@ -110,20 +113,29 @@ static int get_dest_addr(const char *arg
Jaromír Končický 0373077
 static int get_fill(unsigned char *pkt, struct ether_addr *eaddr);
Jaromír Končický 0373077
 static int get_wol_pw(const char *optarg);
Jaromír Končický 0373077
 
Jaromír Končický 0373077
+typedef struct {
Jaromír Končický 0373077
+	int s;
Jaromír Končický 0373077
+	int verbose;
Jaromír Končický 0373077
+	int pktsize;
Jaromír Končický 0373077
+} if_info;
Jaromír Končický 0373077
+
Jaromír Končický 0373077
+static int send_wol_packet(char *ifname, int s, int verbose, int pktsize);
Jaromír Končický 0373077
+
Jaromír Končický 0373077
+static int do_wake(struct interface *ife, void *cookie) {
Jaromír Končický 0373077
+	if_info *info = (if_info *)cookie;
Jaromír Končický 0373077
+	send_wol_packet(ife->name, info->s, info->verbose, info->pktsize);
Jaromír Končický 0373077
+	return 0;
Jaromír Končický 0373077
+}
Jaromír Končický 0373077
+
Jaromír Končický 0373077
 int main(int argc, char *argv[])
Jaromír Končický 0373077
 {
Jaromír Končický 0373077
-	char *ifname = "eth0";
Jaromír Končický 0373077
-	int one = 1;				/* True, for socket options. */
Jaromír Končický 0373077
+	char *ifname = NULL;
Jaromír Končický 0373077
 	int s;						/* Raw socket */
Jaromír Končický 0373077
 	int errflag = 0, verbose = 0, do_version = 0;
Jaromír Končický 0373077
 	int perm_failure = 0;
Jaromír Končický 0373077
-	int i, c, pktsize;
Jaromír Končický 0373077
-#if defined(PF_PACKET)
Jaromír Končický 0373077
-	struct sockaddr_ll whereto;
Jaromír Končický 0373077
-#else
Jaromír Končický 0373077
-	struct sockaddr whereto;	/* who to wake up */
Jaromír Končický 0373077
-#endif
Jaromír Končický 0373077
+	int c, pktsize;
Jaromír Končický 0373077
 	struct ether_addr eaddr;
Jaromír Končický 0373077
+	if_info info;
Jaromír Končický 0373077
 
Jaromír Končický 0373077
 	while ((c = getopt(argc, argv, "bDi:p:uvV")) != -1)
Jaromír Končický 0373077
 		switch (c) {
ac1079b
@@ -131,7 +143,7 @@ int main(int argc, char *argv[])
ac1079b
 		case 'D': debug++;			break;
ac1079b
 		case 'i': ifname = optarg;	break;
ac1079b
 		case 'p': get_wol_pw(optarg); break;
ac1079b
-		case 'u': printf(usage_msg); return 0;
ac1079b
+		case 'u': printf("%s",usage_msg); return 0;
ac1079b
 		case 'v': verbose++;		break;
ac1079b
 		case 'V': do_version++;		break;
ac1079b
 		case '?':
ac1079b
@@ -140,7 +152,7 @@ int main(int argc, char *argv[])
ac1079b
 	if (verbose || do_version)
ac1079b
 		printf("%s\n", version_msg);
ac1079b
 	if (errflag) {
ac1079b
-		fprintf(stderr, brief_usage_msg);
ac1079b
+		fprintf(stderr,"%s", brief_usage_msg);
ac1079b
 		return 3;
ac1079b
 	}
ac1079b
 
ac1079b
@@ -177,13 +189,45 @@ int main(int argc, char *argv[])
Jaromír Končický 0373077
 
Jaromír Končický 0373077
 	pktsize = get_fill(outpack, &eaddr);
Jaromír Končický 0373077
 
Jaromír Končický 0373077
+	if (ifname == NULL) {
Jaromír Končický 0373077
+		info.s = s;
Jaromír Končický 0373077
+		info.verbose = verbose;
Jaromír Končický 0373077
+		info.pktsize = pktsize;
Jaromír Končický 0373077
+
Jaromír Končický 0373077
+		/* Create a channel to the NET kernel. */
Jaromír Končický 0373077
+		if ((sockets_open(0)) < 0) {
Jaromír Končický 0373077
+			perror("socket");
Jaromír Končický 0373077
+			exit(1);
Jaromír Končický 0373077
+		}
Jaromír Končický 0373077
+
Jaromír Končický 0373077
+		return for_all_interfaces(do_wake, &info;;
Jaromír Končický 0373077
+	}
Jaromír Končický 0373077
+
Jaromír Končický 0373077
+	return send_wol_packet(ifname, s, verbose, pktsize);
Jaromír Končický 0373077
+}
Jaromír Končický 0373077
+
Jaromír Končický 0373077
+/* Send a Wake-On-LAN (WOL) "Magic Packet" to Interface IFNAME using
Jaromír Končický 0373077
+   Socket S with a packet size PKTSIZE.  VERBOSE implies
Jaromír Končický 0373077
+   verbosity.  */
Jaromír Končický 0373077
+
Jaromír Končický 0373077
+static int send_wol_packet(char *ifname, int s, int verbose, int pktsize)
Jaromír Končický 0373077
+{
Jaromír Končický 0373077
+	int i;
Jaromír Končický 0373077
+	int one = 1;				/* True, for socket options. */
Jaromír Končický 0373077
+#if defined(PF_PACKET)
Jaromír Končický 0373077
+	struct sockaddr_ll whereto;
Jaromír Končický 0373077
+#else
Jaromír Končický 0373077
+	struct sockaddr whereto;	/* who to wake up */
Jaromír Končický 0373077
+#endif
Jaromír Končický 0373077
+
Jaromír Končický 0373077
 	/* Fill in the source address, if possible.
Jaromír Končický 0373077
 	   The code to retrieve the local station address is Linux specific. */
Jaromír Končický 0373077
 	if (! opt_no_src_addr) {
Jaromír Končický 0373077
 		struct ifreq if_hwaddr;
Jaromír Končický 0373077
-		unsigned char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data;
ac1079b
+		const char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data;
Jaromír Končický 0373077
 
Jaromír Končický 0373077
-		strcpy(if_hwaddr.ifr_name, ifname);
Jaromír Končický 0373077
+		strncpy(if_hwaddr.ifr_name, ifname, IFNAMSIZ);
Jaromír Končický 0373077
+		if_hwaddr.ifr_name[IFNAMSIZ-1] = '\0';
Jaromír Končický 0373077
 		if (ioctl(s, SIOCGIFHWADDR, &if_hwaddr) < 0) {
Jaromír Končický 0373077
 			fprintf(stderr, "SIOCGIFHWADDR on %s failed: %s\n", ifname,
Jaromír Končický 0373077
 					strerror(errno));
ac1079b
@@ -220,7 +264,8 @@ int main(int argc, char *argv[])
Jaromír Končický 0373077
 #if defined(PF_PACKET)
Jaromír Končický 0373077
 	{
Jaromír Končický 0373077
 		struct ifreq ifr;
Jaromír Končický 0373077
-		strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
Jaromír Končický 0373077
+		strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
Jaromír Končický 0373077
+		ifr.ifr_name[IFNAMSIZ-1] = '\0';
Jaromír Končický 0373077
 		if (ioctl(s, SIOCGIFINDEX, &ifr) == -1) {
Jaromír Končický 0373077
 			fprintf(stderr, "SIOCGIFINDEX on %s failed: %s\n", ifname,
Jaromír Končický 0373077
 					strerror(errno));
906023f
@@ -240,11 +285,14 @@ int main(int argc, char *argv[])
906023f
 	strcpy(whereto.sa_data, ifname);
906023f
 #endif
906023f
 
906023f
+	char senderrmsg[IFNAMSIZ+16] = "'";
906023f
+	strcat(senderrmsg, ifname);
906023f
+	strcat(senderrmsg, "', sendto");
906023f
 	if ((i = sendto(s, outpack, pktsize, 0, (struct sockaddr *)&whereto,
906023f
 					sizeof(whereto))) < 0)
906023f
-		perror("sendto");
906023f
+		perror(senderrmsg);
906023f
 	else if (debug)
906023f
-		printf("Sendto worked ! %d.\n", i);
906023f
+		printf("'%s', Sendto worked ! %d.\n", ifname, i);
906023f
 
906023f
 #ifdef USE_SEND
906023f
 	if (bind(s, (struct sockaddr *)&whereto, sizeof(whereto)) < 0)
ac1079b
diff -up net-tools-2.0/Makefile.interfaces net-tools-2.0/Makefile
906023f
--- net-tools-2.0/Makefile.interfaces	2015-09-15 18:02:18.608968093 +0200
906023f
+++ net-tools-2.0/Makefile	2015-09-15 18:04:06.273668275 +0200
906023f
@@ -193,6 +193,9 @@ ipmaddr:	$(NET_LIB) ipmaddr.o
Jaromír Končický 0373077
 mii-tool:	$(NET_LIB) mii-tool.o
906023f
 		$(CC) $(CFLAGS) $(LDFLAGS) -o $@ mii-tool.o $(NLIB)
Jaromír Končický 0373077
 
Jaromír Končický 0373077
+ether-wake:	$(NET_LIB) ether-wake.o
906023f
+		$(CC) $(CFLAGS) $(LDFLAGS) -o ether-wake ether-wake.o $(NLIB)
906023f
+
Jaromír Končický 0373077
 installbin:
Jaromír Končický 0373077
 	@echo
Jaromír Končický 0373077
 	@echo "######################################################"
ac1079b
diff -up net-tools-2.0/man/en_US/ether-wake.8.interfaces net-tools-2.0/man/en_US/ether-wake.8
906023f
--- net-tools-2.0/man/en_US/ether-wake.8.interfaces	2015-09-15 18:02:18.597968123 +0200
906023f
+++ net-tools-2.0/man/en_US/ether-wake.8	2015-09-15 18:02:18.608968093 +0200
ac1079b
@@ -49,7 +49,7 @@ Send the wake-up packet to the broadcast
Jaromír Končický 0373077
 Increase the Debug Level.
Jaromír Končický 0373077
 .TP
Jaromír Končický 0373077
 .B \-i ifname
Jaromír Končický 0373077
-Use interface ifname instead of the default "eth0".
Jaromír Končický 0373077
+Use interface ifname instead of sending a wake packet to all interfaces.
Jaromír Končický 0373077
 .TP
Jaromír Končický 0373077
 .B \-p passwd
Jaromír Končický 0373077
 Append a four or six byte password to the packet. Only a few adapters