|
|
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 source for ISO packets. ! 13: */ ! 14: #include <sys/types.h> ! 15: #include <sys/socket.h> ! 16: #include <sys/uio.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_user.h> ! 23: ! 24: #include <stdio.h> ! 25: #include <errno.h> ! 26: #include <ctype.h> ! 27: #include <netdb.h> ! 28: ! 29: ! 30: #define dbprintf if(verbose)printf ! 31: #define try(a,b,c) {x = (a b);dbprintf("%s%s returns %d\n",c,"a",x);\ ! 32: if (x < 0) {perror("a"); exit(1);}} ! 33: ! 34: struct iso_addr eon = {20, 0x47, 0, 6, 3, 0, 0, 0, 25 /*EGP for Berkeley*/}; ! 35: struct sockaddr_iso to_s = { sizeof(to_s), AF_ISO }, *to = &to_s; ! 36: struct sockaddr_iso old_s = { sizeof(to_s), AF_ISO }, *old = &old_s; ! 37: fd_set readfds, writefds, exceptfds; ! 38: long size, count = 10; ! 39: int verbose = 1, selectp, type = SOCK_SEQPACKET, nobuffs, errno, playtag = 0; ! 40: int verify = 0, dgramp = 1, debug = 0; ! 41: short portnumber = 3000; ! 42: char your_it[] = "You're it!"; ! 43: char *Servername, *conndata, data_msg[2048]; ! 44: char Serverbuf[128]; ! 45: char name[128]; ! 46: struct iovec iov[1] = {data_msg}; ! 47: union { ! 48: struct { ! 49: struct cmsghdr cmhdr; ! 50: char cmdata[128 - sizeof(struct cmsghdr)]; ! 51: } cm; ! 52: char data[128]; ! 53: } cm; ! 54: struct msghdr msg = { 0, 0, iov, 1, 0, 0, 0}; ! 55: ! 56: main(argc, argv) ! 57: int argc; ! 58: char *argv[]; ! 59: { ! 60: register char **av = argv; ! 61: register char *cp; ! 62: struct iso_addr iso_addr(); ! 63: u_long len; ! 64: int handy; ! 65: ! 66: while(--argc > 0) { ! 67: av++; ! 68: if(strcmp(*av,"Servername")==0) { ! 69: av++; ! 70: Servername = *av; ! 71: argc--; ! 72: } else if(strcmp(*av,"conndata")==0) { ! 73: av++; ! 74: conndata = *av; ! 75: argc--; ! 76: } else if(strcmp(*av,"host")==0) { ! 77: av++; ! 78: to_s.siso_addr = iso_addr(*av); ! 79: argc--; ! 80: } else if(strcmp(*av,"port")==0) { ! 81: av++; ! 82: sscanf(*av,"%hd",&portnumber); ! 83: argc--; ! 84: } else if(strcmp(*av,"count")==0) { ! 85: av++; ! 86: sscanf(*av,"%ld",&count); ! 87: argc--; ! 88: } else if(strcmp(*av,"size")==0) { ! 89: av++; ! 90: sscanf(*av,"%ld",&size); ! 91: iov->iov_len = size; ! 92: } else if (strcmp(*av,"eon") == 0) { ! 93: unsigned long l, inet_addr(); ! 94: ! 95: l = inet_addr(*++av); argc--; ! 96: to_s.siso_addr = eon; ! 97: bcopy((char *)&l, &to_s.siso_data[15], 4); ! 98: } ! 99: } ! 100: maketoaddr(); ! 101: tisrc(); ! 102: } ! 103: ! 104: maketoaddr() ! 105: { ! 106: if (Servername) { ! 107: int tlen = strlen(Servername); ! 108: int len = tlen + TSEL(to) - (caddr_t) to; ! 109: if (len < sizeof(*to)) len = sizeof(*to); ! 110: if (len > to->siso_len) { ! 111: if (old != &old_s) free(old); ! 112: old = (struct sockaddr_iso *)malloc(len); ! 113: *old = *to; /* We dont care if all old tsel is copied*/ ! 114: old->siso_len = len; ! 115: if (to != &to_s) free(to); ! 116: to = (struct sockaddr_iso *)malloc(len); ! 117: } ! 118: bcopy(Servername, TSEL(old), tlen); ! 119: } else { ! 120: old->siso_tlen = sizeof(portnumber); ! 121: portnumber = htons(portnumber); ! 122: bcopy((char *)&portnumber, TSEL(old), sizeof(portnumber)); ! 123: } ! 124: bcopy(old, to, old->siso_len); ! 125: } ! 126: ! 127: ! 128: tisrc() { ! 129: int x, s, pid, on = 1, flags = 8, n; ! 130: ! 131: if (dgramp) type = SOCK_DGRAM; ! 132: try(socket, (AF_ISO, type, 0),""); ! 133: s = x; ! 134: ! 135: if (debug) ! 136: try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof on), ""); ! 137: if (dgramp == 0) { ! 138: if (conndata) ! 139: doconndata(s); ! 140: try(connect, (s, (struct sockaddr *) to, to->siso_len), ""); ! 141: } ! 142: if (selectp) { ! 143: FD_ZERO(&writefds); FD_SET(s, &writefds); ! 144: select(1, &writefds, 0, 0, 0); ! 145: } ! 146: while (count-- > 0) { ! 147: if (size <= 0 && get_record(&flags) == EOF) ! 148: exit(0); ! 149: n = put_record(s, flags); ! 150: if (n < iov->iov_len) { ! 151: if (n==-1 && errno == 55) { ! 152: nobuffs++; ! 153: count++; ! 154: continue; ! 155: } ! 156: fprintf(stderr, "wrote %d < %d, count %d,", ! 157: n, iov->iov_len, count); ! 158: perror("due to"); ! 159: } ! 160: } ! 161: if (playtag) { ! 162: printf("Tag time!\n"); ! 163: iov->iov_base = your_it; ! 164: iov->iov_len = sizeof your_it; ! 165: sendmsg(s, &msg, MSG_EOR); ! 166: sendmsg(s, &msg, MSG_EOR); ! 167: iov->iov_base = data_msg; ! 168: iov->iov_len = sizeof data_msg; ! 169: try(recvmsg, (s, &msg, flags), " playtag "); ! 170: } ! 171: if(nobuffs) { ! 172: printf("looped %d times waiting for bufs\n", nobuffs); ! 173: } ! 174: } ! 175: int localsize; ! 176: char dupbuf[4096]; ! 177: ! 178: put_record(s, flags) ! 179: int s, flags; ! 180: { ! 181: int fd, buflen; ! 182: char *buf; ! 183: int x, saved_x; ! 184: ! 185: msg.msg_flags = flags; ! 186: if (verbose) { ! 187: if (msg.msg_controllen) { ! 188: printf("(CMessage Type is %x) ", cm.cm.cmhdr.cmsg_type); ! 189: dumpit("CMsg data:\n", &msg.msg_control, msg.msg_controllen); ! 190: } ! 191: if (iov->iov_len) { ! 192: printf("sending: %s %s", ! 193: (flags & MSG_OOB ? "(OOB Data)" : ""), ! 194: (flags & MSG_EOR ? "(Record Mark)" : "")); ! 195: dumpit("data: ", data_msg, localsize); ! 196: } ! 197: } ! 198: if (verify) { ! 199: buflen = iov->iov_len; ! 200: bcopy(iov->iov_base, dupbuf, buflen); ! 201: } ! 202: if (dgramp) { ! 203: msg.msg_name = (caddr_t)to; ! 204: msg.msg_namelen = to->siso_len; ! 205: } ! 206: try(sendmsg, (s, &msg, flags), " put_record "); ! 207: saved_x = x; ! 208: while (verify && buflen > 0) { ! 209: iov->iov_len = buflen; ! 210: iov->iov_base = dupbuf; ! 211: try(recvmsg, (s, &msg, flags), " put_record "); ! 212: if (dgramp) { ! 213: if (msg.msg_namelen) ! 214: dumpit("from: ", to, msg.msg_namelen); ! 215: msg.msg_namelen = old->siso_len; ! 216: } ! 217: printf("verify got %d\n", x); ! 218: buflen -= x; ! 219: } ! 220: bcopy(old, to, old->siso_len); ! 221: msg.msg_control = 0; ! 222: return (saved_x); ! 223: } ! 224: dumpit(what, where, n) ! 225: char *what; unsigned short *where; int n; ! 226: { ! 227: unsigned short *s = where; ! 228: unsigned short *z = where + (n+1)/2; ! 229: int count = 0; ! 230: if (verbose == 0) ! 231: return; ! 232: printf(what); ! 233: while(s < z) { ! 234: count++; ! 235: printf("%x ",*s++); ! 236: if ((count & 15) == 0) ! 237: putchar('\n'); ! 238: } ! 239: if (count & 15) ! 240: putchar('\n'); ! 241: fflush(stdout); ! 242: } ! 243: int *datasize = &iov->iov_len; ! 244: char *cp, *cplim; ! 245: ! 246: get_control_data(type) ! 247: { ! 248: ! 249: datasize = &msg.msg_controllen; ! 250: cp = cm.cm.cmdata; ! 251: cplim = cp + sizeof(cm.cm.cmdata); ! 252: cm.cm.cmhdr.cmsg_level = SOL_TRANSPORT; ! 253: cm.cm.cmhdr.cmsg_type = type; ! 254: msg.msg_control = cm.data; ! 255: } ! 256: ! 257: doconndata(s) ! 258: { ! 259: get_control_data(TPOPT_CONN_DATA); ! 260: *datasize = strlen(conndata) + sizeof(cm.cm.cmhdr); ! 261: cm.cm.cmhdr.cmsg_len = *datasize; ! 262: bcopy(conndata, cp, *datasize); ! 263: put_record(s, 0); ! 264: } ! 265: ! 266: get_altbuf(addrbuf) ! 267: char *addrbuf; ! 268: { ! 269: if (dgramp == 0) { ! 270: printf("illegal option for stream\n"); ! 271: return 1; ! 272: } ! 273: return (scanf("%s", addrbuf) == EOF ? 1 : 0); ! 274: } ! 275: ! 276: get_record(flags) ! 277: int *flags; ! 278: { ! 279: int factor = 1, x = 0, newaddr = 0; ! 280: char workbuf[10240]; ! 281: char addrbuf[128]; ! 282: ! 283: *flags = 0; ! 284: *datasize = 0; ! 285: datasize = &iov->iov_len; ! 286: cp = data_msg; ! 287: cplim = cp + sizeof(data_msg); ! 288: ! 289: for(;;) { ! 290: x = scanf("%s", workbuf); ! 291: if (x == EOF) ! 292: break; ! 293: if (strcmp(workbuf, "disc") == 0) ! 294: x = get_control_data(TPOPT_DISC_DATA); ! 295: else if (strcmp(workbuf, "cfrm") == 0) ! 296: x = get_control_data(TPOPT_CFRM_DATA); ! 297: else if (strcmp(workbuf, "oob") == 0) ! 298: *flags |= MSG_OOB; ! 299: else if (strcmp(workbuf, "eom") == 0) ! 300: *flags |= MSG_EOR; ! 301: else if (strcmp(workbuf, "host") == 0) { ! 302: if (get_altbuf(addrbuf)) ! 303: break; ! 304: to->siso_addr = iso_addr(addrbuf); ! 305: newaddr = 1; ! 306: } else if (strcmp(workbuf, "Servername") == 0) { ! 307: if (get_altbuf(Serverbuf)) ! 308: break; ! 309: Servername = Serverbuf; ! 310: newaddr = 1; ! 311: } else if (strcmp(workbuf, "port") == 0) { ! 312: x = scanf("%hd", &portnumber); ! 313: if (x == EOF) ! 314: break; ! 315: Servername = 0; ! 316: newaddr = 1; ! 317: } else if (strcmp(workbuf, "factor") == 0) { ! 318: x = scanf("%d", &factor); ! 319: if (factor <= 0) factor = 1; ! 320: if (x == EOF) ! 321: break; ! 322: } else { ! 323: int len = strlen(workbuf); ! 324: localsize = 0; ! 325: while ((factor-- > 0) && ! 326: ((cp + len) < cplim)) { ! 327: strcpy(cp, workbuf); ! 328: cp += len; ! 329: localsize += len; ! 330: } ! 331: *datasize = localsize; ! 332: if (datasize != &iov->iov_len) { ! 333: *datasize += sizeof(cm.cm.cmhdr); ! 334: cm.cm.cmhdr.cmsg_len = *datasize; ! 335: } ! 336: break; ! 337: } ! 338: } ! 339: errno = 0; ! 340: if (newaddr) ! 341: maketoaddr(); ! 342: return (x); ! 343: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.