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