larp.c revision 22514
122514Sdarrenr/*
222514Sdarrenr * larp.c (C) 1995 Darren Reed
322514Sdarrenr *
422514Sdarrenr * The author provides this program as-is, with no gaurantee for its
522514Sdarrenr * suitability for any specific purpose.  The author takes no responsibility
622514Sdarrenr * for the misuse/abuse of this program and provides it for the sole purpose
722514Sdarrenr * of testing packet filter policies.  This file maybe distributed freely
822514Sdarrenr * providing it is not modified and that this notice remains in tact.
922514Sdarrenr */
1022514Sdarrenr#if !defined(lint) && defined(LIBC_SCCS)
1122514Sdarrenrstatic	char	sccsid[] = "@(#)larp.c	1.1 8/19/95 (C)1995 Darren Reed";
1222514Sdarrenr#endif
1322514Sdarrenr#include <stdio.h>
1422514Sdarrenr#include <errno.h>
1522514Sdarrenr#include <sys/types.h>
1622514Sdarrenr#include <sys/socket.h>
1722514Sdarrenr#include <sys/ioctl.h>
1822514Sdarrenr#include <netdb.h>
1922514Sdarrenr#include <netinet/in.h>
2022514Sdarrenr#include <net/if.h>
2122514Sdarrenr#include <net/if_arp.h>
2222514Sdarrenr
2322514Sdarrenr/*
2422514Sdarrenr * lookup host and return
2522514Sdarrenr * its IP address in address
2622514Sdarrenr * (4 bytes)
2722514Sdarrenr */
2822514Sdarrenrint	resolve(host, address)
2922514Sdarrenrchar	*host, *address;
3022514Sdarrenr{
3122514Sdarrenr        struct	hostent	*hp;
3222514Sdarrenr        u_long	add;
3322514Sdarrenr
3422514Sdarrenr	add = inet_addr(host);
3522514Sdarrenr	if (add == -1)
3622514Sdarrenr	    {
3722514Sdarrenr		if (!(hp = gethostbyname(host)))
3822514Sdarrenr		    {
3922514Sdarrenr			fprintf(stderr, "unknown host: %s\n", host);
4022514Sdarrenr			return -1;
4122514Sdarrenr		    }
4222514Sdarrenr		bcopy((char *)hp->h_addr, (char *)address, 4);
4322514Sdarrenr		return 0;
4422514Sdarrenr	}
4522514Sdarrenr	bcopy((char*)&add, address, 4);
4622514Sdarrenr	return 0;
4722514Sdarrenr}
4822514Sdarrenr
4922514Sdarrenr/*
5022514Sdarrenr * ARP for the MAC address corresponding
5122514Sdarrenr * to the IP address.  This taken from
5222514Sdarrenr * some BSD program, I cant remember which.
5322514Sdarrenr */
5422514Sdarrenrint	arp(ip, ether)
5522514Sdarrenrchar	*ip;
5622514Sdarrenrchar	*ether;
5722514Sdarrenr{
5822514Sdarrenr	static	int	s = -1;
5922514Sdarrenr	struct	arpreq	ar;
6022514Sdarrenr	struct	sockaddr_in	*sin;
6122514Sdarrenr	char	*inet_ntoa();
6222514Sdarrenr
6322514Sdarrenr	bzero((char *)&ar, sizeof(ar));
6422514Sdarrenr	sin = (struct sockaddr_in *)&ar.arp_pa;
6522514Sdarrenr	sin->sin_family = AF_INET;
6622514Sdarrenr	bcopy(ip, (char *)&sin->sin_addr.s_addr, 4);
6722514Sdarrenr
6822514Sdarrenr	if (s == -1)
6922514Sdarrenr		if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
7022514Sdarrenr		    {
7122514Sdarrenr			perror("arp: socket");
7222514Sdarrenr			return -1;
7322514Sdarrenr		    }
7422514Sdarrenr
7522514Sdarrenr	if (ioctl(s, SIOCGARP, (caddr_t)&ar) == -1)
7622514Sdarrenr	    {
7722514Sdarrenr		fprintf(stderr, "(%s):", inet_ntoa(sin->sin_addr));
7822514Sdarrenr		if (errno != ENXIO)
7922514Sdarrenr			perror("SIOCGARP");
8022514Sdarrenr		return -1;
8122514Sdarrenr	    }
8222514Sdarrenr
8322514Sdarrenr	bcopy(ar.arp_ha.sa_data, ether, 6);
8422514Sdarrenr	return 0;
8522514Sdarrenr}
86