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