#include <netinet/ether.h>
#include <linux/if.h>
-#include "busybox.h"
+#include "libbb.h"
/* Note: PF_INET, SOCK_DGRAM, IPPROTO_UDP would allow SIOCGIFHWADDR to
* work as non-root, but we need SOCK_PACKET to specify the Ethernet
printf("packet dump:\n");
for (i = 0; i < pktsize; ++i) {
printf("%2.2x ", outpack[i]);
- if (i % 20 == 19) puts("");
+ if (i % 20 == 19) bb_putchar('\n');
}
printf("\n\n");
}
if (eap) {
*eaddr = *eap;
bb_debug_msg("The target station address is %s\n\n", ether_ntoa(eaddr));
-#if !defined(__UCLIBC__)
+#if !defined(__UCLIBC_MAJOR__) \
+ || __UCLIBC_MAJOR__ > 0 \
+ || __UCLIBC_MINOR__ > 9 \
+ || (__UCLIBC_MINOR__ == 9 && __UCLIBC_SUBLEVEL__ >= 30)
} else if (ether_hostton(hostid, eaddr) == 0) {
bb_debug_msg("Station address for hostname %s is %s\n\n", hostid, ether_ntoa(eaddr));
#endif
byte_cnt = sscanf(ethoptarg, "%u.%u.%u.%u",
&passwd[0], &passwd[1], &passwd[2], &passwd[3]);
if (byte_cnt < 4) {
- bb_error_msg("cannot read Wake-On-LAN pass");
+ bb_error_msg("can't read Wake-On-LAN pass");
return 0;
}
// TODO: check invalid numbers >255??
return byte_cnt;
}
-int ether_wake_main(int argc, char **argv);
-int ether_wake_main(int argc, char **argv)
+int ether_wake_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int ether_wake_main(int argc UNUSED_PARAM, char **argv)
{
const char *ifname = "eth0";
- char *pass = NULL;
+ char *pass;
unsigned flags;
unsigned char wol_passwd[6];
int wol_passwd_sz = 0;
-
int s; /* Raw socket */
int pktsize;
unsigned char outpack[1000];
struct whereto_t whereto; /* who to wake up */
/* handle misc user options */
- flags = getopt32(argc, argv, "bi:p:", &ifname, &pass);
- if (optind == argc)
- bb_show_usage();
- if (pass)
+ opt_complementary = "=1";
+ flags = getopt32(argv, "bi:p:", &ifname, &pass);
+ if (flags & 4) /* -p */
wol_passwd_sz = get_wol_pw(pass, wol_passwd);
+ flags &= 1; /* we further interested only in -b [bcast] flag */
/* create the raw socket */
s = make_socket();
/* now that we have a raw socket we can drop root */
- xsetuid(getuid());
+ /* xsetuid(getuid()); - but save on code size... */
/* look up the dest mac address */
get_dest_addr(argv[optind], &eaddr);
/* fill out the header of the packet */
- pktsize = get_fill(outpack, &eaddr, flags & 1 /* OPT_BROADCAST */);
+ pktsize = get_fill(outpack, &eaddr, flags /* & 1 OPT_BROADCAST */);
bb_debug_dump_packet(outpack, pktsize);
{
struct ifreq if_hwaddr;
- strncpy(if_hwaddr.ifr_name, ifname, sizeof(if_hwaddr.ifr_name));
- if (ioctl(s, SIOCGIFHWADDR, &if_hwaddr) != 0)
- bb_perror_msg_and_die("SIOCGIFHWADDR on %s failed", ifname);
+ strncpy_IFNAMSIZ(if_hwaddr.ifr_name, ifname);
+ ioctl_or_perror_and_die(s, SIOCGIFHWADDR, &if_hwaddr, "SIOCGIFHWADDR on %s failed", ifname);
memcpy(outpack+6, if_hwaddr.ifr_hwaddr.sa_data, 6);
bb_debug_dump_packet(outpack, pktsize);
/* This is necessary for broadcasts to work */
- if (flags & 1 /* OPT_BROADCAST */) {
+ if (flags /* & 1 OPT_BROADCAST */) {
if (setsockopt_broadcast(s) != 0)
bb_perror_msg("SO_BROADCAST");
}
#if defined(PF_PACKET)
{
struct ifreq ifr;
- strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
- if (ioctl(s, SIOCGIFINDEX, &ifr) != 0)
- bb_perror_msg_and_die("SIOCGIFINDEX");
+ strncpy_IFNAMSIZ(ifr.ifr_name, ifname);
+ xioctl(s, SIOCGIFINDEX, &ifr);
memset(&whereto, 0, sizeof(whereto));
whereto.sll_family = AF_PACKET;
whereto.sll_ifindex = ifr.ifr_ifindex;