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
[EMAIL PROTECTED]

---

/*
 * the wakie-wakie program
 */

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#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 <ip> <ether> [<ip <ether> ...]\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 [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to