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[] = "@(#)tisink.c 7.4 (Berkeley) 04/25/91"; 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 #define TCPT_NTIMERS 4 21 #include <netiso/iso.h> 22 #include <netiso/tp_param.h> 23 #include <netiso/tp_user.h> 24 25 #include <stdio.h> 26 #include <errno.h> 27 #include <ctype.h> 28 #include <netdb.h> 29 30 31 #define dbprintf if(verbose)printf 32 #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\ 33 if(x<0) {perror("a"); myexit(0);}} 34 35 36 struct ifreq ifr; 37 short port = 3000; 38 struct sockaddr_iso faddr, laddr = { sizeof(laddr), AF_ISO }; 39 struct sockaddr_iso *siso = &laddr; 40 char **xenvp; 41 42 long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0; 43 long records, intercept = 0, isode_mode; 44 45 char buf[2048]; 46 char your_it[] = "You're it!"; 47 48 char *Servername; 49 50 main(argc, argv, envp) 51 int argc; 52 char *argv[]; 53 char *envp[]; 54 { 55 register char **av = argv; 56 register char *cp; 57 struct iso_addr iso_addr(); 58 59 xenvp = envp; 60 while(--argc > 0) { 61 av++; 62 if(strcmp(*av,"Servername")==0) { 63 av++; 64 Servername = *av; 65 argc--; 66 } else if (strcmp(*av,"host")==0) { 67 av++; 68 laddr.siso_addr = iso_addr(*av); 69 argc--; 70 } else if (strcmp(*av,"count")==0) { 71 av++; 72 sscanf(*av,"%ld",&count); 73 argc--; 74 } else if (strcmp(*av,"port")==0) { 75 av++; 76 sscanf(*av,"%hd",&port); 77 argc--; 78 } else if (strcmp(*av,"size")==0) { 79 av++; 80 sscanf(*av,"%ld",&size); 81 argc--; 82 } else if (strcmp(*av, "intercept")==0) { 83 intercept++; 84 } 85 } 86 if (Servername) { 87 int tlen = laddr.siso_tlen = strlen(Servername); 88 int len = TSEL(siso) + tlen - (caddr_t) &siso; 89 if (len > sizeof(*siso)) { 90 siso = (struct sockaddr_iso *)malloc(len); 91 *siso = laddr; 92 siso->siso_len = len; 93 } 94 bcopy(Servername, TSEL(siso), tlen); 95 } else { 96 port = htons(port); 97 laddr.siso_tlen = sizeof(port); 98 bcopy((char *)&port, TSEL(siso), sizeof(port)); 99 } 100 tisink(); 101 } 102 #define BIG 2048 103 #define MIDLIN 512 104 char readbuf[BIG]; 105 struct iovec iov[1] = { 106 readbuf, 107 sizeof readbuf, 108 }; 109 char name[MIDLIN]; 110 union { 111 struct { 112 struct cmsghdr cmhdr; 113 char cmdata[128 - sizeof(struct cmsghdr)]; 114 } cm; 115 char data[128]; 116 } cbuf; 117 #define control cbuf.data 118 struct msghdr msghdr = { 119 name, sizeof(name), 120 iov, sizeof(iov)/sizeof(iov[1]), 121 control, sizeof control, 122 0 /* flags */ 123 }; 124 125 tisink() 126 { 127 int x, s, pid, on = 1, loop = 0, n; 128 extern int errno; 129 130 try(socket, (AF_ISO, SOCK_SEQPACKET, 0),""); 131 132 s = x; 133 134 try(bind, (s, (struct sockaddr *) siso, siso->siso_len), ""); 135 136 /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */ 137 138 try(listen, (s, 5), ""); 139 if (intercept) { 140 try(setsockopt, 141 (s, SOL_TRANSPORT, TPOPT_INTERCEPT, &on, sizeof(on)), ""); 142 } 143 for(;;) { 144 int child, ns; 145 int addrlen = sizeof(faddr); 146 char childname[50]; 147 148 try (accept, (s, &faddr, &addrlen), ""); 149 ns = x; 150 dumpit("connection from:", &faddr, sizeof faddr); 151 if (mynamep || intercept) { 152 addrlen = sizeof(faddr); 153 try (getsockname, (ns, &faddr, &addrlen), ""); 154 dumpit("connected as:", &faddr, addrlen); 155 } 156 loop++; 157 if (loop > 3) myexit(0); 158 if (forkp) { 159 try(fork, (), ""); 160 } else 161 x = 0; 162 if (x == 0) { 163 long n, count = 0, cn, flags; 164 records = 0; 165 if (confp) { 166 msghdr.msg_iovlen = 0; 167 msghdr.msg_namelen = 0; 168 msghdr.msg_controllen = 169 cbuf.cm.cmhdr.cmsg_len = sizeof (cbuf.cm.cmhdr); 170 cbuf.cm.cmhdr.cmsg_level = SOL_TRANSPORT; 171 cbuf.cm.cmhdr.cmsg_type = TPOPT_CFRM_DATA; 172 n = sendmsg(ns, &msghdr, 0); 173 if (n <= 0) { 174 printf("confirm: errno is %d\n", errno); 175 fflush(stdout); 176 perror("Confirm error"); 177 } else { 178 dbprintf("confim ok\n"); 179 } 180 sleep(10); 181 } 182 #ifdef ISODE_MODE 183 if (isode_mode) { 184 static char fdbuf[10]; 185 static char *nargv[4] = 186 {"/usr/sbin/isod.tsap", fdbuf, "", 0}; 187 sprintf(fdbuf, "Z%d", ns); 188 old_isod_main(3, nargv, xenvp); 189 } else 190 #endif 191 for (;;) { 192 msghdr.msg_iovlen = 1; 193 msghdr.msg_controllen = sizeof(control); 194 iov->iov_len = sizeof(readbuf); 195 n = recvmsg(ns, &msghdr, 0); 196 flags = msghdr.msg_flags; 197 count++; 198 dbprintf("recvmsg from child %d got %d ctl %d flags %x\n", 199 getpid(), n, (cn = msghdr.msg_controllen), 200 flags); 201 fflush(stdout); 202 if (cn && verbose) 203 dumpit("control data:\n", control, cn); 204 if (n < 0) { 205 fprintf(stderr, "errno is %d\n", errno); 206 perror("recvmsg"); 207 /*sleep (10);*/ 208 break; 209 } else { 210 if (verbose) 211 dumpit("data:\n", readbuf, n); 212 } 213 if (echop) { 214 n = answerback(flags, n, ns); 215 } 216 if (flags & MSG_EOR) 217 records++; 218 if (playtag && n == sizeof(your_it) && (flags & MSG_EOR) 219 && bcmp(readbuf, your_it, n) == 0) { 220 printf("Answering back!!!!\n"); 221 answerback(flags, n, ns); 222 answerback(flags, n, ns); 223 } 224 errno = 0; 225 } 226 } 227 myexit(0); 228 } 229 } 230 answerback(flags, n, ns) 231 { 232 msghdr.msg_controllen = 0; 233 msghdr.msg_iovlen = 1; 234 iov->iov_len = n; 235 n = sendmsg(ns, &msghdr, flags); 236 dbprintf("echoed %d\n", n); 237 return n; 238 } 239 240 dumpit(what, where, n) 241 char *what; unsigned short *where; int n; 242 { 243 unsigned short *s = where; 244 unsigned short *z = where + (n+1)/2; 245 int count = 0; 246 printf(what); 247 while(s < z) { 248 count++; 249 printf("%x ",*s++); 250 if ((count & 15) == 0) 251 putchar('\n'); 252 } 253 if (count & 15) 254 putchar('\n'); 255 fflush(stdout); 256 } 257 myexit(n) 258 { 259 fflush(stderr); 260 printf("got %d records\n", records); 261 fflush(stdout); 262 exit(n); 263 } 264