From owner-freebsd-hackers Tue Jan 4 13: 3:42 2000 Delivered-To: freebsd-hackers@freebsd.org Received: from bootp.sls.usu.edu (bootp.sls.usu.edu [129.123.82.251]) by hub.freebsd.org (Postfix) with ESMTP id 134A914D5E for ; Tue, 4 Jan 2000 13:03:37 -0800 (PST) (envelope-from kurto@bootp.sls.usu.edu) Received: (from root@localhost) by bootp.sls.usu.edu (8.9.3/8.9.3) id OAA19991; Tue, 4 Jan 2000 14:12:20 -0700 (MST) (envelope-from kurto) Date: Tue, 4 Jan 2000 14:12:20 -0700 (MST) From: Kurt Olsen Message-Id: <200001042112.OAA19991@bootp.sls.usu.edu> To: freebsd-hackers@FreeBSD.ORG, mreimer@vpop.net Subject: Re: Porting ether-wake.c from Linux In-Reply-To: <38724BC2.767E9055@vpop.net> Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG I've not looked at ether-wake, but I use the attached program to wake up machines. It's not very fancy, but it does work for me. The limitation that an ARP entry for the destination machine is somewhat annoying, but not insurmountable. As you can see, it uses UDP packets instead of constructing raw packets to be sent. Kurt Olsen kurto@bootp.sls.usu.edu --- /* * the wakie-wakie program */ #include #include #include #include #define BUF_LEN 256 void fatal_error(char *message) { fprintf(stderr, "%s", message); exit(1); } void parse(char *addr_in, u_int32_t *addr_out) { int i,j,k; j = 0; for (i = 0; i < 50 && addr_in[i] != '\0'; i++) { if (addr_in[i] == '.') j++; } if (j != 3) fatal_error("Need four octets in ip address.\n"); *addr_out = 0; for (j = 0, i = 0; i < 4; i++) { k = atoi(&addr_in[j]); if (k < 0 || k > 255) fatal_error("Individual octets in ip address must be in the range 0-255.\n"); *addr_out = *addr_out * 256 + k; while (i < 3 && addr_in[j] != '.') j++; j++; } *addr_out = htonl(*addr_out); } int main(int argc, char **argv) { char buf[BUF_LEN]; int i,j,k,l,m; int thesock; struct sockaddr_in to; memset (buf, 0, BUF_LEN); if (argc < 3 || ((argc-1)&0x1) == 1) { fprintf(stderr, "Need ip and ethernet address pairs.\n"); fprintf(stderr, "\t%s [ ...]\n", *argv); exit(1); } for (m = 1; m < argc; m+=2, argv+=2) { thesock = socket(AF_INET, SOCK_DGRAM, 0); if (thesock < 0) fatal_error("Couldn't make a socket.\n"); if (strlen(*(argv+2)) != 12) fatal_error("Ethernet addresses require 12 digits.\n"); buf[0] = 0xff; buf[1] = 0xff; buf[2] = 0xff; buf[3] = 0xff; buf[4] = 0xff; buf[5] = 0xff; for (i = 1; i < 17; i++) { for (j = 0; j < 6; j++) { k = *(*(argv+2)+j*2); if (k >= 'a' && k <= 'f') k -= ('a'-'A'); l = *(*(argv+2)+j*2+1); if (l >= 'a' && l <= 'f') l -= ('a'-'A'); k -= '0'; if (k > 9) k -= 7; l -= '0'; if (l > 9) l -= 7; k = k * 16 + l; buf[j+i*6] = k; } } to.sin_len = sizeof(to); to.sin_family = AF_INET; to.sin_port = 5432; parse(*(argv+1), &(to.sin_addr.s_addr)); if (sendto(thesock,&buf,BUF_LEN,0,(struct sockaddr *)&to,sizeof(to)) < 0) fatal_error("Couldn't send UDP packet.\n"); close(thesock); } } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message