From f2651cb0140ba345f8cf89257d0e3473e6cda570 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 30 Jan 2009 13:28:41 +0000 Subject: wakeup on lan --- Makefile | 7 +++++++ wakeup.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 Makefile create mode 100644 wakeup.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f9763c2 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +# $Id$ + +PROG= wakeup +CFLAGS+= -ggdb +NOMAN= + +.include \ No newline at end of file diff --git a/wakeup.c b/wakeup.c new file mode 100644 index 0000000..0f4c1ee --- /dev/null +++ b/wakeup.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define DEFAULTMAC "00:0a:5e:09:6a:25" +#define DEFAULTNET "10.0.0.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; + 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, NULL, 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, NULL); + setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(optval)); + sendto(sockfd, msg, msglen, NULL, (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; +} -- cgit v1.2.3