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