|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1989, 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[] = "%W% (Berkeley) %G%"; ! 9: #endif /* not lint */ ! 10: ! 11: /* ! 12: * This is a test program to be a sink for ISO packets. ! 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: ! 41: long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0; ! 42: long records, dgramp = 1; ! 43: ! 44: char buf[2048]; ! 45: char your_it[] = "You're it!"; ! 46: ! 47: char *Servername; ! 48: ! 49: main(argc, argv) ! 50: int argc; ! 51: char *argv[]; ! 52: { ! 53: register char **av = argv; ! 54: register char *cp; ! 55: struct iso_addr iso_addr(); ! 56: ! 57: while(--argc > 0) { ! 58: av++; ! 59: if(strcmp(*av,"Servername")==0) { ! 60: av++; ! 61: Servername = *av; ! 62: argc--; ! 63: } else if (strcmp(*av,"host")==0) { ! 64: av++; ! 65: laddr.siso_addr = iso_addr(*av); ! 66: argc--; ! 67: } else if (strcmp(*av,"count")==0) { ! 68: av++; ! 69: sscanf(*av,"%ld",&count); ! 70: argc--; ! 71: } else if (strcmp(*av,"port")==0) { ! 72: av++; ! 73: sscanf(*av,"%hd",&port); ! 74: argc--; ! 75: } else if (strcmp(*av,"size")==0) { ! 76: av++; ! 77: sscanf(*av,"%ld",&size); ! 78: argc--; ! 79: } ! 80: } ! 81: if (Servername) { ! 82: int tlen = laddr.siso_tlen = strlen(Servername); ! 83: int len = TSEL(siso) + tlen - (caddr_t) &siso; ! 84: if (len > sizeof(*siso)) { ! 85: siso = (struct sockaddr_iso *)malloc(len); ! 86: *siso = laddr; ! 87: siso->siso_len = len; ! 88: } ! 89: bcopy(Servername, TSEL(siso), tlen); ! 90: } else { ! 91: port = htons(port); ! 92: laddr.siso_tlen = sizeof(port); ! 93: bcopy((char *)&port, TSEL(siso), sizeof(port)); ! 94: } ! 95: tisink(); ! 96: } ! 97: #define BIG 2048 ! 98: #define MIDLIN 512 ! 99: char readbuf[BIG]; ! 100: struct iovec iov[1] = { ! 101: readbuf, ! 102: sizeof readbuf, ! 103: }; ! 104: char name[MIDLIN]; ! 105: union { ! 106: struct { ! 107: struct cmsghdr cmhdr; ! 108: char cmdata[128 - sizeof(struct cmsghdr)]; ! 109: } cm; ! 110: char data[128]; ! 111: } cbuf; ! 112: #define control cbuf.data ! 113: struct msghdr msghdr = { ! 114: name, sizeof(name), ! 115: iov, sizeof(iov)/sizeof(iov[1]), ! 116: control, sizeof control, ! 117: 0 /* flags */ ! 118: }; ! 119: ! 120: tisink() ! 121: { ! 122: int x, s, pid, on = 1, loop = 0, n, ns; ! 123: extern int errno; ! 124: int socktype = (dgramp ? SOCK_DGRAM : SOCK_SEQPACKET); ! 125: int addrlen = sizeof(faddr); ! 126: ! 127: try(socket, (AF_ISO, socktype, 0),""); ! 128: ! 129: s = x; ! 130: ! 131: try(bind, (s, (struct sockaddr *) siso, siso->siso_len), ""); ! 132: ! 133: /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */ ! 134: if (dgramp) { ! 135: ns = s; ! 136: pid = getpid(); ! 137: goto dgram1; ! 138: } ! 139: ! 140: try(listen, (s, 5), ""); ! 141: for(;;) { ! 142: int child; ! 143: char childname[50]; ! 144: ! 145: try (accept, (s, &faddr, &addrlen), ""); ! 146: ns = x; ! 147: dumpit("connection from:", &faddr, sizeof faddr); ! 148: if (mynamep) { ! 149: addrlen = sizeof(faddr); ! 150: try (getsockname, (ns, &faddr, &addrlen), ""); ! 151: dumpit("connected as:", &faddr, addrlen); ! 152: } ! 153: loop++; ! 154: if(loop > 3) myexit(0); ! 155: if (forkp) { ! 156: try(fork, (), ""); ! 157: } else ! 158: x = 0; ! 159: pid = getpid(); ! 160: if (x == 0) { ! 161: long n, count = 0, cn, flags; ! 162: records = 0; ! 163: if (confp) { ! 164: msghdr.msg_iovlen = 0; ! 165: msghdr.msg_namelen = 0; ! 166: msghdr.msg_controllen = ! 167: cbuf.cm.cmhdr.cmsg_len = sizeof (cbuf.cm.cmhdr); ! 168: cbuf.cm.cmhdr.cmsg_level = SOL_TRANSPORT; ! 169: cbuf.cm.cmhdr.cmsg_type = TPOPT_CFRM_DATA; ! 170: n = sendmsg(ns, &msghdr, 0); ! 171: if (n <= 0) { ! 172: printf("confirm: errno is %d\n", errno); ! 173: fflush(stdout); ! 174: perror("Confirm error"); ! 175: } else { ! 176: dbprintf("confim ok\n"); ! 177: } ! 178: sleep(10); ! 179: } ! 180: for (;;) { ! 181: dgram1: ! 182: msghdr.msg_iovlen = 1; ! 183: msghdr.msg_controllen = sizeof(control); ! 184: msghdr.msg_namelen = (dgramp ? (sizeof name) : 0); ! 185: iov->iov_len = sizeof(readbuf); ! 186: n = recvmsg(ns, &msghdr, 0); ! 187: flags = msghdr.msg_flags; ! 188: count++; ! 189: dbprintf("recvmsg from pid %d got %d ctl %d flags %x\n", ! 190: pid, n, (cn = msghdr.msg_controllen), flags); ! 191: fflush(stdout); ! 192: if (dgramp && msghdr.msg_namelen && verbose) ! 193: dumpit("from:\n", name, msghdr.msg_namelen); ! 194: if (cn && verbose) ! 195: dumpit("control data:\n", control, cn); ! 196: if (n <= 0) { ! 197: fprintf(stderr, "errno is %d\n", errno); ! 198: perror("recvmsg"); ! 199: /*sleep (10);*/ ! 200: break; ! 201: } else { ! 202: if (verbose) ! 203: dumpit("data:\n", readbuf, n); ! 204: } ! 205: if (echop) { ! 206: n = answerback(flags, n, ns); ! 207: } ! 208: if (flags & MSG_EOR) ! 209: records++; ! 210: if (playtag && n == sizeof(your_it) && (flags & MSG_EOR) ! 211: && bcmp(readbuf, your_it, n) == 0) { ! 212: printf("Answering back!!!!\n"); ! 213: answerback(flags, n, ns); ! 214: answerback(flags, n, ns); ! 215: } ! 216: errno = 0; ! 217: } ! 218: } ! 219: myexit(0); ! 220: } ! 221: } ! 222: answerback(flags, n, ns) ! 223: { ! 224: msghdr.msg_controllen = 0; ! 225: msghdr.msg_iovlen = 1; ! 226: iov->iov_len = n; ! 227: n = sendmsg(ns, &msghdr, flags); ! 228: dbprintf("echoed %d\n", n); ! 229: return n; ! 230: } ! 231: ! 232: dumpit(what, where, n) ! 233: char *what; unsigned short *where; int n; ! 234: { ! 235: unsigned short *s = where; ! 236: unsigned short *z = where + (n+1)/2; ! 237: int count = 0; ! 238: printf(what); ! 239: while(s < z) { ! 240: count++; ! 241: printf("%x ",*s++); ! 242: if ((count & 15) == 0) ! 243: putchar('\n'); ! 244: } ! 245: if (count & 15) ! 246: putchar('\n'); ! 247: fflush(stdout); ! 248: } ! 249: myexit(n) ! 250: { ! 251: fflush(stderr); ! 252: printf("got %d records\n", records); ! 253: fflush(stdout); ! 254: exit(n); ! 255: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.