sockraw.c revision 145510
1/* $NetBSD$ */ 2 3/* 4 * (C)opyright 2000 Darren Reed. 5 * 6 * See the IPFILTER.LICENCE file for details on licencing. 7 * 8 * WARNING: Attempting to use this .c file on HP-UX 11.00 will cause the 9 * system to crash. 10 */ 11#include <sys/param.h> 12#include <sys/types.h> 13#include <sys/socket.h> 14#include <sys/ioctl.h> 15 16#include <net/if.h> 17#include <netinet/in.h> 18#include <netinet/in_systm.h> 19#include <netinet/ip.h> 20#include <netinet/if_ether.h> 21#include <netinet/ip_var.h> 22#include <netinet/udp.h> 23#include <netinet/udp_var.h> 24#include <netinet/tcp.h> 25#include <stdio.h> 26#include <string.h> 27#include <unistd.h> 28#include <stdlib.h> 29#include <errno.h> 30#include "ipsend.h" 31 32#if !defined(lint) && defined(LIBC_SCCS) 33static char sirix[] = "@(#)sirix.c 1.0 10/9/97 (C)1997 Marc Boucher"; 34#endif 35 36 37int initdevice(char *device, int tout) 38{ 39 struct sockaddr s; 40 struct ifreq ifr; 41 int fd; 42 43 memset(&ifr, 0, sizeof(ifr)); 44 strncpy(ifr.ifr_name, device, sizeof ifr.ifr_name); 45 46 if ((fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) 47 { 48 perror("socket(AF_INET, SOCK_RAW, IPPROTO_RAW)"); 49 return -1; 50 } 51 52 if (ioctl(fd, SIOCGIFADDR, &ifr) == -1) 53 { 54 perror("ioctl SIOCGIFADDR"); 55 return -1; 56 } 57 58 bzero((char *)&s, sizeof(s)); 59 s.sa_family = AF_INET; 60 bcopy(&ifr.ifr_addr, s.sa_data, 4); 61 if (bind(fd, &s, sizeof(s)) == -1) 62 perror("bind"); 63 return fd; 64} 65 66 67/* 68 * output an IP packet 69 */ 70int sendip(int fd, char *pkt, int len) 71{ 72 struct ether_header *eh; 73 struct sockaddr_in sin; 74 75 eh = (struct ether_header *)pkt; 76 bzero((char *)&sin, sizeof(sin)); 77 sin.sin_family = AF_INET; 78 pkt += 14; 79 len -= 14; 80 bcopy(pkt + 12, (char *)&sin.sin_addr, 4); 81 82 if (sendto(fd, pkt, len, 0, &sin, sizeof(sin)) == -1) 83 { 84 perror("send"); 85 return -1; 86 } 87 88 return len; 89} 90