xref: /csrg-svn/sys/tests/netccitt/xi_src.c (revision 49353)
149350Ssklower /*-
2*49353Sbostic  * Copyright (c) 1988, 1991 The Regents of the University of California.
345450Ssklower  * All rights reserved.
445450Ssklower  *
545450Ssklower  * %sccs.include.redist.c%
645450Ssklower  */
7*49353Sbostic 
8*49353Sbostic #ifndef lint
9*49353Sbostic char copyright[] =
10*49353Sbostic "@(#) Copyright (c) 1988, 1991 The Regents of the University of California.\n\
11*49353Sbostic  All rights reserved.\n";
12*49353Sbostic #endif /* not lint */
13*49353Sbostic 
14*49353Sbostic #ifndef lint
15*49353Sbostic static char sccsid[] = "@(#)xi_src.c	7.5 (Berkeley) 05/07/91";
16*49353Sbostic #endif /* not lint */
17*49353Sbostic 
1845450Ssklower /*
1948842Ssklower  * This is a test program to be a source for X.25 connections.
2045450Ssklower  */
2145450Ssklower #include <sys/types.h>
2245450Ssklower #include <sys/socket.h>
2345450Ssklower #include <sys/uio.h>
2445450Ssklower #include <sys/ioctl.h>
2545450Ssklower #include <net/route.h>
2645450Ssklower #include <net/if.h>
2745450Ssklower #include <netccitt/x25.h>
2845450Ssklower 
2945450Ssklower #include <stdio.h>
3045450Ssklower #include <errno.h>
3145450Ssklower #include <ctype.h>
3245450Ssklower #include <netdb.h>
3345450Ssklower 
3445450Ssklower 
3545450Ssklower #define dbprintf if(verbose)printf
3645450Ssklower #define try(a,b,c) {x = (a b);dbprintf("%s%s returns %d\n",c,"a",x);\
3745450Ssklower 		    if (x < 0) {perror("a"); exit(1);}}
3845450Ssklower 
3945450Ssklower fd_set	readfds, writefds, exceptfds;
4045450Ssklower long size, count = 10;
4145450Ssklower int verbose = 1, selectp, type = SOCK_STREAM, nobuffs, errno, playtag = 0;
4245450Ssklower int verify = 0, mqdata;
4345450Ssklower short portnumber = 3000;
4445450Ssklower struct sockaddr_x25 to;
4545450Ssklower char your_it[] = "You're it!";
4645450Ssklower char *port, *conndata, data_msg[2048];
4745450Ssklower struct iovec iov[1] = {data_msg};
4845450Ssklower union {
4945450Ssklower     struct {
5045450Ssklower 	    struct cmsghdr	cmhdr;
5145450Ssklower 	    char		cmdata[128 - sizeof (struct cmsghdr)];
5245450Ssklower     } cm;
5345450Ssklower     char data[128];
5445450Ssklower } cm;
5545450Ssklower struct msghdr msg = { 0, 0, iov, 1, 0, 0, 0};
5645450Ssklower 
5745450Ssklower main(argc, argv)
5845450Ssklower int argc;
5945450Ssklower char *argv[];
6045450Ssklower {
6145450Ssklower 	register char **av = argv;
6245450Ssklower 	register char *cp;
6345450Ssklower 	u_long len;
6445450Ssklower 	int handy;
6545450Ssklower 
6645450Ssklower 	while(--argc > 0) {
6745450Ssklower 		av++;
6845450Ssklower 		if (strcmp(*av,"dest")==0) {
6945450Ssklower 			av++;
7045450Ssklower 			ccitt_addr(*av, &to);
7145450Ssklower 			argc--;
7245450Ssklower 		} else if (strcmp(*av,"count")==0) {
7345450Ssklower 			av++;
7445450Ssklower 			sscanf(*av,"%ld",&count);
7545450Ssklower 			argc--;
7645450Ssklower 		} else if (strcmp(*av,"size")==0) {
7745450Ssklower 			av++;
7845450Ssklower 			sscanf(*av,"%ld",&size);
7945450Ssklower 		}
8045450Ssklower 	}
8148842Ssklower 	xisrc();
8245450Ssklower }
8345450Ssklower 
8448842Ssklower xisrc() {
8545450Ssklower 	int x, s, pid, on = 1, flags = 8, n;
8645450Ssklower 
8745450Ssklower 	try(socket, (AF_CCITT, type, 0),"");
8845450Ssklower 	s = x;
8945450Ssklower 
9045450Ssklower 	/*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), "");*/
9145450Ssklower 
9245450Ssklower 	to.x25_opts.op_flags |= X25_MQBIT;
9345450Ssklower 	try(connect, (s, (struct sockaddr *) &to, to.x25_len), "");
9445450Ssklower 
9545450Ssklower 	if (selectp) {
9645450Ssklower 		FD_ZERO(&writefds); FD_SET(s, &writefds);
9745450Ssklower 		select(1, &writefds, 0, 0, 0);
9845450Ssklower 	}
9945450Ssklower 	while (count-- > 0) {
10045450Ssklower 		if (size <= 0 && get_record(&flags) == EOF)
10145450Ssklower 			exit(0);
10245450Ssklower 		n = put_record(s, flags);
10345450Ssklower 		if (n < iov->iov_len) {
10445450Ssklower 			if (n==-1 && errno == 55) {
10545450Ssklower 				nobuffs++;
10645450Ssklower 				count++;
10745450Ssklower 				continue;
10845450Ssklower 			}
10945450Ssklower 			fprintf(stderr, "wrote %d < %d, count %d,",
11045450Ssklower 						n, iov->iov_len, count);
11145450Ssklower 			perror("due to");
11245450Ssklower 		}
11345450Ssklower 	}
11445450Ssklower 	if (playtag) {
11545450Ssklower 		printf("Tag time!\n");
11645450Ssklower 		iov->iov_base = your_it;
11745450Ssklower 		iov->iov_len = sizeof your_it;
11845450Ssklower 		sendmsg(s, &msg, MSG_EOR);
11945450Ssklower 		sendmsg(s, &msg, MSG_EOR);
12045450Ssklower 		iov->iov_base = data_msg;
12145450Ssklower 		iov->iov_len = sizeof data_msg;
12245450Ssklower 		try(recvmsg, (s, &msg, flags), " playtag ");
12345450Ssklower 	}
12445450Ssklower 	if (nobuffs) {
12545450Ssklower 		printf("looped %d times waiting for bufs\n", nobuffs);
12645450Ssklower 	}
12745450Ssklower }
12845450Ssklower int localsize;
12945450Ssklower char dupbuf[4096];
13045450Ssklower 
13145450Ssklower put_record(s, flags)
13245450Ssklower int s, flags;
13345450Ssklower {
13445450Ssklower 	int fd, buflen;
13545450Ssklower 	char *buf;
13645450Ssklower 	int x, saved_x;
13745450Ssklower 
13845450Ssklower 	msg.msg_flags = flags;
13945450Ssklower 	if (verbose) {
14045450Ssklower 		unsigned short *zp, *zlim;
14145450Ssklower 		if (msg.msg_controllen) {
14245450Ssklower 			zp = (unsigned short *)&(cm.cm.cmhdr.cmsg_len);
14345450Ssklower 			printf("(CMessage Type is %x) ", cm.cm.cmhdr.cmsg_type);
14445450Ssklower 			printf("CMsg data: ");
14545450Ssklower 			x = msg.msg_controllen;
14645450Ssklower 			zlim = zp + ((x + 1) / 2);
14745450Ssklower 			while (zp < zlim) printf("%x ", *zp++);
14845450Ssklower 			putchar ('\n');
14945450Ssklower 		}
15045450Ssklower 		if (iov->iov_len) {
15145450Ssklower 			printf("sending: %s %s",
15245450Ssklower 			(flags & MSG_OOB ? "(OOB Data)" : ""),
15345450Ssklower 				(flags & MSG_EOR ? "(Record Mark)" : ""));
15445450Ssklower 			x = localsize;
15545450Ssklower 			zp = (unsigned short *)data_msg;
15645450Ssklower 			zlim = zp + ((x + 1) / 2);
15745450Ssklower 			while (zp < zlim) printf("%x ", *zp++);
15845450Ssklower 			putchar ('\n');
15945450Ssklower 		}
16045450Ssklower 	}
16145450Ssklower 	if (verify) {
16245450Ssklower 		buflen = iov->iov_len;
16345450Ssklower 		bcopy(iov->iov_base, dupbuf, buflen);
16445450Ssklower 	}
16545450Ssklower 	try(sendmsg, (s, &msg, flags), " put_record ");
16645450Ssklower 	saved_x = x;
16745450Ssklower 	while (verify && buflen > 0) {
16845450Ssklower 		iov->iov_len = buflen;
16945450Ssklower 		iov->iov_base = dupbuf;
17045450Ssklower 		try(recvmsg, (s, &msg, flags), " put_record ");
17145450Ssklower 		printf("verify got %d\n", x);
17245450Ssklower 		buflen -= x;
17345450Ssklower 	}
17445450Ssklower 	msg.msg_control = 0;
17545450Ssklower 	return (saved_x);
17645450Ssklower }
17745450Ssklower int *datasize = &iov->iov_len;
17845450Ssklower char *cp, *cplim;
17945450Ssklower 
18045450Ssklower get_control_data(type, level)
18145450Ssklower {
18245450Ssklower 
18345450Ssklower 	datasize = (int *)&msg.msg_controllen;
18445450Ssklower 	cp = cm.cm.cmdata;
18545450Ssklower 	cplim = cp + sizeof(cm.cm.cmdata);
18645450Ssklower 	cm.cm.cmhdr.cmsg_level = level;
18745450Ssklower 	cm.cm.cmhdr.cmsg_type = type;
18845450Ssklower 	msg.msg_control = cm.data;
18945450Ssklower }
19045450Ssklower 
19145450Ssklower 
19245450Ssklower 
19345450Ssklower get_record(flags)
19445450Ssklower int *flags;
19545450Ssklower {
19645450Ssklower 	int factor = 1, x = 0;
19745450Ssklower 	char workbuf[10240];
19848842Ssklower 	static repeatcount, repeatsize;
19945450Ssklower 
20048842Ssklower 	if (repeatcount > 0) {
20148842Ssklower 		repeatcount--;
20248842Ssklower 		return;
20348842Ssklower 	}
20445450Ssklower 	*flags = 0;
20545450Ssklower 	*datasize = 0;
20645450Ssklower 	datasize = &iov->iov_len;
20745450Ssklower 	cp = data_msg + 1;
20845572Ssklower 	cplim  = data_msg + sizeof(data_msg);
20945450Ssklower 
21045572Ssklower 	*data_msg = 0;
21145450Ssklower 	for(;;) {
21245450Ssklower 		x = scanf("%s", workbuf);
21345450Ssklower 		if (x == EOF)
21445450Ssklower 			break;
21545450Ssklower 		if (strcmp(workbuf, "oob") == 0)
21645450Ssklower 			*flags |= MSG_OOB;
21745450Ssklower 		else if (strcmp(workbuf, "qbit") == 0)
21845450Ssklower 			*data_msg |= 0x80;
21945450Ssklower 		else if (strcmp(workbuf, "mbit") == 0)
22045450Ssklower 			*data_msg |= 0x40;
22145450Ssklower 		else if (strcmp(workbuf, "eom") == 0)
22245450Ssklower 			*flags |= MSG_EOR;
22345450Ssklower 		else if (strcmp(workbuf, "factor") == 0) {
22445450Ssklower 			x = scanf("%d", &factor);
22545450Ssklower 			if (factor <= 0) factor = 1;
22645450Ssklower 			if (x == EOF)
22745450Ssklower 				break;
22848842Ssklower 		} else if (strcmp(workbuf, "repeat") == 0) {
22948842Ssklower 			x = scanf("%d", &repeatcount);
23048842Ssklower 			if (repeatcount <= 0) repeatcount = 1;
23148842Ssklower 			if (x == EOF)
23248842Ssklower 				break;
23345450Ssklower 		} else {
23445450Ssklower 			int len = strlen(workbuf);
23545572Ssklower 			localsize = 1;
23645450Ssklower 			while ((factor-- > 0) &&
23745450Ssklower 			       ((cp + len) < cplim)) {
23845450Ssklower 					strcpy(cp, workbuf);
23945450Ssklower 					cp += len;
24045450Ssklower 					localsize += len;
24145450Ssklower 			}
24245450Ssklower 			*datasize = localsize;
24345450Ssklower 			if (datasize != &iov->iov_len) {
24445450Ssklower 				*datasize += sizeof(cm.cm.cmhdr);
24548842Ssklower 				repeatsize = cm.cm.cmhdr.cmsg_len = *datasize;
24645450Ssklower 			}
24745450Ssklower 			break;
24845450Ssklower 		}
24945450Ssklower 	}
25045450Ssklower 	errno = 0;
25145450Ssklower 	return (x);
25245450Ssklower }
253