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