xref: /csrg-svn/sys/tests/netccitt/sink2.c (revision 49347)
1*49347Ssklower /*
2*49347Ssklower  * Copyright (c) 1988, 1990 Regents of the University of California.
3*49347Ssklower  * All rights reserved.
4*49347Ssklower  *
5*49347Ssklower  * Redistribution and use in source and binary forms are permitted provided
6*49347Ssklower  * that: (1) source distributions retain this entire copyright notice and
7*49347Ssklower  * comment, and (2) distributions including binaries display the following
8*49347Ssklower  * acknowledgement:  ``This product includes software developed by the
9*49347Ssklower  * University of California, Berkeley and its contributors'' in the
10*49347Ssklower  * documentation or other materials provided with the distribution and in
11*49347Ssklower  * all advertising materials mentioning features or use of this software.
12*49347Ssklower  * Neither the name of the University nor the names of its contributors may
13*49347Ssklower  * be used to endorse or promote products derived from this software without
14*49347Ssklower  * specific prior written permission.
15*49347Ssklower  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
16*49347Ssklower  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
17*49347Ssklower  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18*49347Ssklower  */
19*49347Ssklower #ifndef lint
20*49347Ssklower static char sccsid[] = "@(#)xi_sink.c	7.2 (Berkeley) 11/13/90";
21*49347Ssklower #endif /* not lint */
22*49347Ssklower 
23*49347Ssklower /*
24*49347Ssklower  * This is a test program to be a sink for TP4 connections.
25*49347Ssklower  */
26*49347Ssklower #include <sys/param.h>
27*49347Ssklower #include <sys/uio.h>
28*49347Ssklower #include <sys/socket.h>
29*49347Ssklower #include <sys/ioctl.h>
30*49347Ssklower #include <net/route.h>
31*49347Ssklower #include <net/if.h>
32*49347Ssklower #include <netccitt/x25.h>
33*49347Ssklower 
34*49347Ssklower #include <stdio.h>
35*49347Ssklower #include <errno.h>
36*49347Ssklower #include <ctype.h>
37*49347Ssklower #include <netdb.h>
38*49347Ssklower 
39*49347Ssklower 
40*49347Ssklower #define dbprintf if(verbose)printf
41*49347Ssklower #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\
42*49347Ssklower 		if(x<0) {perror("a"); myexit(0);}}
43*49347Ssklower 
44*49347Ssklower 
45*49347Ssklower struct  ifreq ifr;
46*49347Ssklower short port = 3000;
47*49347Ssklower struct  sockaddr_x25 faddr, laddr = { sizeof(laddr), AF_CCITT };
48*49347Ssklower struct  sockaddr_x25 *sx25 = &laddr;
49*49347Ssklower char **xenvp;
50*49347Ssklower 
51*49347Ssklower long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0;
52*49347Ssklower long records, intercept = 0, isode_mode;
53*49347Ssklower 
54*49347Ssklower char buf[2048];
55*49347Ssklower char your_it[] = "You're it!";
56*49347Ssklower 
57*49347Ssklower char *Servername;
58*49347Ssklower 
main(argc,argv,envp)59*49347Ssklower main(argc, argv, envp)
60*49347Ssklower int argc;
61*49347Ssklower char *argv[];
62*49347Ssklower char *envp[];
63*49347Ssklower {
64*49347Ssklower 	register char **av = argv;
65*49347Ssklower 	register char *cp;
66*49347Ssklower 
67*49347Ssklower 	xenvp = envp;
68*49347Ssklower 	while(--argc > 0) {
69*49347Ssklower 		av++;
70*49347Ssklower 		if (strcmp(*av,"host")==0) {
71*49347Ssklower 			av++;
72*49347Ssklower 			ccitt_addr(*av, sx25);
73*49347Ssklower 			argc--;
74*49347Ssklower 		} else if (strcmp(*av,"count")==0) {
75*49347Ssklower 			av++;
76*49347Ssklower 			sscanf(*av,"%ld",&count);
77*49347Ssklower 			argc--;
78*49347Ssklower 		} else if (strcmp(*av,"size")==0) {
79*49347Ssklower 			av++;
80*49347Ssklower 			sscanf(*av,"%ld",&size);
81*49347Ssklower 			argc--;
82*49347Ssklower 		} else if (strcmp(*av, "intercept")==0) {
83*49347Ssklower 			intercept++;
84*49347Ssklower 		}
85*49347Ssklower 	}
86*49347Ssklower 	tisink();
87*49347Ssklower }
88*49347Ssklower #define BIG 2048
89*49347Ssklower #define MIDLIN 512
90*49347Ssklower char readbuf[BIG];
91*49347Ssklower char x25info[1];
92*49347Ssklower struct iovec iov[2] = {
93*49347Ssklower 	x25info,
94*49347Ssklower 	sizeof x25info,
95*49347Ssklower 	readbuf,
96*49347Ssklower 	sizeof readbuf,
97*49347Ssklower };
98*49347Ssklower char name[MIDLIN];
99*49347Ssklower union {
100*49347Ssklower     struct {
101*49347Ssklower 	    struct cmsghdr	cmhdr;
102*49347Ssklower 	    char		cmdata[128 - sizeof(struct cmsghdr)];
103*49347Ssklower     } cm;
104*49347Ssklower     char data[128];
105*49347Ssklower } cbuf;
106*49347Ssklower #define control cbuf.data
107*49347Ssklower struct msghdr msghdr = {
108*49347Ssklower 	name, sizeof(name),
109*49347Ssklower 	iov, sizeof(iov)/sizeof(iov[1]),
110*49347Ssklower 	control, sizeof control,
111*49347Ssklower 	0 /* flags */
112*49347Ssklower };
113*49347Ssklower 
tisink()114*49347Ssklower tisink()
115*49347Ssklower {
116*49347Ssklower 	int x, s, pid, on = 1, loop = 0, n;
117*49347Ssklower 	extern int errno;
118*49347Ssklower 
119*49347Ssklower 	try(socket, (AF_CCITT, SOCK_STREAM, 0),"");
120*49347Ssklower 
121*49347Ssklower 	s = x;
122*49347Ssklower 
123*49347Ssklower 	sx25->x25_opts.op_flags |= X25_MQBIT;
124*49347Ssklower 	try(bind, (s, (struct sockaddr *) sx25, sx25->x25_len), "");
125*49347Ssklower 
126*49347Ssklower 	/*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */
127*49347Ssklower 
128*49347Ssklower 	try(listen, (s, 5), "");
129*49347Ssklower 	for(;;) {
130*49347Ssklower 		int child, ns;
131*49347Ssklower 		int addrlen = sizeof(faddr);
132*49347Ssklower 		char childname[50];
133*49347Ssklower 
134*49347Ssklower 		try (accept, (s, &faddr, &addrlen), "");
135*49347Ssklower 		ns = x;
136*49347Ssklower 		dumpit("connection from:", &faddr, sizeof faddr);
137*49347Ssklower 		if (mynamep || intercept) {
138*49347Ssklower 			addrlen = sizeof(faddr);
139*49347Ssklower 			try (getsockname, (ns, &faddr, &addrlen), "");
140*49347Ssklower 			dumpit("connected as:", &faddr, addrlen);
141*49347Ssklower 		}
142*49347Ssklower 		loop++;
143*49347Ssklower 		if (loop > 3) myexit(0);
144*49347Ssklower 		if (forkp) {
145*49347Ssklower 			try(fork, (), "");
146*49347Ssklower 		} else
147*49347Ssklower 			x = 0;
148*49347Ssklower 		if (x == 0)  {
149*49347Ssklower 		    long n, count = 0, cn, flags;
150*49347Ssklower 		    records = 0;
151*49347Ssklower #ifdef ISODE_MODE
152*49347Ssklower 		    if (isode_mode) {
153*49347Ssklower 			static char fdbuf[10];
154*49347Ssklower 			static char *nargv[4] =
155*49347Ssklower 			    {"/usr/sbin/isod.tsap", fdbuf, "", 0};
156*49347Ssklower 			sprintf(fdbuf, "Z%d", ns);
157*49347Ssklower 			old_isod_main(3, nargv, xenvp);
158*49347Ssklower 		    } else
159*49347Ssklower #endif
160*49347Ssklower 		    for (;;) {
161*49347Ssklower 			msghdr.msg_iovlen = 1;
162*49347Ssklower 			msghdr.msg_controllen = sizeof(control);
163*49347Ssklower 			iov[0].iov_len = sizeof(x25info);
164*49347Ssklower 			iov[1].iov_len = sizeof(readbuf);
165*49347Ssklower 			/* n = recvmsg(ns, &msghdr, 0); */
166*49347Ssklower 			n = readv(ns, iov, 2);
167*49347Ssklower 			flags = msghdr.msg_flags;
168*49347Ssklower 			count++;
169*49347Ssklower 			dbprintf("recvmsg from child %d got %d ctl %d x25info %x\n",
170*49347Ssklower 				    getpid(), n, (cn = msghdr.msg_controllen),
171*49347Ssklower 					x25info[0]);
172*49347Ssklower 			fflush(stdout);
173*49347Ssklower 			/* if (cn && verbose)
174*49347Ssklower 				dumpit("control data:\n", control, cn); */
175*49347Ssklower 			if (n < 0) {
176*49347Ssklower 				fprintf(stderr, "errno is %d\n", errno);
177*49347Ssklower 				perror("recvmsg");
178*49347Ssklower 				/*sleep (10);*/
179*49347Ssklower 				break;
180*49347Ssklower 			} else {
181*49347Ssklower 				if (verbose)
182*49347Ssklower 					dumpit("data:\n", readbuf, n - 1);
183*49347Ssklower 			}
184*49347Ssklower 			if (echop) {
185*49347Ssklower 				n = answerback(flags, n, ns);
186*49347Ssklower 			}
187*49347Ssklower 			if (flags & MSG_EOR)
188*49347Ssklower 				records++;
189*49347Ssklower 			if (playtag && n == sizeof(your_it) && (flags & MSG_EOR)
190*49347Ssklower 			    && bcmp(readbuf, your_it, n) == 0) {
191*49347Ssklower 				printf("Answering back!!!!\n");
192*49347Ssklower 				answerback(flags, n, ns);
193*49347Ssklower 				answerback(flags, n, ns);
194*49347Ssklower 			}
195*49347Ssklower 			errno = 0;
196*49347Ssklower 		    }
197*49347Ssklower 		}
198*49347Ssklower 		myexit(0);
199*49347Ssklower 	}
200*49347Ssklower }
answerback(flags,n,ns)201*49347Ssklower answerback(flags, n, ns)
202*49347Ssklower {
203*49347Ssklower 	msghdr.msg_controllen = 0;
204*49347Ssklower 	msghdr.msg_iovlen = 1;
205*49347Ssklower 	iov->iov_len = n;
206*49347Ssklower 	n = sendmsg(ns, &msghdr, flags);
207*49347Ssklower 	dbprintf("echoed %d\n", n);
208*49347Ssklower 	return n;
209*49347Ssklower }
210*49347Ssklower 
dumpit(what,where,n)211*49347Ssklower dumpit(what, where, n)
212*49347Ssklower char *what; unsigned short *where; int n;
213*49347Ssklower {
214*49347Ssklower 	unsigned short *s = where;
215*49347Ssklower 	unsigned short *z = where + (n+1)/2;
216*49347Ssklower 	int count = 0;
217*49347Ssklower 	printf(what);
218*49347Ssklower 	while(s < z) {
219*49347Ssklower 		count++;
220*49347Ssklower 		printf("%x ",*s++);
221*49347Ssklower 		if ((count & 15) == 0)
222*49347Ssklower 			putchar('\n');
223*49347Ssklower 	}
224*49347Ssklower 	if (count & 15)
225*49347Ssklower 		putchar('\n');
226*49347Ssklower 	fflush(stdout);
227*49347Ssklower }
myexit(n)228*49347Ssklower myexit(n)
229*49347Ssklower {
230*49347Ssklower 	fflush(stderr);
231*49347Ssklower 	printf("got %d records\n", records);
232*49347Ssklower 	fflush(stdout);
233*49347Ssklower 	exit(n);
234*49347Ssklower }
235