X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=networking%2Fether-wake.c;h=e205ffc00073adca716ba4dad25eb78b8d22a7a1;hb=52933d47bd86d6d992f7290fad93d63b53f7a15f;hp=9ea5c03666eb766a1ac52935ed2587aaa1c4a023;hpb=d84a35f649189ae14b4a2be235c13c3e86445d65;p=oweals%2Fbusybox.git diff --git a/networking/ether-wake.c b/networking/ether-wake.c index 9ea5c0366..e205ffc00 100644 --- a/networking/ether-wake.c +++ b/networking/ether-wake.c @@ -1,10 +1,8 @@ +/* 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 @@ -14,78 +12,63 @@ /* full usage according Donald Becker * usage: ether-wake [-i ] [-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 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 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 -#include -#include -#include -#include -#include - -#include -#include -#include -#include #include #include -#include #include - -#ifdef __linux__ #include -#endif #include "busybox.h" @@ -95,10 +78,10 @@ */ #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 @@ -109,7 +92,7 @@ void bb_debug_dump_packet(unsigned char *outpack, int pktsize) 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"); } @@ -122,7 +105,7 @@ static inline void get_dest_addr(const char *arg, struct ether_addr *eaddr); 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; @@ -137,7 +120,7 @@ int etherwake_main(int argc, char *argv[]) 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) @@ -145,11 +128,9 @@ int etherwake_main(int argc, char *argv[]) /* 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); @@ -164,7 +145,7 @@ int etherwake_main(int argc, char *argv[]) { struct ifreq if_hwaddr; - strcpy(if_hwaddr.ifr_name, ifname); + 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); @@ -194,8 +175,7 @@ int etherwake_main(int argc, char *argv[]) /* This is necessary for broadcasts to work */ if (flags /*& 1 [OPT_BROADCAST]*/) { - int one = 1; - if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (void *)&one, sizeof(one)) < 0) + if (setsockopt_broadcast(s) < 0) bb_perror_msg("SO_BROADCAST"); } @@ -289,7 +269,7 @@ static inline int get_wol_pw(const char *ethoptarg, unsigned char *wol_passwd) 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("cannot read Wake-On-LAN pass"); return 0; }