Module Name: src
Committed By: christos
Date: Fri Jun 26 17:38:32 UTC 2009
Modified Files:
src/usr.sbin/wake: wake.c
Log Message:
- include <paths.h> for _PATH_BPF explicitly.
- make sure that everything sets errno appropriately so we can use warn/err
- only open and setup bpf once since if this does not work we fail and don't
do extra work.
- use getprogname
- static local functions and no parameters.
I think this utility should be renamed wakeonlan because wake is too generic.
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/usr.sbin/wake/wake.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.sbin/wake/wake.c
diff -u src/usr.sbin/wake/wake.c:1.4 src/usr.sbin/wake/wake.c:1.5
--- src/usr.sbin/wake/wake.c:1.4 Fri Jun 26 05:00:49 2009
+++ src/usr.sbin/wake/wake.c Fri Jun 26 13:38:32 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: wake.c,v 1.4 2009/06/26 09:00:49 mbalmer Exp $ */
+/* $NetBSD: wake.c,v 1.5 2009/06/26 17:38:32 christos Exp $ */
/*
* Copyright (C) 2006, 2007, 2008, 2009 Marc Balmer <[email protected]>
@@ -49,6 +49,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <paths.h>
#include <sysexits.h>
#include <unistd.h>
@@ -60,62 +61,53 @@
#define DESTADDR_COUNT 16
#endif
-__dead 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);
+static __dead void usage(void);
+static int wake(int, const char *);
+static int bind_if_to_bpf(char const *, int);
+static int get_ether(char const *, struct ether_addr *);
+static int send_wakeup(int, struct ether_addr const *);
-void
+static void
usage(void)
{
- extern char *__progname;
-
- (void)fprintf(stderr, "usage: %s interface lladdr\n", __progname);
+ (void)fprintf(stderr, "Usage: %s interface lladdr\n", getprogname());
exit(0);
}
-int
-wake(const char *iface, const char *host)
+static int
+wake(int bpf, const char *host)
{
- int res, bpf;
struct ether_addr macaddr;
- bpf = open(_PATH_BPF, O_RDWR);
- if (bpf == -1) {
- printf("no bpf\n");
+ if (get_ether(host, &macaddr) == -1)
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;
+
+ return send_wakeup(bpf, &macaddr);
}
-int
+static 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))
+ sizeof(ifr.ifr_name)) {
+ errno = ENAMETOOLONG;
return -1;
+ }
if (ioctl(bpf, BIOCSETIF, &ifr) == -1)
return -1;
if (ioctl(bpf, BIOCGDLT, &dlt) == -1)
return -1;
- if (dlt != DLT_EN10MB)
+ if (dlt != DLT_EN10MB) {
+ errno = EOPNOTSUPP;
return -1;
+ }
return 0;
}
-int
+static int
get_ether(char const *text, struct ether_addr *addr)
{
struct ether_addr *paddr;
@@ -130,7 +122,7 @@
return 0;
}
-int
+static int
send_wakeup(int bpf, struct ether_addr const *addr)
{
struct {
@@ -147,8 +139,8 @@
(void)memset(pkt.data, 0xff, SYNC_LEN);
for (p = pkt.data + SYNC_LEN, i = 0; i < DESTADDR_COUNT;
p += ETHER_ADDR_LEN, i++)
- memcpy(p, addr->ether_addr_octet, ETHER_ADDR_LEN);
- p = (u_char *)&pkt;
+ (void)memcpy(p, addr->ether_addr_octet, ETHER_ADDR_LEN);
+ p = (u_char *)(void *)&pkt;
len = sizeof(pkt);
bw = 0;
while (len) {
@@ -163,14 +155,20 @@
int
main(int argc, char *argv[])
{
- int n;
+ int bpf, n;
if (argc < 3)
usage();
+ if ((bpf = open(_PATH_BPF, O_RDWR)) == -1)
+ err(1, "Cannot open bpf interface");
+
+ if (bind_if_to_bpf(argv[1], bpf) == -1)
+ err(1, "Cannot bind to interface `%s'", argv[1]);
+
for (n = 2; n < argc; n++)
- if (wake(argv[1], argv[n]))
- warnx("error sending Wake on LAN frame over %s to %s",
+ if (wake(bpf, argv[n]))
+ warn("Cannot send Wake on LAN frame over `%s' to `%s'",
argv[1], argv[n]);
return 0;
}