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