lsock.c revision 145510
1193323Sed/* $NetBSD$ */ 2193323Sed 3193323Sed/* 4193323Sed * lsock.c (C) 1995-1998 Darren Reed 5193323Sed * 6193323Sed * See the IPFILTER.LICENCE file for details on licencing. 7193323Sed * 8193323Sed */ 9193323Sed#if !defined(lint) 10193323Sedstatic const char sccsid[] = "@(#)lsock.c 1.2 1/11/96 (C)1995 Darren Reed"; 11193323Sedstatic const char rcsid[] = "@(#)Id: lsock.c,v 2.3 2001/06/09 17:09:26 darrenr Exp"; 12193323Sed#endif 13193323Sed#include <stdio.h> 14193323Sed#include <unistd.h> 15193323Sed#include <string.h> 16193323Sed#include <stdlib.h> 17193323Sed#include <stddef.h> 18193323Sed#include <pwd.h> 19198090Srdivacky#include <sys/types.h> 20193323Sed#include <sys/time.h> 21193323Sed#include <sys/param.h> 22193323Sed#include <sys/stat.h> 23193323Sed#include <fcntl.h> 24212904Sdim#include <sys/dir.h> 25198090Srdivacky#define __KERNEL__ 26212904Sdim#if LINUX >= 0200 27193323Sed# undef UINT_MAX 28193323Sed# undef INT_MAX 29193323Sed# undef ULONG_MAX 30198090Srdivacky# undef LONG_MAX 31193323Sed# include <linux/notifier.h> 32193323Sed#endif 33193323Sed#include <linux/fs.h> 34193323Sed#if LINUX >= 0200 35193323Sed#include "linux/netdevice.h" 36193323Sed#include "net/sock.h" 37195340Sed#endif 38193323Sed#undef __KERNEL__ 39193323Sed#include <linux/sched.h> 40239462Sdim#include <linux/netdevice.h> 41239462Sdim#include <nlist.h> 42193323Sed#include <sys/user.h> 43193323Sed#include <sys/socket.h> 44198090Srdivacky#include <math.h> 45239462Sdim#include <netinet/in.h> 46239462Sdim#include <netinet/in_systm.h> 47198090Srdivacky#include <net/if.h> 48198090Srdivacky#if LINUX < 0200 49198090Srdivacky#include <net/inet/sock.h> 50193323Sed#endif 51198090Srdivacky#include "ipsend.h" 52198090Srdivacky 53198090Srdivackyint nproc; 54198090Srdivackystruct task_struct *proc; 55198090Srdivacky 56198090Srdivacky#ifndef KMEM 57198090Srdivacky# ifdef _PATH_KMEM 58198090Srdivacky# define KMEM _PATH_KMEM 59198090Srdivacky# endif 60198090Srdivacky#endif 61198090Srdivacky#ifndef KMEM 62198090Srdivacky# define KMEM "/dev/kmem" 63207618Srdivacky#endif 64198090Srdivacky#ifndef KERNEL 65198090Srdivacky# define KERNEL "/System.map" 66198090Srdivacky#endif 67198090Srdivacky 68198090Srdivackyint kmemcpy(buf, pos, n) 69198090Srdivackychar *buf; 70198090Srdivackyvoid *pos; 71193323Sedint n; 72193323Sed{ 73193323Sed static int kfd = -1; 74193323Sed 75193323Sed if (kfd == -1) 76193323Sed kfd = open(KMEM, O_RDONLY); 77193323Sed 78193323Sed if (lseek(kfd, (off_t)pos, SEEK_SET) == -1) 79193323Sed { 80193323Sed perror("lseek"); 81193323Sed return -1; 82193323Sed } 83234353Sdim if (read(kfd, buf, n) == -1) 84234353Sdim { 85234353Sdim perror("read"); 86234353Sdim return -1; 87234353Sdim } 88198090Srdivacky return n; 89193323Sed} 90193323Sed 91193323Sedstruct nlist names[3] = { 92234353Sdim { "_task" }, 93234353Sdim { "_nr_tasks" }, 94193323Sed { NULL } 95193323Sed }; 96193323Sed 97193323Sedstruct task_struct *getproc() 98193323Sed{ 99193323Sed struct task_struct *p, **pp; 100234353Sdim void *v; 101193323Sed pid_t pid = getpid(); 102193323Sed int siz, n; 103193323Sed 104193323Sed n = nlist(KERNEL, names); 105193323Sed if (n != 0) 106199481Srdivacky { 107199481Srdivacky fprintf(stderr, "nlist(%#x) == %d\n", names, n); 108193323Sed return NULL; 109193323Sed } 110193323Sed if (KMCPY(&nproc, names[1].n_value, sizeof(nproc)) == -1) 111193323Sed { 112198090Srdivacky fprintf(stderr, "read nproc (%#x)\n", names[1].n_value); 113198090Srdivacky return NULL; 114239462Sdim } 115239462Sdim siz = nproc * sizeof(struct task_struct *); 116193323Sed if (KMCPY(&v, names[0].n_value, sizeof(v)) == -1) 117193323Sed { 118193323Sed fprintf(stderr, "read(%#x,%#x,%d) proc\n", 119193323Sed names[0].n_value, &v, sizeof(v)); 120193323Sed return NULL; 121193323Sed } 122193323Sed pp = (struct task_struct **)malloc(siz); 123193323Sed if (KMCPY(pp, v, siz) == -1) 124221345Sdim { 125200581Srdivacky fprintf(stderr, "read(%#x,%#x,%d) proc\n", 126193323Sed v, pp, siz); 127221345Sdim return NULL; 128193323Sed } 129193323Sed proc = (struct task_struct *)malloc(siz); 130193323Sed for (n = 0; n < NR_TASKS; n++) 131193323Sed { 132193323Sed if (KMCPY((proc + n), pp[n], sizeof(*proc)) == -1) 133193323Sed { 134193323Sed fprintf(stderr, "read(%#x,%#x,%d) proc\n", 135193323Sed pp[n], proc + n, sizeof(*proc)); 136193323Sed return NULL; 137207618Srdivacky } 138207618Srdivacky } 139207618Srdivacky 140198090Srdivacky p = proc; 141198090Srdivacky 142210299Sed for (n = NR_TASKS; n; n--, p++) 143210299Sed if (p->pid == pid) 144210299Sed break; 145210299Sed if (!n) 146234353Sdim return NULL; 147234353Sdim 148193323Sed return p; 149193323Sed} 150234353Sdim 151234353Sdim 152223017Sdimstruct sock *find_tcp(fd, ti) 153193323Sedint fd; 154193323Sedstruct tcpiphdr *ti; 155198090Srdivacky{ 156195340Sed struct sock *s; 157193323Sed struct inode *i; 158198090Srdivacky struct files_struct *fs; 159223017Sdim struct task_struct *p; 160223017Sdim struct file *f, **o; 161223017Sdim 162234353Sdim if (!(p = getproc())) 163198090Srdivacky return NULL; 164198090Srdivacky 165198090Srdivacky fs = p->files; 166210299Sed o = (struct file **)calloc(1, sizeof(*o) * (fs->count + 1)); 167234353Sdim if (KMCPY(o, fs->fd, (fs->count + 1) * sizeof(*o)) == -1) 168198090Srdivacky { 169198090Srdivacky fprintf(stderr, "read(%#x,%#x,%d) - fd - failed\n", 170193323Sed fs->fd, o, sizeof(*o)); 171193323Sed return NULL; 172193323Sed } 173198090Srdivacky f = (struct file *)calloc(1, sizeof(*f)); 174234353Sdim if (KMCPY(f, o[fd], sizeof(*f)) == -1) 175193323Sed { 176193323Sed fprintf(stderr, "read(%#x,%#x,%d) - o[fd] - failed\n", 177223017Sdim o[fd], f, sizeof(*f)); 178193323Sed return NULL; 179198090Srdivacky } 180198090Srdivacky 181195340Sed i = (struct inode *)calloc(1, sizeof(*i)); 182198090Srdivacky if (KMCPY(i, f->f_inode, sizeof(*i)) == -1) 183223017Sdim { 184223017Sdim fprintf(stderr, "read(%#x,%#x,%d) - f_inode - failed\n", 185198892Srdivacky f->f_inode, i, sizeof(*i)); 186198892Srdivacky return NULL; 187198892Srdivacky } 188198892Srdivacky return i->u.socket_i.data; 189198892Srdivacky} 190198892Srdivacky 191198892Srdivackyint do_socket(dev, mtu, ti, gwip) 192198892Srdivackychar *dev; 193198892Srdivackyint mtu; 194198892Srdivackystruct tcpiphdr *ti; 195239462Sdimstruct in_addr gwip; 196239462Sdim{ 197198892Srdivacky struct sockaddr_in rsin, lsin; 198198892Srdivacky struct sock *s, sk; 199198892Srdivacky int fd, nfd, len; 200234353Sdim 201234353Sdim printf("Dest. Port: %d\n", ti->ti_dport); 202234353Sdim 203234353Sdim fd = socket(AF_INET, SOCK_STREAM, 0); 204226633Sdim if (fd == -1) 205198892Srdivacky { 206198090Srdivacky perror("socket"); 207198090Srdivacky return -1; 208198090Srdivacky } 209198090Srdivacky 210198090Srdivacky if (fcntl(fd, F_SETFL, FNDELAY) == -1) 211198090Srdivacky { 212198090Srdivacky perror("fcntl"); 213198090Srdivacky return -1; 214198090Srdivacky } 215198090Srdivacky 216193323Sed bzero((char *)&lsin, sizeof(lsin)); 217234353Sdim lsin.sin_family = AF_INET; 218193323Sed bcopy((char *)&ti->ti_src, (char *)&lsin.sin_addr, 219198090Srdivacky sizeof(struct in_addr)); 220198090Srdivacky if (bind(fd, (struct sockaddr *)&lsin, sizeof(lsin)) == -1) 221198090Srdivacky { 222193323Sed perror("bind"); 223193323Sed return -1; 224193323Sed } 225234353Sdim len = sizeof(lsin); 226234353Sdim (void) getsockname(fd, (struct sockaddr *)&lsin, &len); 227193323Sed ti->ti_sport = lsin.sin_port; 228234353Sdim printf("sport %d\n", ntohs(lsin.sin_port)); 229193323Sed nfd = initdevice(dev, 0); 230234353Sdim 231193323Sed if (!(s = find_tcp(fd, ti))) 232193323Sed return -1; 233198090Srdivacky 234198090Srdivacky bzero((char *)&rsin, sizeof(rsin)); 235198090Srdivacky rsin.sin_family = AF_INET; 236212904Sdim bcopy((char *)&ti->ti_dst, (char *)&rsin.sin_addr, 237212904Sdim sizeof(struct in_addr)); 238212904Sdim rsin.sin_port = ti->ti_dport; 239198090Srdivacky if (connect(fd, (struct sockaddr *)&rsin, sizeof(rsin)) == -1 && 240212904Sdim errno != EINPROGRESS) 241198090Srdivacky { 242198090Srdivacky perror("connect"); 243193323Sed return -1; 244210299Sed } 245210299Sed KMCPY(&sk, s, sizeof(sk)); 246221345Sdim ti->ti_win = sk.window; 247221345Sdim ti->ti_seq = sk.sent_seq - 1; 248210299Sed ti->ti_ack = sk.rcv_ack_seq; 249210299Sed ti->ti_flags = TH_SYN; 250210299Sed 251210299Sed if (send_tcp(nfd, mtu, (ip_t *)ti, gwip) == -1) 252221345Sdim return -1; 253210299Sed (void)write(fd, "Hello World\n", 12); 254210299Sed sleep(2); 255198090Srdivacky close(fd); 256210299Sed return 0; 257198090Srdivacky} 258198090Srdivacky