Example #1
0
File: arp.c Project: Xeslaro/mp
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 */