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