xref: /csrg-svn/sys/tests/netccitt/xi_sink.c (revision 49350)
1*49350Ssklower /*-
245450Ssklower  * Copyright (c) 1988, 1990 Regents of the University of California.
345450Ssklower  * All rights reserved.
445450Ssklower  *
545450Ssklower  * %sccs.include.redist.c%
6*49350Ssklower  *
7*49350Ssklower  * @(#)xi_sink.c	7.3 (Berkeley) 05/07/91
845450Ssklower  */
945450Ssklower /*
10*49350Ssklower  * This is a test program to be a sink for X.25 connections.
1145450Ssklower  */
1245450Ssklower #include <sys/param.h>
1345450Ssklower #include <sys/uio.h>
1445450Ssklower #include <sys/socket.h>
1545450Ssklower #include <sys/ioctl.h>
1645450Ssklower #include <net/route.h>
1745450Ssklower #include <net/if.h>
1845450Ssklower #include <netccitt/x25.h>
1945450Ssklower 
2045450Ssklower #include <stdio.h>
2145450Ssklower #include <errno.h>
2245450Ssklower #include <ctype.h>
2345450Ssklower #include <netdb.h>
2445450Ssklower 
2545450Ssklower 
2645450Ssklower #define dbprintf if(verbose)printf
2745450Ssklower #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\
2845450Ssklower 		if(x<0) {perror("a"); myexit(0);}}
2945450Ssklower 
3045450Ssklower 
3145450Ssklower struct  ifreq ifr;
3245450Ssklower short port = 3000;
3345450Ssklower struct  sockaddr_x25 faddr, laddr = { sizeof(laddr), AF_CCITT };
3445450Ssklower struct  sockaddr_x25 *sx25 = &laddr;
3545450Ssklower char **xenvp;
3645450Ssklower 
3745450Ssklower long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0;
3845450Ssklower long records, intercept = 0, isode_mode;
3945450Ssklower 
4045450Ssklower char buf[2048];
4145450Ssklower char your_it[] = "You're it!";
4245450Ssklower 
4345450Ssklower char *Servername;
4445450Ssklower 
4545450Ssklower main(argc, argv, envp)
4645450Ssklower int argc;
4745450Ssklower char *argv[];
4845450Ssklower char *envp[];
4945450Ssklower {
5045450Ssklower 	register char **av = argv;
5145450Ssklower 	register char *cp;
5245450Ssklower 
5345450Ssklower 	xenvp = envp;
5445450Ssklower 	while(--argc > 0) {
5545450Ssklower 		av++;
5645450Ssklower 		if (strcmp(*av,"host")==0) {
5745450Ssklower 			av++;
5845450Ssklower 			ccitt_addr(*av, sx25);
5945450Ssklower 			argc--;
6045450Ssklower 		} else if (strcmp(*av,"count")==0) {
6145450Ssklower 			av++;
6245450Ssklower 			sscanf(*av,"%ld",&count);
6345450Ssklower 			argc--;
6445450Ssklower 		} else if (strcmp(*av,"size")==0) {
6545450Ssklower 			av++;
6645450Ssklower 			sscanf(*av,"%ld",&size);
6745450Ssklower 			argc--;
6845450Ssklower 		} else if (strcmp(*av, "intercept")==0) {
6945450Ssklower 			intercept++;
7045450Ssklower 		}
7145450Ssklower 	}
7245450Ssklower 	tisink();
7345450Ssklower }
7445450Ssklower #define BIG 2048
7545450Ssklower #define MIDLIN 512
7645450Ssklower char readbuf[BIG];
7745450Ssklower struct iovec iov[1] = {
7845450Ssklower 	readbuf,
7945450Ssklower 	sizeof readbuf,
8045450Ssklower };
8145450Ssklower char name[MIDLIN];
8245450Ssklower union {
8345450Ssklower     struct {
8445450Ssklower 	    struct cmsghdr	cmhdr;
8545450Ssklower 	    char		cmdata[128 - sizeof(struct cmsghdr)];
8645450Ssklower     } cm;
8745450Ssklower     char data[128];
8845450Ssklower } cbuf;
8945450Ssklower #define control cbuf.data
9045450Ssklower struct msghdr msghdr = {
9145450Ssklower 	name, sizeof(name),
9245450Ssklower 	iov, sizeof(iov)/sizeof(iov[1]),
9345450Ssklower 	control, sizeof control,
9445450Ssklower 	0 /* flags */
9545450Ssklower };
9645450Ssklower 
9745450Ssklower tisink()
9845450Ssklower {
9945450Ssklower 	int x, s, pid, on = 1, loop = 0, n;
10045450Ssklower 	extern int errno;
10145450Ssklower 
10245572Ssklower 	try(socket, (AF_CCITT, SOCK_STREAM, 0),"");
10345450Ssklower 
10445450Ssklower 	s = x;
10545450Ssklower 
10645450Ssklower 	sx25->x25_opts.op_flags |= X25_MQBIT;
10745450Ssklower 	try(bind, (s, (struct sockaddr *) sx25, sx25->x25_len), "");
10845450Ssklower 
10945450Ssklower 	/*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */
11045450Ssklower 
11145450Ssklower 	try(listen, (s, 5), "");
11245450Ssklower 	for(;;) {
11345450Ssklower 		int child, ns;
11445450Ssklower 		int addrlen = sizeof(faddr);
11545450Ssklower 		char childname[50];
11645450Ssklower 
11745450Ssklower 		try (accept, (s, &faddr, &addrlen), "");
11845450Ssklower 		ns = x;
11945450Ssklower 		dumpit("connection from:", &faddr, sizeof faddr);
12045450Ssklower 		if (mynamep || intercept) {
12145450Ssklower 			addrlen = sizeof(faddr);
12245450Ssklower 			try (getsockname, (ns, &faddr, &addrlen), "");
12345450Ssklower 			dumpit("connected as:", &faddr, addrlen);
12445450Ssklower 		}
12545450Ssklower 		loop++;
12645450Ssklower 		if (loop > 3) myexit(0);
12745450Ssklower 		if (forkp) {
12845450Ssklower 			try(fork, (), "");
12945450Ssklower 		} else
13045450Ssklower 			x = 0;
13145450Ssklower 		if (x == 0)  {
13245450Ssklower 		    long n, count = 0, cn, flags;
13345450Ssklower 		    records = 0;
13445450Ssklower #ifdef ISODE_MODE
13545450Ssklower 		    if (isode_mode) {
13645450Ssklower 			static char fdbuf[10];
13745450Ssklower 			static char *nargv[4] =
13845450Ssklower 			    {"/usr/sbin/isod.tsap", fdbuf, "", 0};
13945450Ssklower 			sprintf(fdbuf, "Z%d", ns);
14045450Ssklower 			old_isod_main(3, nargv, xenvp);
14145450Ssklower 		    } else
14245450Ssklower #endif
14345450Ssklower 		    for (;;) {
14445450Ssklower 			msghdr.msg_iovlen = 1;
14545450Ssklower 			msghdr.msg_controllen = sizeof(control);
14645450Ssklower 			iov->iov_len = sizeof(readbuf);
14745450Ssklower 			n = recvmsg(ns, &msghdr, 0);
14845450Ssklower 			flags = msghdr.msg_flags;
14945450Ssklower 			count++;
15045450Ssklower 			dbprintf("recvmsg from child %d got %d ctl %d flags %x\n",
15145450Ssklower 				    getpid(), n, (cn = msghdr.msg_controllen),
15245450Ssklower 					flags);
15345450Ssklower 			fflush(stdout);
15445450Ssklower 			if (cn && verbose)
15545450Ssklower 				dumpit("control data:\n", control, cn);
15645450Ssklower 			if (n < 0) {
15745450Ssklower 				fprintf(stderr, "errno is %d\n", errno);
15845450Ssklower 				perror("recvmsg");
15945450Ssklower 				/*sleep (10);*/
16045450Ssklower 				break;
16145450Ssklower 			} else {
16245450Ssklower 				if (verbose)
16345450Ssklower 					dumpit("data:\n", readbuf, n);
16445450Ssklower 			}
16545450Ssklower 			if (echop) {
16645450Ssklower 				n = answerback(flags, n, ns);
16745450Ssklower 			}
16845450Ssklower 			if (flags & MSG_EOR)
16945450Ssklower 				records++;
17045450Ssklower 			if (playtag && n == sizeof(your_it) && (flags & MSG_EOR)
17145450Ssklower 			    && bcmp(readbuf, your_it, n) == 0) {
17245450Ssklower 				printf("Answering back!!!!\n");
17345450Ssklower 				answerback(flags, n, ns);
17445450Ssklower 				answerback(flags, n, ns);
17545450Ssklower 			}
17645450Ssklower 			errno = 0;
17745450Ssklower 		    }
17845450Ssklower 		}
17945450Ssklower 		myexit(0);
18045450Ssklower 	}
18145450Ssklower }
18245450Ssklower answerback(flags, n, ns)
18345450Ssklower {
18445450Ssklower 	msghdr.msg_controllen = 0;
18545450Ssklower 	msghdr.msg_iovlen = 1;
18645450Ssklower 	iov->iov_len = n;
18745450Ssklower 	n = sendmsg(ns, &msghdr, flags);
18845450Ssklower 	dbprintf("echoed %d\n", n);
18945450Ssklower 	return n;
19045450Ssklower }
19145450Ssklower 
19245450Ssklower dumpit(what, where, n)
19345450Ssklower char *what; unsigned short *where; int n;
19445450Ssklower {
19545450Ssklower 	unsigned short *s = where;
19645450Ssklower 	unsigned short *z = where + (n+1)/2;
19745450Ssklower 	int count = 0;
19845450Ssklower 	printf(what);
19945450Ssklower 	while(s < z) {
20045450Ssklower 		count++;
20145450Ssklower 		printf("%x ",*s++);
20245450Ssklower 		if ((count & 15) == 0)
20345450Ssklower 			putchar('\n');
20445450Ssklower 	}
20545450Ssklower 	if (count & 15)
20645450Ssklower 		putchar('\n');
20745450Ssklower 	fflush(stdout);
20845450Ssklower }
20945450Ssklower myexit(n)
21045450Ssklower {
21145450Ssklower 	fflush(stderr);
21245450Ssklower 	printf("got %d records\n", records);
21345450Ssklower 	fflush(stdout);
21445450Ssklower 	exit(n);
21545450Ssklower }
216