1/* $FreeBSD$ */ 2 3/* 4 * larp.c (C) 1995-1998 Darren Reed 5 * 6 * See the IPFILTER.LICENCE file for details on licencing. 7 * 8 */ 9#if !defined(lint) 10static const char sccsid[] = "@(#)larp.c 1.1 8/19/95 (C)1995 Darren Reed"; 11static const char rcsid[] = "@(#)$Id$"; 12#endif 13#include <sys/param.h> 14#include <sys/types.h> 15#include <sys/socket.h> 16#include <sys/ioctl.h> 17#include <netinet/in.h> 18#include <net/if.h> 19#include <net/if_arp.h> 20#include <stdio.h> 21#include <netdb.h> 22#include <errno.h> 23 24#include "ip_compat.h" 25#include "iplang/iplang.h" 26 27/* 28 * lookup host and return 29 * its IP address in address 30 * (4 bytes) 31 */ 32int resolve(host, address) 33 char *host, *address; 34{ 35 struct hostent *hp; 36 u_long add; 37 38 add = inet_addr(host); 39 if (add == -1) 40 { 41 if (!(hp = gethostbyname(host))) 42 { 43 fprintf(stderr, "unknown host: %s\n", host); 44 return -1; 45 } 46 bcopy((char *)hp->h_addr, (char *)address, 4); 47 return 0; 48 } 49 bcopy((char*)&add, address, 4); 50 return 0; 51} 52 53/* 54 * ARP for the MAC address corresponding 55 * to the IP address. This taken from 56 * some BSD program, I cant remember which. 57 */ 58int arp(ip, ether) 59 char *ip; 60 char *ether; 61{ 62 static int s = -1; 63 struct arpreq ar; 64 struct sockaddr_in *sin; 65 char *inet_ntoa(); 66 67#ifdef IP_SEND 68 if (arp_getipv4(ip, ether) == 0) 69 return 0; 70#endif 71 bzero((char *)&ar, sizeof(ar)); 72 sin = (struct sockaddr_in *)&ar.arp_pa; 73 sin->sin_family = AF_INET; 74 bcopy(ip, (char *)&sin->sin_addr.s_addr, 4); 75 76 if (s == -1) 77 if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 78 { 79 perror("arp: socket"); 80 return -1; 81 } 82 83 if (ioctl(s, SIOCGARP, (caddr_t)&ar) == -1) 84 { 85 fprintf(stderr, "(%s):", inet_ntoa(sin->sin_addr)); 86 if (errno != ENXIO) 87 perror("SIOCGARP"); 88 return -1; 89 } 90 91 bcopy(ar.arp_ha.sa_data, ether, 6); 92 return 0; 93} 94