svn commit: r195200 - in head/usr.sbin: . wake
M. Warner Losh
imp at bsdimp.com
Tue Jun 30 19:38:16 UTC 2009
wake really is too generic a name for this. Why didn't the wol port
get committed anyway, it seems to be better than this...
Warner
In message: <200906301851.n5UIpNJQ089171 at svn.freebsd.org>
Martin Blapp <mbr at FreeBSD.org> writes:
: Author: mbr
: Date: Tue Jun 30 18:51:22 2009
: New Revision: 195200
: URL: http://svn.freebsd.org/changeset/base/195200
:
: Log:
: Add wake, a tool to send Wake on LAN frames to hosts on a local Ethernet network
:
: Submitted by: Marc Balmer <marc at msys.ch>
: Reviewed by: rwatson
: Approved by: re
:
: M usr.sbin/Makefile
: A usr.sbin/wake
: AM usr.sbin/wake/wake.c
: AM usr.sbin/wake/Makefile
: AM usr.sbin/wake/wake.8
:
: Added:
: head/usr.sbin/wake/
: head/usr.sbin/wake/Makefile (contents, props changed)
: head/usr.sbin/wake/wake.8 (contents, props changed)
: head/usr.sbin/wake/wake.c (contents, props changed)
: Modified:
: head/usr.sbin/Makefile
:
: Modified: head/usr.sbin/Makefile
: ==============================================================================
: --- head/usr.sbin/Makefile Tue Jun 30 17:27:53 2009 (r195199)
: +++ head/usr.sbin/Makefile Tue Jun 30 18:51:22 2009 (r195200)
: @@ -190,6 +190,7 @@ SUBDIR= ${_ac} \
: ${_usbconfig} \
: ${_vidcontrol} \
: vipw \
: + wake \
: watch \
: watchdogd \
: ${_wlandebug} \
:
: Added: head/usr.sbin/wake/Makefile
: ==============================================================================
: --- /dev/null 00:00:00 1970 (empty, because file is newly added)
: +++ head/usr.sbin/wake/Makefile Tue Jun 30 18:51:22 2009 (r195200)
: @@ -0,0 +1,8 @@
: +# $FreeBSD$
: +
: +PROG= wake
: +MAN= wake.8
: +
: +WARNS?= 2
: +
: +.include <bsd.prog.mk>
:
: Added: head/usr.sbin/wake/wake.8
: ==============================================================================
: --- /dev/null 00:00:00 1970 (empty, because file is newly added)
: +++ head/usr.sbin/wake/wake.8 Tue Jun 30 18:51:22 2009 (r195200)
: @@ -0,0 +1,61 @@
: +.\"
: +.\" $FreeBSD$
: +.\"
: +.\" Copyright (c) 2009 Marc Balmer <marc at msys.ch>
: +.\"
: +.\" Permission to use, copy, modify, and distribute this software for any
: +.\" purpose with or without fee is hereby granted, provided that the above
: +.\" copyright notice and this permission notice appear in all copies.
: +.\"
: +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
: +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
: +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
: +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
: +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
: +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
: +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
: +.\"
: +.Dd June 27 2009
: +.Dt WAKE 8
: +.Os
: +.Sh NAME
: +.Nm wake
: +.Nd send Wake on LAN frames to hosts on a local Ethernet network
: +.Sh SYNOPSIS
: +.Nm
: +.Ar interface
: +.Op Ar lladdr ...
: +.Sh DESCRIPTION
: +The
: +.Nm
: +program is used to send Wake on LAN (WoL) frames over a local
: +Ethernet network to one or more hosts using their link layer (hardware)
: +addresses.
: +WoL functionality is generally enabled in a machine's BIOS
: +and can be used to power on machines from a remote system without
: +having physical access to them.
: +.Pp
: +.Ar interface
: +is the network interface of the local machine.
: +.Ar lladdr
: +are the link layer addresses of the remote machines
: +and can be specified as the actual hardware address
: +(six hexadecimal numbers separated by colons)
: +or a hostname entry in
: +.Pa /etc/ethers .
: +Link layer addresses can be determined and set on
: +.Fx
: +machines using
: +.Xr ifconfig 8 .
: +.Sh FILES
: +.Bl -tag -width "/etc/ethers" -compact
: +.It /etc/ethers
: +Ethernet host name database.
: +.El
: +.Sh SEE ALSO
: +.Xr ethers 5 ,
: +.Xr ifconfig 8
: +.Sh AUTHORS
: +.Nm
: +was written by
: +.Ar Marc Balmer Aq marc at msys.ch .
:
: Added: head/usr.sbin/wake/wake.c
: ==============================================================================
: --- /dev/null 00:00:00 1970 (empty, because file is newly added)
: +++ head/usr.sbin/wake/wake.c Tue Jun 30 18:51:22 2009 (r195200)
: @@ -0,0 +1,174 @@
: +/*
: + * Copyright (C) 2006, 2007, 2008, 2009 Marc Balmer <marc at msys.ch>
: + * Copyright (C) 2000 Eugene M. Kim. All rights reserved.
: + *
: + * Redistribution and use in source and binary forms, with or without
: + * modification, are permitted provided that the following conditions
: + * are met:
: + *
: + * 1. Redistributions of source code must retain the above copyright
: + * notice, this list of conditions and the following disclaimer.
: + * 2. Author's name may not be used endorse or promote products derived
: + * from this software without specific prior written permission.
: + *
: + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
: + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
: + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
: + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
: + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
: + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
: + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
: + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
: + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
: + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
: + * POSSIBILITY OF SUCH DAMAGE.
: + */
: +
: +#include <sys/cdefs.h>
: +__FBSDID("$FreeBSD$");
: +
: +#include <sys/types.h>
: +#include <sys/param.h>
: +#include <sys/queue.h>
: +#include <sys/ioctl.h>
: +#include <sys/socket.h>
: +#include <sys/time.h>
: +#include <net/bpf.h>
: +#include <net/if.h>
: +
: +#include <netinet/in.h>
: +#include <netinet/if_ether.h>
: +
: +#include <err.h>
: +#include <errno.h>
: +#include <fcntl.h>
: +#include <limits.h>
: +#include <stdarg.h>
: +#include <stdio.h>
: +#include <stdlib.h>
: +#include <string.h>
: +#include <sysexits.h>
: +#include <unistd.h>
: +
: +#define _PATH_BPF "/dev/bpf"
: +
: +#ifndef SYNC_LEN
: +#define SYNC_LEN 6
: +#endif
: +
: +#ifndef DESTADDR_COUNT
: +#define DESTADDR_COUNT 16
: +#endif
: +
: +void usage(void);
: +
: +int wake(const char *iface, const char *host);
: +int bind_if_to_bpf(char const *ifname, int bpf);
: +int get_ether(char const *text, struct ether_addr *addr);
: +int send_wakeup(int bpf, struct ether_addr const *addr);
: +
: +void
: +usage(void)
: +{
: + (void)fprintf(stderr, "usage: wake interface lladdr\n");
: + exit(0);
: +}
: +
: +int
: +wake(const char *iface, const char *host)
: +{
: + int res, bpf;
: + struct ether_addr macaddr;
: +
: + bpf = open(_PATH_BPF, O_RDWR);
: + if (bpf == -1) {
: + printf("no bpf\n");
: + return -1;
: + }
: + if (bind_if_to_bpf(iface, bpf) == -1 ||
: + get_ether(host, &macaddr) == -1) {
: + (void)close(bpf);
: + return -1;
: + }
: + res = send_wakeup(bpf, &macaddr);
: + (void)close(bpf);
: + return res;
: +}
: +
: +int
: +bind_if_to_bpf(char const *ifname, int bpf)
: +{
: + struct ifreq ifr;
: + u_int dlt;
: +
: + if (strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)) >=
: + sizeof(ifr.ifr_name))
: + return -1;
: + if (ioctl(bpf, BIOCSETIF, &ifr) == -1)
: + return -1;
: + if (ioctl(bpf, BIOCGDLT, &dlt) == -1)
: + return -1;
: + if (dlt != DLT_EN10MB)
: + return -1;
: + return 0;
: +}
: +
: +int
: +get_ether(char const *text, struct ether_addr *addr)
: +{
: + struct ether_addr *paddr;
: +
: + paddr = ether_aton(text);
: + if (paddr != NULL) {
: + *addr = *paddr;
: + return 0;
: + }
: + if (ether_hostton(text, addr))
: + return -1;
: + return 0;
: +}
: +
: +int
: +send_wakeup(int bpf, struct ether_addr const *addr)
: +{
: + struct {
: + struct ether_header hdr;
: + u_char data[SYNC_LEN + ETHER_ADDR_LEN * DESTADDR_COUNT];
: + } pkt;
: + u_char *p;
: + int i;
: + ssize_t bw;
: + ssize_t len;
: +
: + (void)memset(pkt.hdr.ether_dhost, 0xff, sizeof(pkt.hdr.ether_dhost));
: + pkt.hdr.ether_type = htons(0);
: + (void)memset(pkt.data, 0xff, SYNC_LEN);
: + for (p = pkt.data + SYNC_LEN, i = 0; i < DESTADDR_COUNT;
: + p += ETHER_ADDR_LEN, i++)
: + bcopy(addr->octet, p, ETHER_ADDR_LEN);
: + p = (u_char *)&pkt;
: + len = sizeof(pkt);
: + bw = 0;
: + while (len) {
: + if ((bw = write(bpf, &pkt, sizeof(pkt))) == -1)
: + return -1;
: + len -= bw;
: + p += bw;
: + }
: + return 0;
: +}
: +
: +int
: +main(int argc, char *argv[])
: +{
: + int n;
: +
: + if (argc < 3)
: + usage();
: +
: + for (n = 2; n < argc; n++)
: + if (wake(argv[1], argv[n]))
: + warnx("error sending Wake on LAN frame over %s to %s",
: + argv[1], argv[n]);
: + return 0;
: +}
:
More information about the svn-src-head
mailing list