xref: /csrg-svn/sys/tests/netccitt/xi_src.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_src.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 source for TP4 connections.
13*45450Ssklower  */
14*45450Ssklower #include <sys/types.h>
15*45450Ssklower #include <sys/socket.h>
16*45450Ssklower #include <sys/uio.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"); exit(1);}}
31*45450Ssklower 
32*45450Ssklower fd_set	readfds, writefds, exceptfds;
33*45450Ssklower long size, count = 10;
34*45450Ssklower int verbose = 1, selectp, type = SOCK_STREAM, nobuffs, errno, playtag = 0;
35*45450Ssklower int verify = 0, mqdata;
36*45450Ssklower short portnumber = 3000;
37*45450Ssklower struct sockaddr_x25 to;
38*45450Ssklower char your_it[] = "You're it!";
39*45450Ssklower char *port, *conndata, data_msg[2048];
40*45450Ssklower struct iovec iov[1] = {data_msg};
41*45450Ssklower union {
42*45450Ssklower     struct {
43*45450Ssklower 	    struct cmsghdr	cmhdr;
44*45450Ssklower 	    char		cmdata[128 - sizeof (struct cmsghdr)];
45*45450Ssklower     } cm;
46*45450Ssklower     char data[128];
47*45450Ssklower } cm;
48*45450Ssklower struct msghdr msg = { 0, 0, iov, 1, 0, 0, 0};
49*45450Ssklower 
50*45450Ssklower main(argc, argv)
51*45450Ssklower int argc;
52*45450Ssklower char *argv[];
53*45450Ssklower {
54*45450Ssklower 	register char **av = argv;
55*45450Ssklower 	register char *cp;
56*45450Ssklower 	u_long len;
57*45450Ssklower 	int handy;
58*45450Ssklower 
59*45450Ssklower 	while(--argc > 0) {
60*45450Ssklower 		av++;
61*45450Ssklower 		if (strcmp(*av,"dest")==0) {
62*45450Ssklower 			av++;
63*45450Ssklower 			ccitt_addr(*av, &to);
64*45450Ssklower 			argc--;
65*45450Ssklower 		} else if (strcmp(*av,"count")==0) {
66*45450Ssklower 			av++;
67*45450Ssklower 			sscanf(*av,"%ld",&count);
68*45450Ssklower 			argc--;
69*45450Ssklower 		} else if (strcmp(*av,"size")==0) {
70*45450Ssklower 			av++;
71*45450Ssklower 			sscanf(*av,"%ld",&size);
72*45450Ssklower 		}
73*45450Ssklower 	}
74*45450Ssklower 	tisrc();
75*45450Ssklower }
76*45450Ssklower 
77*45450Ssklower tisrc() {
78*45450Ssklower 	int x, s, pid, on = 1, flags = 8, n;
79*45450Ssklower 
80*45450Ssklower 	try(socket, (AF_CCITT, type, 0),"");
81*45450Ssklower 	s = x;
82*45450Ssklower 
83*45450Ssklower 	/*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), "");*/
84*45450Ssklower 
85*45450Ssklower 	to.x25_opts.op_flags |= X25_MQBIT;
86*45450Ssklower 	try(connect, (s, (struct sockaddr *) &to, to.x25_len), "");
87*45450Ssklower 
88*45450Ssklower 	if (selectp) {
89*45450Ssklower 		FD_ZERO(&writefds); FD_SET(s, &writefds);
90*45450Ssklower 		select(1, &writefds, 0, 0, 0);
91*45450Ssklower 	}
92*45450Ssklower 	while (count-- > 0) {
93*45450Ssklower 		if (size <= 0 && get_record(&flags) == EOF)
94*45450Ssklower 			exit(0);
95*45450Ssklower 		n = put_record(s, flags);
96*45450Ssklower 		if (n < iov->iov_len) {
97*45450Ssklower 			if (n==-1 && errno == 55) {
98*45450Ssklower 				nobuffs++;
99*45450Ssklower 				count++;
100*45450Ssklower 				continue;
101*45450Ssklower 			}
102*45450Ssklower 			fprintf(stderr, "wrote %d < %d, count %d,",
103*45450Ssklower 						n, iov->iov_len, count);
104*45450Ssklower 			perror("due to");
105*45450Ssklower 		}
106*45450Ssklower 	}
107*45450Ssklower 	if (playtag) {
108*45450Ssklower 		printf("Tag time!\n");
109*45450Ssklower 		iov->iov_base = your_it;
110*45450Ssklower 		iov->iov_len = sizeof your_it;
111*45450Ssklower 		sendmsg(s, &msg, MSG_EOR);
112*45450Ssklower 		sendmsg(s, &msg, MSG_EOR);
113*45450Ssklower 		iov->iov_base = data_msg;
114*45450Ssklower 		iov->iov_len = sizeof data_msg;
115*45450Ssklower 		try(recvmsg, (s, &msg, flags), " playtag ");
116*45450Ssklower 	}
117*45450Ssklower 	if (nobuffs) {
118*45450Ssklower 		printf("looped %d times waiting for bufs\n", nobuffs);
119*45450Ssklower 	}
120*45450Ssklower }
121*45450Ssklower int localsize;
122*45450Ssklower char dupbuf[4096];
123*45450Ssklower 
124*45450Ssklower put_record(s, flags)
125*45450Ssklower int s, flags;
126*45450Ssklower {
127*45450Ssklower 	int fd, buflen;
128*45450Ssklower 	char *buf;
129*45450Ssklower 	int x, saved_x;
130*45450Ssklower 
131*45450Ssklower 	msg.msg_flags = flags;
132*45450Ssklower 	if (verbose) {
133*45450Ssklower 		unsigned short *zp, *zlim;
134*45450Ssklower 		if (msg.msg_controllen) {
135*45450Ssklower 			zp = (unsigned short *)&(cm.cm.cmhdr.cmsg_len);
136*45450Ssklower 			printf("(CMessage Type is %x) ", cm.cm.cmhdr.cmsg_type);
137*45450Ssklower 			printf("CMsg data: ");
138*45450Ssklower 			x = msg.msg_controllen;
139*45450Ssklower 			zlim = zp + ((x + 1) / 2);
140*45450Ssklower 			while (zp < zlim) printf("%x ", *zp++);
141*45450Ssklower 			putchar ('\n');
142*45450Ssklower 		}
143*45450Ssklower 		if (iov->iov_len) {
144*45450Ssklower 			printf("sending: %s %s",
145*45450Ssklower 			(flags & MSG_OOB ? "(OOB Data)" : ""),
146*45450Ssklower 				(flags & MSG_EOR ? "(Record Mark)" : ""));
147*45450Ssklower 			x = localsize;
148*45450Ssklower 			zp = (unsigned short *)data_msg;
149*45450Ssklower 			zlim = zp + ((x + 1) / 2);
150*45450Ssklower 			while (zp < zlim) printf("%x ", *zp++);
151*45450Ssklower 			putchar ('\n');
152*45450Ssklower 		}
153*45450Ssklower 	}
154*45450Ssklower 	if (verify) {
155*45450Ssklower 		buflen = iov->iov_len;
156*45450Ssklower 		bcopy(iov->iov_base, dupbuf, buflen);
157*45450Ssklower 	}
158*45450Ssklower 	try(sendmsg, (s, &msg, flags), " put_record ");
159*45450Ssklower 	saved_x = x;
160*45450Ssklower 	while (verify && buflen > 0) {
161*45450Ssklower 		iov->iov_len = buflen;
162*45450Ssklower 		iov->iov_base = dupbuf;
163*45450Ssklower 		try(recvmsg, (s, &msg, flags), " put_record ");
164*45450Ssklower 		printf("verify got %d\n", x);
165*45450Ssklower 		buflen -= x;
166*45450Ssklower 	}
167*45450Ssklower 	msg.msg_control = 0;
168*45450Ssklower 	return (saved_x);
169*45450Ssklower }
170*45450Ssklower int *datasize = &iov->iov_len;
171*45450Ssklower char *cp, *cplim;
172*45450Ssklower 
173*45450Ssklower get_control_data(type, level)
174*45450Ssklower {
175*45450Ssklower 
176*45450Ssklower 	datasize = (int *)&msg.msg_controllen;
177*45450Ssklower 	cp = cm.cm.cmdata;
178*45450Ssklower 	cplim = cp + sizeof(cm.cm.cmdata);
179*45450Ssklower 	cm.cm.cmhdr.cmsg_level = level;
180*45450Ssklower 	cm.cm.cmhdr.cmsg_type = type;
181*45450Ssklower 	msg.msg_control = cm.data;
182*45450Ssklower }
183*45450Ssklower 
184*45450Ssklower 
185*45450Ssklower 
186*45450Ssklower get_record(flags)
187*45450Ssklower int *flags;
188*45450Ssklower {
189*45450Ssklower 	int factor = 1, x = 0;
190*45450Ssklower 	char workbuf[10240];
191*45450Ssklower 
192*45450Ssklower 	*flags = 0;
193*45450Ssklower 	*datasize = 0;
194*45450Ssklower 	datasize = &iov->iov_len;
195*45450Ssklower 	cp = data_msg + 1;
196*45450Ssklower 	cplim  = cp + sizeof(data_msg);
197*45450Ssklower 
198*45450Ssklower 	data_msg[0] = 0;
199*45450Ssklower 	for(;;) {
200*45450Ssklower 		x = scanf("%s", workbuf);
201*45450Ssklower 		if (x == EOF)
202*45450Ssklower 			break;
203*45450Ssklower 		if (strcmp(workbuf, "oob") == 0)
204*45450Ssklower 			*flags |= MSG_OOB;
205*45450Ssklower 		else if (strcmp(workbuf, "qbit") == 0)
206*45450Ssklower 			*data_msg |= 0x80;
207*45450Ssklower 		else if (strcmp(workbuf, "mbit") == 0)
208*45450Ssklower 			*data_msg |= 0x40;
209*45450Ssklower 		else if (strcmp(workbuf, "eom") == 0)
210*45450Ssklower 			*flags |= MSG_EOR;
211*45450Ssklower 		else if (strcmp(workbuf, "factor") == 0) {
212*45450Ssklower 			x = scanf("%d", &factor);
213*45450Ssklower 			if (factor <= 0) factor = 1;
214*45450Ssklower 			if (x == EOF)
215*45450Ssklower 				break;
216*45450Ssklower 		} else {
217*45450Ssklower 			int len = strlen(workbuf);
218*45450Ssklower 			localsize = 0;
219*45450Ssklower 			while ((factor-- > 0) &&
220*45450Ssklower 			       ((cp + len) < cplim)) {
221*45450Ssklower 					strcpy(cp, workbuf);
222*45450Ssklower 					cp += len;
223*45450Ssklower 					localsize += len;
224*45450Ssklower 			}
225*45450Ssklower 			*datasize = localsize;
226*45450Ssklower 			if (datasize != &iov->iov_len) {
227*45450Ssklower 				*datasize += sizeof(cm.cm.cmhdr);
228*45450Ssklower 				cm.cm.cmhdr.cmsg_len = *datasize;
229*45450Ssklower 			}
230*45450Ssklower 			break;
231*45450Ssklower 		}
232*45450Ssklower 	}
233*45450Ssklower 	errno = 0;
234*45450Ssklower 	return (x);
235*45450Ssklower }
236