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