summaryrefslogtreecommitdiff
path: root/wakeup.c
blob: 0f4c1ee72c6b16c05e4e768adfc154dcc770da24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <err.h>

#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;
}