|
|
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.