From c8dfd52a5b9f92bbb5a9c53bca3c905a9cf519c8 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 9 Mar 2009 09:25:32 +0000 Subject: new revision --- Makefile | 2 +- wakeup.c | 85 ----------------------------------------------- wol.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 86 deletions(-) delete mode 100644 wakeup.c create mode 100644 wol.c diff --git a/Makefile b/Makefile index f7dd722..1394374 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # $Id$ -PROG= wakeup +PROG= wol CFLAGS+= -ggdb -Wall NOMAN= diff --git a/wakeup.c b/wakeup.c deleted file mode 100644 index bfb97a0..0000000 --- a/wakeup.c +++ /dev/null @@ -1,85 +0,0 @@ -/* $Id$ */ -/* - * Copyright (c) 2004 Dimitri Sokolyuk - * - * 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. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define DEFAULTMAC "00:e0:c5:c4:09:f1" -#define DEFAULTNET "255.255.255.255" - -int parsemac(unsigned char *, char *); - -int -main(int argc, char **argv) -{ -// struct hostent *he; - struct sockaddr_in sin; - struct in_addr inaddr; - char *msg; - char *mac = DEFAULTMAC; - char *net = DEFAULTNET; - unsigned char macaddr[6]; - int sockfd; - int optval = 1; - int i, j; - int msglen = sizeof(macaddr) * 16 + 6; - - msg = malloc(sizeof(char) * msglen); - memset(msg, 0xff, 6); - parsemac(macaddr, mac); - for (i = 0; i < 16; i++) { - for (j = 0; j < 6; j++) { - msg[i * 6 + 6 + j] = macaddr[j]; - } - } -// he = gethostbyname(net); - inet_aton(net, &inaddr); - memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; -// sin.sin_addr = *((struct in_addr *) he->h_addr); - sin.sin_addr = inaddr; - sin.sin_port = htons(7); - sockfd = socket(AF_INET, SOCK_DGRAM, 0); - setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(optval)); - sendto(sockfd, msg, msglen, 0, (struct sockaddr *)&sin, sizeof(sin)); - free(msg); - close(sockfd); - return 0; -} - -int -parsemac(unsigned char *macaddr, char *mac) -{ - char *pp; - long l; - int i; - - for (i = 0; i < 6; i++) { - l = strtol(mac, &pp, 16); - macaddr[i] = (unsigned char)l; - mac = pp + 1; - } - return 0; -} diff --git a/wol.c b/wol.c new file mode 100644 index 0000000..ffaa9da --- /dev/null +++ b/wol.c @@ -0,0 +1,113 @@ +/* $Id$ */ +/* + * Copyright (c) 2009 Dimitri Sokolyuk + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +char *bcast = "255.255.255.255"; + +int +parsemac(char *macaddr, char *str) +{ + char *p; + int i; + long l; + + for (i = 0; i < 6; ++i) { + l = strtol(str, &p, 0x10); + macaddr[i] = (char)l; + str = p + 1; + } + + return 0; +} + +void +usage() +{ + extern char *__progname; + + fprintf(stderr, "usage: %s [-n network] mac\n", __progname); + + exit(1); +} + +int +spit(char *net, char *msg, int len) +{ + struct hostent *he; + struct sockaddr_in sin; + int fd; + int optval = 1; + + he = gethostbyname(net); + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_addr = *((struct in_addr *)he->h_addr); + sin.sin_port = htons(7); + + fd = socket(AF_INET, SOCK_DGRAM, 0); + setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(optval)); + sendto(fd, msg, len, 0, (struct sockaddr *)&sin, sizeof(sin)); + close(fd); + + return 0; +} + +int +main(int argc, char **argv) +{ + char msg[17][6]; + char macaddr[6]; + char *net, *mac; + int c, i; + + net = bcast; + mac = NULL; + + while ((c = getopt(argc, argv, "n:")) != -1) + switch (c) { + case 'n': + net = strdup(optarg); + break; + default: + usage(); + } + + argc -= optind; + argv += optind; + + if (!argc) + usage(); + + mac = strdup(*argv); + parsemac(macaddr, mac); + + memset(msg[0], 0xff, sizeof(msg[0])); + for (i = 0; i < 16; ++i) + memcpy(msg[i+1], macaddr, sizeof(macaddr)); + + spit(net, (char *)msg, sizeof(msg)); + + return 0; +} -- cgit v1.2.3