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_sink.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 sink for TP4 connections. 13*45450Ssklower */ 14*45450Ssklower #include <sys/param.h> 15*45450Ssklower #include <sys/uio.h> 16*45450Ssklower #include <sys/socket.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"); myexit(0);}} 31*45450Ssklower 32*45450Ssklower 33*45450Ssklower struct ifreq ifr; 34*45450Ssklower short port = 3000; 35*45450Ssklower struct sockaddr_x25 faddr, laddr = { sizeof(laddr), AF_CCITT }; 36*45450Ssklower struct sockaddr_x25 *sx25 = &laddr; 37*45450Ssklower char **xenvp; 38*45450Ssklower 39*45450Ssklower long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0; 40*45450Ssklower long records, intercept = 0, isode_mode; 41*45450Ssklower 42*45450Ssklower char buf[2048]; 43*45450Ssklower char your_it[] = "You're it!"; 44*45450Ssklower 45*45450Ssklower char *Servername; 46*45450Ssklower 47*45450Ssklower main(argc, argv, envp) 48*45450Ssklower int argc; 49*45450Ssklower char *argv[]; 50*45450Ssklower char *envp[]; 51*45450Ssklower { 52*45450Ssklower register char **av = argv; 53*45450Ssklower register char *cp; 54*45450Ssklower 55*45450Ssklower xenvp = envp; 56*45450Ssklower while(--argc > 0) { 57*45450Ssklower av++; 58*45450Ssklower if (strcmp(*av,"host")==0) { 59*45450Ssklower av++; 60*45450Ssklower ccitt_addr(*av, sx25); 61*45450Ssklower argc--; 62*45450Ssklower } else if (strcmp(*av,"count")==0) { 63*45450Ssklower av++; 64*45450Ssklower sscanf(*av,"%ld",&count); 65*45450Ssklower argc--; 66*45450Ssklower } else if (strcmp(*av,"size")==0) { 67*45450Ssklower av++; 68*45450Ssklower sscanf(*av,"%ld",&size); 69*45450Ssklower argc--; 70*45450Ssklower } else if (strcmp(*av, "intercept")==0) { 71*45450Ssklower intercept++; 72*45450Ssklower } 73*45450Ssklower } 74*45450Ssklower tisink(); 75*45450Ssklower } 76*45450Ssklower #define BIG 2048 77*45450Ssklower #define MIDLIN 512 78*45450Ssklower char readbuf[BIG]; 79*45450Ssklower struct iovec iov[1] = { 80*45450Ssklower readbuf, 81*45450Ssklower sizeof readbuf, 82*45450Ssklower }; 83*45450Ssklower char name[MIDLIN]; 84*45450Ssklower union { 85*45450Ssklower struct { 86*45450Ssklower struct cmsghdr cmhdr; 87*45450Ssklower char cmdata[128 - sizeof(struct cmsghdr)]; 88*45450Ssklower } cm; 89*45450Ssklower char data[128]; 90*45450Ssklower } cbuf; 91*45450Ssklower #define control cbuf.data 92*45450Ssklower struct msghdr msghdr = { 93*45450Ssklower name, sizeof(name), 94*45450Ssklower iov, sizeof(iov)/sizeof(iov[1]), 95*45450Ssklower control, sizeof control, 96*45450Ssklower 0 /* flags */ 97*45450Ssklower }; 98*45450Ssklower 99*45450Ssklower tisink() 100*45450Ssklower { 101*45450Ssklower int x, s, pid, on = 1, loop = 0, n; 102*45450Ssklower extern int errno; 103*45450Ssklower 104*45450Ssklower try(socket, (AF_ISO, SOCK_SEQPACKET, 0),""); 105*45450Ssklower 106*45450Ssklower s = x; 107*45450Ssklower 108*45450Ssklower sx25->x25_opts.op_flags |= X25_MQBIT; 109*45450Ssklower try(bind, (s, (struct sockaddr *) sx25, sx25->x25_len), ""); 110*45450Ssklower 111*45450Ssklower /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */ 112*45450Ssklower 113*45450Ssklower try(listen, (s, 5), ""); 114*45450Ssklower for(;;) { 115*45450Ssklower int child, ns; 116*45450Ssklower int addrlen = sizeof(faddr); 117*45450Ssklower char childname[50]; 118*45450Ssklower 119*45450Ssklower try (accept, (s, &faddr, &addrlen), ""); 120*45450Ssklower ns = x; 121*45450Ssklower dumpit("connection from:", &faddr, sizeof faddr); 122*45450Ssklower if (mynamep || intercept) { 123*45450Ssklower addrlen = sizeof(faddr); 124*45450Ssklower try (getsockname, (ns, &faddr, &addrlen), ""); 125*45450Ssklower dumpit("connected as:", &faddr, addrlen); 126*45450Ssklower } 127*45450Ssklower loop++; 128*45450Ssklower if (loop > 3) myexit(0); 129*45450Ssklower if (forkp) { 130*45450Ssklower try(fork, (), ""); 131*45450Ssklower } else 132*45450Ssklower x = 0; 133*45450Ssklower if (x == 0) { 134*45450Ssklower long n, count = 0, cn, flags; 135*45450Ssklower records = 0; 136*45450Ssklower #ifdef ISODE_MODE 137*45450Ssklower if (isode_mode) { 138*45450Ssklower static char fdbuf[10]; 139*45450Ssklower static char *nargv[4] = 140*45450Ssklower {"/usr/sbin/isod.tsap", fdbuf, "", 0}; 141*45450Ssklower sprintf(fdbuf, "Z%d", ns); 142*45450Ssklower old_isod_main(3, nargv, xenvp); 143*45450Ssklower } else 144*45450Ssklower #endif 145*45450Ssklower for (;;) { 146*45450Ssklower msghdr.msg_iovlen = 1; 147*45450Ssklower msghdr.msg_controllen = sizeof(control); 148*45450Ssklower iov->iov_len = sizeof(readbuf); 149*45450Ssklower n = recvmsg(ns, &msghdr, 0); 150*45450Ssklower flags = msghdr.msg_flags; 151*45450Ssklower count++; 152*45450Ssklower dbprintf("recvmsg from child %d got %d ctl %d flags %x\n", 153*45450Ssklower getpid(), n, (cn = msghdr.msg_controllen), 154*45450Ssklower flags); 155*45450Ssklower fflush(stdout); 156*45450Ssklower if (cn && verbose) 157*45450Ssklower dumpit("control data:\n", control, cn); 158*45450Ssklower if (n < 0) { 159*45450Ssklower fprintf(stderr, "errno is %d\n", errno); 160*45450Ssklower perror("recvmsg"); 161*45450Ssklower /*sleep (10);*/ 162*45450Ssklower break; 163*45450Ssklower } else { 164*45450Ssklower if (verbose) 165*45450Ssklower dumpit("data:\n", readbuf, n); 166*45450Ssklower } 167*45450Ssklower if (echop) { 168*45450Ssklower n = answerback(flags, n, ns); 169*45450Ssklower } 170*45450Ssklower if (flags & MSG_EOR) 171*45450Ssklower records++; 172*45450Ssklower if (playtag && n == sizeof(your_it) && (flags & MSG_EOR) 173*45450Ssklower && bcmp(readbuf, your_it, n) == 0) { 174*45450Ssklower printf("Answering back!!!!\n"); 175*45450Ssklower answerback(flags, n, ns); 176*45450Ssklower answerback(flags, n, ns); 177*45450Ssklower } 178*45450Ssklower errno = 0; 179*45450Ssklower } 180*45450Ssklower } 181*45450Ssklower myexit(0); 182*45450Ssklower } 183*45450Ssklower } 184*45450Ssklower answerback(flags, n, ns) 185*45450Ssklower { 186*45450Ssklower msghdr.msg_controllen = 0; 187*45450Ssklower msghdr.msg_iovlen = 1; 188*45450Ssklower iov->iov_len = n; 189*45450Ssklower n = sendmsg(ns, &msghdr, flags); 190*45450Ssklower dbprintf("echoed %d\n", n); 191*45450Ssklower return n; 192*45450Ssklower } 193*45450Ssklower 194*45450Ssklower dumpit(what, where, n) 195*45450Ssklower char *what; unsigned short *where; int n; 196*45450Ssklower { 197*45450Ssklower unsigned short *s = where; 198*45450Ssklower unsigned short *z = where + (n+1)/2; 199*45450Ssklower int count = 0; 200*45450Ssklower printf(what); 201*45450Ssklower while(s < z) { 202*45450Ssklower count++; 203*45450Ssklower printf("%x ",*s++); 204*45450Ssklower if ((count & 15) == 0) 205*45450Ssklower putchar('\n'); 206*45450Ssklower } 207*45450Ssklower if (count & 15) 208*45450Ssklower putchar('\n'); 209*45450Ssklower fflush(stdout); 210*45450Ssklower } 211*45450Ssklower myexit(n) 212*45450Ssklower { 213*45450Ssklower fflush(stderr); 214*45450Ssklower printf("got %d records\n", records); 215*45450Ssklower fflush(stdout); 216*45450Ssklower exit(n); 217*45450Ssklower } 218