sirix.c revision 145511
1234285Sdim/* $NetBSD$ */ 2234285Sdim 3234285Sdim/* 4234285Sdim * (C)opyright 1992-1998 Darren Reed. 5234285Sdim * (C)opyright 1997 Marc Boucher. 6234285Sdim * 7234285Sdim * See the IPFILTER.LICENCE file for details on licencing. 8234285Sdim * 9234285Sdim */ 10234285Sdim#include <stdio.h> 11234285Sdim#include <sys/types.h> 12234285Sdim#include <string.h> 13234285Sdim#include <unistd.h> 14234285Sdim#include <stdlib.h> 15234285Sdim#include <errno.h> 16234285Sdim#include <sys/socket.h> 17234285Sdim#include <sys/ioctl.h> 18234285Sdim 19234285Sdim#include <net/if.h> 20234285Sdim#include <net/raw.h> 21234285Sdim#include <netinet/in.h> 22234285Sdim#include <netinet/in_systm.h> 23234285Sdim#include <netinet/ip.h> 24234285Sdim#include <netinet/if_ether.h> 25234285Sdim#include <netinet/ip_var.h> 26234285Sdim#include "ipsend.h" 27234285Sdim#include <netinet/udp_var.h> 28234285Sdim 29234285Sdim#if !defined(lint) && defined(LIBC_SCCS) 30234285Sdimstatic char sirix[] = "@(#)sirix.c 1.0 10/9/97 (C)1997 Marc Boucher"; 31234285Sdim#endif 32234285Sdim 33234285Sdim 34234285Sdimint initdevice(char *device, int tout) 35234285Sdim{ 36234285Sdim int fd; 37234285Sdim struct sockaddr_raw sr; 38234285Sdim 39234285Sdim if ((fd = socket(PF_RAW, SOCK_RAW, RAWPROTO_DRAIN)) < 0) 40234285Sdim { 41234285Sdim perror("socket(PF_RAW, SOCK_RAW, RAWPROTO_DRAIN)"); 42234285Sdim return -1; 43234285Sdim } 44234285Sdim 45234285Sdim memset(&sr, 0, sizeof(sr)); 46234285Sdim sr.sr_family = AF_RAW; 47234285Sdim sr.sr_port = ETHERTYPE_IP; 48234285Sdim strncpy(sr.sr_ifname, device, sizeof(sr.sr_ifname)); 49234285Sdim if (bind(fd, &sr, sizeof(sr)) < 0) 50234285Sdim { 51234285Sdim perror("bind AF_RAW"); 52234285Sdim close(fd); 53234285Sdim return -1; 54234285Sdim } 55234285Sdim return fd; 56234285Sdim} 57234285Sdim 58234285Sdim 59234285Sdim/* 60234285Sdim * output an IP packet 61234285Sdim */ 62234285Sdimint sendip(int fd, char *pkt, int len) 63234285Sdim{ 64234285Sdim struct sockaddr_raw sr; 65234285Sdim int srlen = sizeof(sr); 66234285Sdim struct ifreq ifr; 67234285Sdim struct ether_header *eh = (struct ether_header *)pkt; 68234285Sdim 69234285Sdim if (getsockname(fd, &sr, &srlen) == -1) 70234285Sdim { 71234285Sdim perror("getsockname"); 72234285Sdim return -1; 73234285Sdim } 74234285Sdim 75234285Sdim memset(&ifr, 0, sizeof(ifr)); 76234285Sdim strncpy(ifr.ifr_name, sr.sr_ifname, sizeof ifr.ifr_name); 77234285Sdim 78234285Sdim if (ioctl(fd, SIOCGIFADDR, &ifr) == -1) 79234285Sdim { 80234285Sdim perror("ioctl SIOCGIFADDR"); 81234285Sdim return -1; 82234285Sdim } 83234285Sdim 84234285Sdim memcpy(eh->ether_shost, ifr.ifr_addr.sa_data, sizeof(eh->ether_shost)); 85234285Sdim 86234285Sdim if (write(fd, pkt, len) == -1) 87234285Sdim { 88234285Sdim perror("send"); 89234285Sdim return -1; 90234285Sdim } 91234285Sdim 92234285Sdim return len; 93234285Sdim} 94234285Sdim