|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1988, 1991 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms, with or without ! 6: * modification, are permitted provided that the following conditions ! 7: * are met: ! 8: * 1. Redistributions of source code must retain the above copyright ! 9: * notice, this list of conditions and the following disclaimer. ! 10: * 2. Redistributions in binary form must reproduce the above copyright ! 11: * notice, this list of conditions and the following disclaimer in the ! 12: * documentation and/or other materials provided with the distribution. ! 13: * 3. All advertising materials mentioning features or use of this software ! 14: * must display the following acknowledgement: ! 15: * This product includes software developed by the University of ! 16: * California, Berkeley and its contributors. ! 17: * 4. Neither the name of the University nor the names of its contributors ! 18: * may be used to endorse or promote products derived from this software ! 19: * without specific prior written permission. ! 20: * ! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 31: * SUCH DAMAGE. ! 32: */ ! 33: ! 34: #ifndef lint ! 35: char copyright[] = ! 36: "@(#) Copyright (c) 1988, 1991 The Regents of the University of California.\n\ ! 37: All rights reserved.\n"; ! 38: #endif /* not lint */ ! 39: ! 40: #ifndef lint ! 41: static char sccsid[] = "@(#)xi_sink.c 7.4 (Berkeley) 5/7/91"; ! 42: #endif /* not lint */ ! 43: ! 44: /* ! 45: * This is a test program to be a sink for X.25 connections. ! 46: */ ! 47: #include <sys/param.h> ! 48: #include <sys/uio.h> ! 49: #include <sys/socket.h> ! 50: #include <sys/ioctl.h> ! 51: #include <net/route.h> ! 52: #include <net/if.h> ! 53: #include <netccitt/x25.h> ! 54: ! 55: #include <stdio.h> ! 56: #include <errno.h> ! 57: #include <ctype.h> ! 58: #include <netdb.h> ! 59: ! 60: ! 61: #define dbprintf if(verbose)printf ! 62: #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\ ! 63: if(x<0) {perror("a"); myexit(0);}} ! 64: ! 65: ! 66: struct ifreq ifr; ! 67: short port = 3000; ! 68: struct sockaddr_x25 faddr, laddr = { sizeof(laddr), AF_CCITT }; ! 69: struct sockaddr_x25 *sx25 = &laddr; ! 70: char **xenvp; ! 71: ! 72: long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0; ! 73: long records, intercept = 0, isode_mode; ! 74: ! 75: char buf[2048]; ! 76: char your_it[] = "You're it!"; ! 77: ! 78: char *Servername; ! 79: ! 80: main(argc, argv, envp) ! 81: int argc; ! 82: char *argv[]; ! 83: char *envp[]; ! 84: { ! 85: register char **av = argv; ! 86: register char *cp; ! 87: ! 88: xenvp = envp; ! 89: while(--argc > 0) { ! 90: av++; ! 91: if (strcmp(*av,"host")==0) { ! 92: av++; ! 93: ccitt_addr(*av, sx25); ! 94: argc--; ! 95: } else if (strcmp(*av,"count")==0) { ! 96: av++; ! 97: sscanf(*av,"%ld",&count); ! 98: argc--; ! 99: } else if (strcmp(*av,"size")==0) { ! 100: av++; ! 101: sscanf(*av,"%ld",&size); ! 102: argc--; ! 103: } else if (strcmp(*av, "intercept")==0) { ! 104: intercept++; ! 105: } ! 106: } ! 107: tisink(); ! 108: } ! 109: #define BIG 2048 ! 110: #define MIDLIN 512 ! 111: char readbuf[BIG]; ! 112: struct iovec iov[1] = { ! 113: readbuf, ! 114: sizeof readbuf, ! 115: }; ! 116: char name[MIDLIN]; ! 117: union { ! 118: struct { ! 119: struct cmsghdr cmhdr; ! 120: char cmdata[128 - sizeof(struct cmsghdr)]; ! 121: } cm; ! 122: char data[128]; ! 123: } cbuf; ! 124: #define control cbuf.data ! 125: struct msghdr msghdr = { ! 126: name, sizeof(name), ! 127: iov, sizeof(iov)/sizeof(iov[1]), ! 128: control, sizeof control, ! 129: 0 /* flags */ ! 130: }; ! 131: ! 132: tisink() ! 133: { ! 134: int x, s, pid, on = 1, loop = 0, n; ! 135: extern int errno; ! 136: ! 137: try(socket, (AF_CCITT, SOCK_STREAM, 0),""); ! 138: ! 139: s = x; ! 140: ! 141: sx25->x25_opts.op_flags |= X25_MQBIT; ! 142: try(bind, (s, (struct sockaddr *) sx25, sx25->x25_len), ""); ! 143: ! 144: /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */ ! 145: ! 146: try(listen, (s, 5), ""); ! 147: for(;;) { ! 148: int child, ns; ! 149: int addrlen = sizeof(faddr); ! 150: char childname[50]; ! 151: ! 152: try (accept, (s, &faddr, &addrlen), ""); ! 153: ns = x; ! 154: dumpit("connection from:", &faddr, sizeof faddr); ! 155: if (mynamep || intercept) { ! 156: addrlen = sizeof(faddr); ! 157: try (getsockname, (ns, &faddr, &addrlen), ""); ! 158: dumpit("connected as:", &faddr, addrlen); ! 159: } ! 160: loop++; ! 161: if (loop > 3) myexit(0); ! 162: if (forkp) { ! 163: try(fork, (), ""); ! 164: } else ! 165: x = 0; ! 166: if (x == 0) { ! 167: long n, count = 0, cn, flags; ! 168: records = 0; ! 169: #ifdef ISODE_MODE ! 170: if (isode_mode) { ! 171: static char fdbuf[10]; ! 172: static char *nargv[4] = ! 173: {"/usr/sbin/isod.tsap", fdbuf, "", 0}; ! 174: sprintf(fdbuf, "Z%d", ns); ! 175: old_isod_main(3, nargv, xenvp); ! 176: } else ! 177: #endif ! 178: for (;;) { ! 179: msghdr.msg_iovlen = 1; ! 180: msghdr.msg_controllen = sizeof(control); ! 181: iov->iov_len = sizeof(readbuf); ! 182: n = recvmsg(ns, &msghdr, 0); ! 183: flags = msghdr.msg_flags; ! 184: count++; ! 185: dbprintf("recvmsg from child %d got %d ctl %d flags %x\n", ! 186: getpid(), n, (cn = msghdr.msg_controllen), ! 187: flags); ! 188: fflush(stdout); ! 189: if (cn && verbose) ! 190: dumpit("control data:\n", control, cn); ! 191: if (n < 0) { ! 192: fprintf(stderr, "errno is %d\n", errno); ! 193: perror("recvmsg"); ! 194: /*sleep (10);*/ ! 195: break; ! 196: } else { ! 197: if (verbose) ! 198: dumpit("data:\n", readbuf, n); ! 199: } ! 200: if (echop) { ! 201: n = answerback(flags, n, ns); ! 202: } ! 203: if (flags & MSG_EOR) ! 204: records++; ! 205: if (playtag && n == sizeof(your_it) && (flags & MSG_EOR) ! 206: && bcmp(readbuf, your_it, n) == 0) { ! 207: printf("Answering back!!!!\n"); ! 208: answerback(flags, n, ns); ! 209: answerback(flags, n, ns); ! 210: } ! 211: errno = 0; ! 212: } ! 213: } ! 214: myexit(0); ! 215: } ! 216: } ! 217: answerback(flags, n, ns) ! 218: { ! 219: msghdr.msg_controllen = 0; ! 220: msghdr.msg_iovlen = 1; ! 221: iov->iov_len = n; ! 222: n = sendmsg(ns, &msghdr, flags); ! 223: dbprintf("echoed %d\n", n); ! 224: return n; ! 225: } ! 226: ! 227: dumpit(what, where, n) ! 228: char *what; unsigned short *where; int n; ! 229: { ! 230: unsigned short *s = where; ! 231: unsigned short *z = where + (n+1)/2; ! 232: int count = 0; ! 233: printf(what); ! 234: while(s < z) { ! 235: count++; ! 236: printf("%x ",*s++); ! 237: if ((count & 15) == 0) ! 238: putchar('\n'); ! 239: } ! 240: if (count & 15) ! 241: putchar('\n'); ! 242: fflush(stdout); ! 243: } ! 244: myexit(n) ! 245: { ! 246: fflush(stderr); ! 247: printf("got %d records\n", records); ! 248: fflush(stdout); ! 249: exit(n); ! 250: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.