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