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