int main(int c, char *z[]) { errn1(packet_socket = socket(AF_PACKET, SOCK_RAW, rev2(ETH_P_ALL)), "open socket error"); struct sockaddr_ll sa_ll_b, sa_ll_s; sa_ll_b.sll_family = sa_ll_s.sll_family = AF_PACKET; sa_ll_b.sll_protocol = rev2(ETH_P_ALL), sa_ll_b.sll_ifindex = get_ifindex(packet_socket, net_if); sa_ll_s.sll_halen = 0x06, sa_ll_s.sll_ifindex = get_ifindex(packet_socket, net_if), strcpy(sa_ll_s.sll_addr, "\xff\xff\xff\xff\xff\xff"); ok0(bind(packet_socket, (struct sockaddr*)&sa_ll_b, sizeof(struct sockaddr_ll)), "bind error"); char msg[1500+14]; int len = mk_arp_request_packet(msg, "\xcc\xcc\xcc\xcc\xcc\xcc", conv_ip("1.1.1.1"), conv_ip(z[1])); semi a; a.socket = packet_socket, a.len = len, a.msg = msg, a.sa_ll = &sa_ll_s; pthread_t thread_info; ok0(sem_init(&sem_info, 0, 0), "sem_init error"); ok0(pthread_create(&thread_info, NULL, send_eth_packet, (void*)&a), "pthread_create error"); f = set_promiscuous(packet_socket, net_if); signal(SIGALRM, alarm_handler); alarm(2); while (1) { ok0(sem_post(&sem_info), "sem_post error"); errn1(recvfrom(packet_socket, msg, 1514, 0, NULL, NULL), "recvfrom error"); if (*((short*)(msg+12)) == rev2(0x0806) && *((int*)(msg+28)) == conv_ip(z[1])) { int i; for (i=0;i<6;i++) printf("%.2x%c", msg[22+i]&0xff, (i+1==6)?'\n':':'); if (f) leave_promiscuous(packet_socket, net_if); return 0; } } }
static Term rev2(Term t, Term done) { if (!cons_term(t)) return done; else return rev2(ARG(t,1), listterm_cons(ARG(t,0), done)); } /* rev2 */
/* PUBLIC */ Term listterm_reverse(Term t) { Term reversed = rev2(t, get_nil_term()); listterm_zap(t); return reversed; } /* listterm_reverse */