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-all mailing list