/* * wol.c * * Created by Sékiltoyai on 05/03/09. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BASE_DEV "/dev/bpf0" #define MAGIC_LEN 6 #define REPEAT_TIME 16 struct wol_packet { struct ether_header hdr; u_char magic_packet[MAGIC_LEN]; u_char repeat_addr[ETHER_ADDR_LEN][REPEAT_TIME]; }; int wol_init(int *fd, const char *iface) { char device[] = BASE_DEV; device[strlen(device)-1] = '0'; while((*fd=open(device, O_RDWR))<0) { if(errno != EBUSY) { printf("Erreur open : %d\n", errno); return -1; } if( (++device[strlen(device)-1]) > '9' ) { printf("Erreur périphérique bpf*"); return -1; } } int buflen = 128; if(ioctl(*fd, BIOCSBLEN, &buflen)<0) { printf("Erreur ioctl_buflen : %d\n", errno); return -1; } struct ifreq ifrequest; strncpy(ifrequest.ifr_name, iface, sizeof(iface)); if(ioctl(*fd, BIOCSETIF, &ifrequest)<0) { printf("Erreur ioctl_setif : %d\n", errno); return -1; } return 0; } int wol_send(int fd, u_char dhost[ETHER_ADDR_LEN]) { struct wol_packet *msg = malloc( sizeof(struct wol_packet) ); memcpy(msg->hdr.ether_dhost, dhost, ETHER_ADDR_LEN); bzero(msg->hdr.ether_shost, ETHER_ADDR_LEN); msg->hdr.ether_type = 0; memset(msg->magic_packet, 0xff, MAGIC_LEN); void *repeat_pos = msg->repeat_addr; void *repeat_end = msg->repeat_addr + REPEAT_TIME*ETHER_ADDR_LEN*sizeof(u_char); while(repeat_pos