1145519Sdarrenr/* $FreeBSD: releng/10.3/contrib/ipfilter/ipsend/larp.c 255332 2013-09-06 23:11:19Z cy $ */ 2145510Sdarrenr 322514Sdarrenr/* 453024Sguido * larp.c (C) 1995-1998 Darren Reed 522514Sdarrenr * 680486Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 7145510Sdarrenr * 822514Sdarrenr */ 931183Speter#if !defined(lint) 1031183Speterstatic const char sccsid[] = "@(#)larp.c 1.1 8/19/95 (C)1995 Darren Reed"; 11255332Scystatic const char rcsid[] = "@(#)$Id$"; 1222514Sdarrenr#endif 13145510Sdarrenr#include <sys/param.h> 1422514Sdarrenr#include <sys/types.h> 1522514Sdarrenr#include <sys/socket.h> 1622514Sdarrenr#include <sys/ioctl.h> 1722514Sdarrenr#include <netinet/in.h> 1822514Sdarrenr#include <net/if.h> 1922514Sdarrenr#include <net/if_arp.h> 20145510Sdarrenr#include <stdio.h> 21145510Sdarrenr#include <netdb.h> 22145510Sdarrenr#include <errno.h> 2322514Sdarrenr 2453024Sguido#include "ip_compat.h" 2553024Sguido#include "iplang/iplang.h" 2653024Sguido 2722514Sdarrenr/* 2822514Sdarrenr * lookup host and return 2922514Sdarrenr * its IP address in address 3022514Sdarrenr * (4 bytes) 3122514Sdarrenr */ 32145510Sdarrenrint resolve(host, address) 33255332Scy char *host, *address; 3422514Sdarrenr{ 3522514Sdarrenr struct hostent *hp; 3622514Sdarrenr u_long add; 3722514Sdarrenr 3822514Sdarrenr add = inet_addr(host); 3922514Sdarrenr if (add == -1) 4022514Sdarrenr { 4122514Sdarrenr if (!(hp = gethostbyname(host))) 4222514Sdarrenr { 4322514Sdarrenr fprintf(stderr, "unknown host: %s\n", host); 4422514Sdarrenr return -1; 4522514Sdarrenr } 4622514Sdarrenr bcopy((char *)hp->h_addr, (char *)address, 4); 4722514Sdarrenr return 0; 4822514Sdarrenr } 4922514Sdarrenr bcopy((char*)&add, address, 4); 5022514Sdarrenr return 0; 5122514Sdarrenr} 5222514Sdarrenr 5322514Sdarrenr/* 5422514Sdarrenr * ARP for the MAC address corresponding 5522514Sdarrenr * to the IP address. This taken from 5622514Sdarrenr * some BSD program, I cant remember which. 5722514Sdarrenr */ 5822514Sdarrenrint arp(ip, ether) 59255332Scy char *ip; 60255332Scy char *ether; 6122514Sdarrenr{ 6222514Sdarrenr static int s = -1; 6322514Sdarrenr struct arpreq ar; 6422514Sdarrenr struct sockaddr_in *sin; 6522514Sdarrenr char *inet_ntoa(); 6622514Sdarrenr 6753024Sguido#ifdef IP_SEND 6853024Sguido if (arp_getipv4(ip, ether) == 0) 6953024Sguido return 0; 7053024Sguido#endif 7122514Sdarrenr bzero((char *)&ar, sizeof(ar)); 7222514Sdarrenr sin = (struct sockaddr_in *)&ar.arp_pa; 7322514Sdarrenr sin->sin_family = AF_INET; 7422514Sdarrenr bcopy(ip, (char *)&sin->sin_addr.s_addr, 4); 7522514Sdarrenr 7622514Sdarrenr if (s == -1) 7722514Sdarrenr if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 7822514Sdarrenr { 7922514Sdarrenr perror("arp: socket"); 8022514Sdarrenr return -1; 8122514Sdarrenr } 8222514Sdarrenr 8322514Sdarrenr if (ioctl(s, SIOCGARP, (caddr_t)&ar) == -1) 8422514Sdarrenr { 8522514Sdarrenr fprintf(stderr, "(%s):", inet_ntoa(sin->sin_addr)); 8622514Sdarrenr if (errno != ENXIO) 8722514Sdarrenr perror("SIOCGARP"); 8822514Sdarrenr return -1; 8922514Sdarrenr } 9022514Sdarrenr 9122514Sdarrenr bcopy(ar.arp_ha.sa_data, ether, 6); 9222514Sdarrenr return 0; 9322514Sdarrenr} 94