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