+/* vi: set sw=4 ts=4: */
/*
* ether-wake.c - Send a magic packet to wake up sleeping machines.
*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
+ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*
* Author: Donald Becker, http://www.scyld.com/"; http://www.scyld.com/wakeonlan.html
* Busybox port: Christian Volkmann <haveaniceday@online.de>
/* full usage according Donald Becker
* usage: ether-wake [-i <ifname>] [-p aa:bb:cc:dd[:ee:ff]] 00:11:22:33:44:55\n"
*
- * This program generates and transmits a Wake-On-LAN (WOL)\n"
- * \"Magic Packet\", used for restarting machines that have been\n"
- * soft-powered-down (ACPI D3-warm state).\n"
- * It currently generates the standard AMD Magic Packet format, with\n"
- * an optional password appended.\n"
+ * This program generates and transmits a Wake-On-LAN (WOL)\n"
+ * \"Magic Packet\", used for restarting machines that have been\n"
+ * soft-powered-down (ACPI D3-warm state).\n"
+ * It currently generates the standard AMD Magic Packet format, with\n"
+ * an optional password appended.\n"
*
- * The single required parameter is the Ethernet MAC (station) address\n"
- * of the machine to wake or a host ID with known NSS 'ethers' entry.\n"
- * The MAC address may be found with the 'arp' program while the target\n"
- * machine is awake.\n"
+ * The single required parameter is the Ethernet MAC (station) address\n"
+ * of the machine to wake or a host ID with known NSS 'ethers' entry.\n"
+ * The MAC address may be found with the 'arp' program while the target\n"
+ * machine is awake.\n"
*
- * Options:\n"
- * -b Send wake-up packet to the broadcast address.\n"
- * -D Increase the debug level.\n"
- * -i ifname Use interface IFNAME instead of the default 'eth0'.\n"
- * -p <pw> Append the four or six byte password PW to the packet.\n"
- * A password is only required for a few adapter types.\n"
- * The password may be specified in ethernet hex format\n"
- * or dotted decimal (Internet address)\n"
- * -p 00:22:44:66:88:aa\n"
- * -p 192.168.1.1\n";
- *
+ * Options:\n"
+ * -b Send wake-up packet to the broadcast address.\n"
+ * -D Increase the debug level.\n"
+ * -i ifname Use interface IFNAME instead of the default 'eth0'.\n"
+ * -p <pw> Append the four or six byte password PW to the packet.\n"
+ * A password is only required for a few adapter types.\n"
+ * The password may be specified in ethernet hex format\n"
+ * or dotted decimal (Internet address)\n"
+ * -p 00:22:44:66:88:aa\n"
+ * -p 192.168.1.1\n";
+ *
+ *
+ * This program generates and transmits a Wake-On-LAN (WOL) "Magic Packet",
+ * used for restarting machines that have been soft-powered-down
+ * (ACPI D3-warm state). It currently generates the standard AMD Magic Packet
+ * format, with an optional password appended.
+ *
+ * This software may be used and distributed according to the terms
+ * of the GNU Public License, incorporated herein by reference.
+ * Contact the author for use under other terms.
+ *
+ * This source file was originally part of the network tricks package, and
+ * is now distributed to support the Scyld Beowulf system.
+ * Copyright 1999-2003 Donald Becker and Scyld Computing Corporation.
+ *
+ * The author may be reached as becker@scyld, or C/O
+ * Scyld Computing Corporation
+ * 914 Bay Ridge Road, Suite 220
+ * Annapolis MD 21403
*
- * This program generates and transmits a Wake-On-LAN (WOL) "Magic Packet",
- * used for restarting machines that have been soft-powered-down
- * (ACPI D3-warm state). It currently generates the standard AMD Magic Packet
- * format, with an optional password appended.
- *
- * This software may be used and distributed according to the terms
- * of the GNU Public License, incorporated herein by reference.
- * Contact the author for use under other terms.
- *
- * This source file was originally part of the network tricks package, and
- * is now distributed to support the Scyld Beowulf system.
- * Copyright 1999-2003 Donald Becker and Scyld Computing Corporation.
- *
- * The author may be reached as becker@scyld, or C/O
- * Scyld Computing Corporation
- * 914 Bay Ridge Road, Suite 220
- * Annapolis MD 21403
- *
* Notes:
* On some systems dropping root capability allows the process to be
* dumped, traced or debugged.
* If someone traces this program, they get control of a raw socket.
* Linux handles this safely, but beware when porting this program.
- *
+ *
* An alternative to needing 'root' is using a UDP broadcast socket, however
* doing so only works with adapters configured for unicast+broadcast Rx
* filter. That configuration consumes more power.
*/
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <ctype.h>
-#include <string.h>
-
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <features.h>
#include <netpacket/packet.h>
#include <net/ethernet.h>
-#include <netdb.h>
#include <netinet/ether.h>
-
-#ifdef __linux__
#include <linux/if.h>
-#endif
#include "busybox.h"
*/
#ifdef PF_PACKET
# define whereto_t sockaddr_ll
-# define make_socket() socket(PF_PACKET, SOCK_RAW, 0)
+# define make_socket() xsocket(PF_PACKET, SOCK_RAW, 0)
#else
# define whereto_t sockaddr
-# define make_socket() socket(AF_INET, SOCK_PACKET, SOCK_PACKET)
+# define make_socket() xsocket(AF_INET, SOCK_PACKET, SOCK_PACKET)
#endif
#ifdef DEBUG
printf("packet dump:\n");
for (i = 0; i < pktsize; ++i) {
printf("%2.2x ", outpack[i]);
- if (i % 20 == 19) printf("\n");
+ if (i % 20 == 19) puts("");
}
printf("\n\n");
}
static inline int get_fill(unsigned char *pkt, struct ether_addr *eaddr, int broadcast);
static inline int get_wol_pw(const char *ethoptarg, unsigned char *wol_passwd);
-int etherwake_main(int argc, char *argv[])
+int ether_wake_main(int argc, char *argv[])
{
char *ifname = "eth0", *pass = NULL;
unsigned long flags;
struct whereto_t whereto; /* who to wake up */
/* handle misc user options */
- flags = bb_getopt_ulflags(argc, argv, "bi:p:", &ifname, &pass);
+ flags = getopt32(argc, argv, "bi:p:", &ifname, &pass);
if (optind == argc)
bb_show_usage();
if (pass)
/* create the raw socket */
s = make_socket();
- if (s < 0)
- bb_perror_msg_and_die(bb_msg_can_not_create_raw_socket);
/* now that we have a raw socket we can drop root */
- setuid(getuid());
+ xsetuid(getuid());
/* look up the dest mac address */
get_dest_addr(argv[optind], &eaddr);
byte_cnt = sscanf(ethoptarg, "%d.%d.%d.%d",
&passwd[0], &passwd[1], &passwd[2], &passwd[3]);
if (byte_cnt < 4) {
- bb_error_msg("Unable to read the Wake-On-LAN pass");
+ bb_error_msg("unable to read the Wake-On-LAN pass");
return 0;
}