1 /* 2 * Copyright (c) 1988, 1990 Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 #ifndef lint 8 static char sccsid[] = "@(#)xi_sink.c 7.2 (Berkeley) 11/13/90"; 9 #endif /* not lint */ 10 11 /* 12 * This is a test program to be a sink for TP4 connections. 13 */ 14 #include <sys/param.h> 15 #include <sys/uio.h> 16 #include <sys/socket.h> 17 #include <sys/ioctl.h> 18 #include <net/route.h> 19 #include <net/if.h> 20 #include <netccitt/x25.h> 21 22 #include <stdio.h> 23 #include <errno.h> 24 #include <ctype.h> 25 #include <netdb.h> 26 27 28 #define dbprintf if(verbose)printf 29 #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\ 30 if(x<0) {perror("a"); myexit(0);}} 31 32 33 struct ifreq ifr; 34 short port = 3000; 35 struct sockaddr_x25 faddr, laddr = { sizeof(laddr), AF_CCITT }; 36 struct sockaddr_x25 *sx25 = &laddr; 37 char **xenvp; 38 39 long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0; 40 long records, intercept = 0, isode_mode; 41 42 char buf[2048]; 43 char your_it[] = "You're it!"; 44 45 char *Servername; 46 47 main(argc, argv, envp) 48 int argc; 49 char *argv[]; 50 char *envp[]; 51 { 52 register char **av = argv; 53 register char *cp; 54 55 xenvp = envp; 56 while(--argc > 0) { 57 av++; 58 if (strcmp(*av,"host")==0) { 59 av++; 60 ccitt_addr(*av, sx25); 61 argc--; 62 } else if (strcmp(*av,"count")==0) { 63 av++; 64 sscanf(*av,"%ld",&count); 65 argc--; 66 } else if (strcmp(*av,"size")==0) { 67 av++; 68 sscanf(*av,"%ld",&size); 69 argc--; 70 } else if (strcmp(*av, "intercept")==0) { 71 intercept++; 72 } 73 } 74 tisink(); 75 } 76 #define BIG 2048 77 #define MIDLIN 512 78 char readbuf[BIG]; 79 struct iovec iov[1] = { 80 readbuf, 81 sizeof readbuf, 82 }; 83 char name[MIDLIN]; 84 union { 85 struct { 86 struct cmsghdr cmhdr; 87 char cmdata[128 - sizeof(struct cmsghdr)]; 88 } cm; 89 char data[128]; 90 } cbuf; 91 #define control cbuf.data 92 struct msghdr msghdr = { 93 name, sizeof(name), 94 iov, sizeof(iov)/sizeof(iov[1]), 95 control, sizeof control, 96 0 /* flags */ 97 }; 98 99 tisink() 100 { 101 int x, s, pid, on = 1, loop = 0, n; 102 extern int errno; 103 104 try(socket, (AF_CCITT, SOCK_STREAM, 0),""); 105 106 s = x; 107 108 sx25->x25_opts.op_flags |= X25_MQBIT; 109 try(bind, (s, (struct sockaddr *) sx25, sx25->x25_len), ""); 110 111 /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */ 112 113 try(listen, (s, 5), ""); 114 for(;;) { 115 int child, ns; 116 int addrlen = sizeof(faddr); 117 char childname[50]; 118 119 try (accept, (s, &faddr, &addrlen), ""); 120 ns = x; 121 dumpit("connection from:", &faddr, sizeof faddr); 122 if (mynamep || intercept) { 123 addrlen = sizeof(faddr); 124 try (getsockname, (ns, &faddr, &addrlen), ""); 125 dumpit("connected as:", &faddr, addrlen); 126 } 127 loop++; 128 if (loop > 3) myexit(0); 129 if (forkp) { 130 try(fork, (), ""); 131 } else 132 x = 0; 133 if (x == 0) { 134 long n, count = 0, cn, flags; 135 records = 0; 136 #ifdef ISODE_MODE 137 if (isode_mode) { 138 static char fdbuf[10]; 139 static char *nargv[4] = 140 {"/usr/sbin/isod.tsap", fdbuf, "", 0}; 141 sprintf(fdbuf, "Z%d", ns); 142 old_isod_main(3, nargv, xenvp); 143 } else 144 #endif 145 for (;;) { 146 msghdr.msg_iovlen = 1; 147 msghdr.msg_controllen = sizeof(control); 148 iov->iov_len = sizeof(readbuf); 149 n = recvmsg(ns, &msghdr, 0); 150 flags = msghdr.msg_flags; 151 count++; 152 dbprintf("recvmsg from child %d got %d ctl %d flags %x\n", 153 getpid(), n, (cn = msghdr.msg_controllen), 154 flags); 155 fflush(stdout); 156 if (cn && verbose) 157 dumpit("control data:\n", control, cn); 158 if (n < 0) { 159 fprintf(stderr, "errno is %d\n", errno); 160 perror("recvmsg"); 161 /*sleep (10);*/ 162 break; 163 } else { 164 if (verbose) 165 dumpit("data:\n", readbuf, n); 166 } 167 if (echop) { 168 n = answerback(flags, n, ns); 169 } 170 if (flags & MSG_EOR) 171 records++; 172 if (playtag && n == sizeof(your_it) && (flags & MSG_EOR) 173 && bcmp(readbuf, your_it, n) == 0) { 174 printf("Answering back!!!!\n"); 175 answerback(flags, n, ns); 176 answerback(flags, n, ns); 177 } 178 errno = 0; 179 } 180 } 181 myexit(0); 182 } 183 } 184 answerback(flags, n, ns) 185 { 186 msghdr.msg_controllen = 0; 187 msghdr.msg_iovlen = 1; 188 iov->iov_len = n; 189 n = sendmsg(ns, &msghdr, flags); 190 dbprintf("echoed %d\n", n); 191 return n; 192 } 193 194 dumpit(what, where, n) 195 char *what; unsigned short *where; int n; 196 { 197 unsigned short *s = where; 198 unsigned short *z = where + (n+1)/2; 199 int count = 0; 200 printf(what); 201 while(s < z) { 202 count++; 203 printf("%x ",*s++); 204 if ((count & 15) == 0) 205 putchar('\n'); 206 } 207 if (count & 15) 208 putchar('\n'); 209 fflush(stdout); 210 } 211 myexit(n) 212 { 213 fflush(stderr); 214 printf("got %d records\n", records); 215 fflush(stdout); 216 exit(n); 217 } 218