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