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