1145519Sdarrenr/* $FreeBSD$ */ 2145510Sdarrenr 322514Sdarrenr/* 422514Sdarrenr * Based upon 4.4BSD's /usr/sbin/arp 522514Sdarrenr */ 622514Sdarrenr#include <sys/param.h> 722514Sdarrenr#include <sys/file.h> 822514Sdarrenr#include <sys/socket.h> 922514Sdarrenr#include <sys/sysctl.h> 1022514Sdarrenr#include <net/if.h> 11145510Sdarrenr#if __FreeBSD_version >= 300000 12145510Sdarrenr# include <net/if_var.h> 13145510Sdarrenr#endif 1422514Sdarrenr#include <net/if_dl.h> 1522514Sdarrenr#include <net/if_types.h> 16170268Sdarrenr#ifndef __osf__ 17170268Sdarrenr# include <net/route.h> 18170268Sdarrenr#endif 1922514Sdarrenr#include <netinet/in.h> 2022514Sdarrenr#include <netinet/if_ether.h> 2122514Sdarrenr#include <arpa/inet.h> 22145510Sdarrenr#include <netinet/in.h> 23145510Sdarrenr#include <netinet/in_systm.h> 24145510Sdarrenr#include <netinet/ip.h> 25145510Sdarrenr#include <netinet/ip_var.h> 26145510Sdarrenr#include <netinet/tcp.h> 27145510Sdarrenr#include <unistd.h> 28145510Sdarrenr#include <string.h> 29145510Sdarrenr#include <stdlib.h> 3022514Sdarrenr#include <netdb.h> 3122514Sdarrenr#include <errno.h> 3222514Sdarrenr#include <nlist.h> 3322514Sdarrenr#include <stdio.h> 3424583Sdarrenr#include "ipsend.h" 3553024Sguido#include "iplang/iplang.h" 3622514Sdarrenr 3724583Sdarrenr 3822514Sdarrenr/* 3922514Sdarrenr * lookup host and return 4022514Sdarrenr * its IP address in address 4122514Sdarrenr * (4 bytes) 4222514Sdarrenr */ 43145510Sdarrenrint resolve(host, address) 44255332Scy char *host, *address; 4522514Sdarrenr{ 4622514Sdarrenr struct hostent *hp; 4722514Sdarrenr u_long add; 4822514Sdarrenr 4922514Sdarrenr add = inet_addr(host); 5022514Sdarrenr if (add == -1) 5122514Sdarrenr { 5222514Sdarrenr if (!(hp = gethostbyname(host))) 5322514Sdarrenr { 5422514Sdarrenr fprintf(stderr, "unknown host: %s\n", host); 5522514Sdarrenr return -1; 5622514Sdarrenr } 5722514Sdarrenr bcopy((char *)hp->h_addr, (char *)address, 4); 5822514Sdarrenr return 0; 5922514Sdarrenr } 6022514Sdarrenr bcopy((char*)&add, address, 4); 6122514Sdarrenr return 0; 6222514Sdarrenr} 6322514Sdarrenr 6422514Sdarrenr 6522514Sdarrenrint arp(addr, eaddr) 66255332Scy char *addr, *eaddr; 6722514Sdarrenr{ 6822514Sdarrenr int mib[6]; 6922514Sdarrenr size_t needed; 7023279Speter char *lim, *buf, *next; 7122514Sdarrenr struct rt_msghdr *rtm; 72246143Sglebius struct sockaddr_in *sin; 7322514Sdarrenr struct sockaddr_dl *sdl; 7422514Sdarrenr 7553024Sguido#ifdef IPSEND 7667615Sdarrenr if (arp_getipv4(addr, ether) == 0) 7753024Sguido return 0; 7853024Sguido#endif 7953024Sguido 80145510Sdarrenr if (!addr) 81145510Sdarrenr return -1; 82145510Sdarrenr 8322514Sdarrenr mib[0] = CTL_NET; 8422514Sdarrenr mib[1] = PF_ROUTE; 8522514Sdarrenr mib[2] = 0; 8622514Sdarrenr mib[3] = AF_INET; 8722514Sdarrenr mib[4] = NET_RT_FLAGS; 88186119Sqingli#ifdef RTF_LLINFO 8922514Sdarrenr mib[5] = RTF_LLINFO; 90186119Sqingli#else 91186119Sqingli mib[5] = 0; 92186119Sqingli#endif 93186119Sqingli 9422514Sdarrenr if (sysctl(mib, 6, NULL, &needed, NULL, 0) == -1) 9522514Sdarrenr { 9622514Sdarrenr perror("route-sysctl-estimate"); 9722514Sdarrenr exit(-1); 9822514Sdarrenr } 9922514Sdarrenr if ((buf = malloc(needed)) == NULL) 10022514Sdarrenr { 10122514Sdarrenr perror("malloc"); 10222514Sdarrenr exit(-1); 10322514Sdarrenr } 10422514Sdarrenr if (sysctl(mib, 6, buf, &needed, NULL, 0) == -1) 10522514Sdarrenr { 10622514Sdarrenr perror("actual retrieval of routing table"); 10722514Sdarrenr exit(-1); 10822514Sdarrenr } 10922514Sdarrenr lim = buf + needed; 11022514Sdarrenr for (next = buf; next < lim; next += rtm->rtm_msglen) 11122514Sdarrenr { 11222514Sdarrenr rtm = (struct rt_msghdr *)next; 113246143Sglebius sin = (struct sockaddr_in *)(rtm + 1); 11422514Sdarrenr sdl = (struct sockaddr_dl *)(sin + 1); 115145510Sdarrenr if (!bcmp(addr, (char *)&sin->sin_addr, 116145510Sdarrenr sizeof(struct in_addr))) 11722514Sdarrenr { 11822514Sdarrenr bcopy(LLADDR(sdl), eaddr, sdl->sdl_alen); 11922514Sdarrenr return 0; 12022514Sdarrenr } 12122514Sdarrenr } 12222514Sdarrenr return -1; 12322514Sdarrenr} 124