gzip cleanup part #8
[oweals/busybox.git] / networking / ether-wake.c
index 9ea5c03666eb766a1ac52935ed2587aaa1c4a023..e205ffc00073adca716ba4dad25eb78b8d22a7a1 100644 (file)
@@ -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 <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
@@ -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;
        }