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_sink.c 7.2 (Berkeley) 11/13/90"; 945450Ssklower #endif /* not lint */ 1045450Ssklower 1145450Ssklower /* 1245450Ssklower * This is a test program to be a sink for TP4 connections. 1345450Ssklower */ 1445450Ssklower #include <sys/param.h> 1545450Ssklower #include <sys/uio.h> 1645450Ssklower #include <sys/socket.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"); myexit(0);}} 3145450Ssklower 3245450Ssklower 3345450Ssklower struct ifreq ifr; 3445450Ssklower short port = 3000; 3545450Ssklower struct sockaddr_x25 faddr, laddr = { sizeof(laddr), AF_CCITT }; 3645450Ssklower struct sockaddr_x25 *sx25 = &laddr; 3745450Ssklower char **xenvp; 3845450Ssklower 3945450Ssklower long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0; 4045450Ssklower long records, intercept = 0, isode_mode; 4145450Ssklower 4245450Ssklower char buf[2048]; 4345450Ssklower char your_it[] = "You're it!"; 4445450Ssklower 4545450Ssklower char *Servername; 4645450Ssklower 4745450Ssklower main(argc, argv, envp) 4845450Ssklower int argc; 4945450Ssklower char *argv[]; 5045450Ssklower char *envp[]; 5145450Ssklower { 5245450Ssklower register char **av = argv; 5345450Ssklower register char *cp; 5445450Ssklower 5545450Ssklower xenvp = envp; 5645450Ssklower while(--argc > 0) { 5745450Ssklower av++; 5845450Ssklower if (strcmp(*av,"host")==0) { 5945450Ssklower av++; 6045450Ssklower ccitt_addr(*av, sx25); 6145450Ssklower argc--; 6245450Ssklower } else if (strcmp(*av,"count")==0) { 6345450Ssklower av++; 6445450Ssklower sscanf(*av,"%ld",&count); 6545450Ssklower argc--; 6645450Ssklower } else if (strcmp(*av,"size")==0) { 6745450Ssklower av++; 6845450Ssklower sscanf(*av,"%ld",&size); 6945450Ssklower argc--; 7045450Ssklower } else if (strcmp(*av, "intercept")==0) { 7145450Ssklower intercept++; 7245450Ssklower } 7345450Ssklower } 7445450Ssklower tisink(); 7545450Ssklower } 7645450Ssklower #define BIG 2048 7745450Ssklower #define MIDLIN 512 7845450Ssklower char readbuf[BIG]; 7945450Ssklower struct iovec iov[1] = { 8045450Ssklower readbuf, 8145450Ssklower sizeof readbuf, 8245450Ssklower }; 8345450Ssklower char name[MIDLIN]; 8445450Ssklower union { 8545450Ssklower struct { 8645450Ssklower struct cmsghdr cmhdr; 8745450Ssklower char cmdata[128 - sizeof(struct cmsghdr)]; 8845450Ssklower } cm; 8945450Ssklower char data[128]; 9045450Ssklower } cbuf; 9145450Ssklower #define control cbuf.data 9245450Ssklower struct msghdr msghdr = { 9345450Ssklower name, sizeof(name), 9445450Ssklower iov, sizeof(iov)/sizeof(iov[1]), 9545450Ssklower control, sizeof control, 9645450Ssklower 0 /* flags */ 9745450Ssklower }; 9845450Ssklower 9945450Ssklower tisink() 10045450Ssklower { 10145450Ssklower int x, s, pid, on = 1, loop = 0, n; 10245450Ssklower extern int errno; 10345450Ssklower 104*45572Ssklower try(socket, (AF_CCITT, SOCK_STREAM, 0),""); 10545450Ssklower 10645450Ssklower s = x; 10745450Ssklower 10845450Ssklower sx25->x25_opts.op_flags |= X25_MQBIT; 10945450Ssklower try(bind, (s, (struct sockaddr *) sx25, sx25->x25_len), ""); 11045450Ssklower 11145450Ssklower /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */ 11245450Ssklower 11345450Ssklower try(listen, (s, 5), ""); 11445450Ssklower for(;;) { 11545450Ssklower int child, ns; 11645450Ssklower int addrlen = sizeof(faddr); 11745450Ssklower char childname[50]; 11845450Ssklower 11945450Ssklower try (accept, (s, &faddr, &addrlen), ""); 12045450Ssklower ns = x; 12145450Ssklower dumpit("connection from:", &faddr, sizeof faddr); 12245450Ssklower if (mynamep || intercept) { 12345450Ssklower addrlen = sizeof(faddr); 12445450Ssklower try (getsockname, (ns, &faddr, &addrlen), ""); 12545450Ssklower dumpit("connected as:", &faddr, addrlen); 12645450Ssklower } 12745450Ssklower loop++; 12845450Ssklower if (loop > 3) myexit(0); 12945450Ssklower if (forkp) { 13045450Ssklower try(fork, (), ""); 13145450Ssklower } else 13245450Ssklower x = 0; 13345450Ssklower if (x == 0) { 13445450Ssklower long n, count = 0, cn, flags; 13545450Ssklower records = 0; 13645450Ssklower #ifdef ISODE_MODE 13745450Ssklower if (isode_mode) { 13845450Ssklower static char fdbuf[10]; 13945450Ssklower static char *nargv[4] = 14045450Ssklower {"/usr/sbin/isod.tsap", fdbuf, "", 0}; 14145450Ssklower sprintf(fdbuf, "Z%d", ns); 14245450Ssklower old_isod_main(3, nargv, xenvp); 14345450Ssklower } else 14445450Ssklower #endif 14545450Ssklower for (;;) { 14645450Ssklower msghdr.msg_iovlen = 1; 14745450Ssklower msghdr.msg_controllen = sizeof(control); 14845450Ssklower iov->iov_len = sizeof(readbuf); 14945450Ssklower n = recvmsg(ns, &msghdr, 0); 15045450Ssklower flags = msghdr.msg_flags; 15145450Ssklower count++; 15245450Ssklower dbprintf("recvmsg from child %d got %d ctl %d flags %x\n", 15345450Ssklower getpid(), n, (cn = msghdr.msg_controllen), 15445450Ssklower flags); 15545450Ssklower fflush(stdout); 15645450Ssklower if (cn && verbose) 15745450Ssklower dumpit("control data:\n", control, cn); 15845450Ssklower if (n < 0) { 15945450Ssklower fprintf(stderr, "errno is %d\n", errno); 16045450Ssklower perror("recvmsg"); 16145450Ssklower /*sleep (10);*/ 16245450Ssklower break; 16345450Ssklower } else { 16445450Ssklower if (verbose) 16545450Ssklower dumpit("data:\n", readbuf, n); 16645450Ssklower } 16745450Ssklower if (echop) { 16845450Ssklower n = answerback(flags, n, ns); 16945450Ssklower } 17045450Ssklower if (flags & MSG_EOR) 17145450Ssklower records++; 17245450Ssklower if (playtag && n == sizeof(your_it) && (flags & MSG_EOR) 17345450Ssklower && bcmp(readbuf, your_it, n) == 0) { 17445450Ssklower printf("Answering back!!!!\n"); 17545450Ssklower answerback(flags, n, ns); 17645450Ssklower answerback(flags, n, ns); 17745450Ssklower } 17845450Ssklower errno = 0; 17945450Ssklower } 18045450Ssklower } 18145450Ssklower myexit(0); 18245450Ssklower } 18345450Ssklower } 18445450Ssklower answerback(flags, n, ns) 18545450Ssklower { 18645450Ssklower msghdr.msg_controllen = 0; 18745450Ssklower msghdr.msg_iovlen = 1; 18845450Ssklower iov->iov_len = n; 18945450Ssklower n = sendmsg(ns, &msghdr, flags); 19045450Ssklower dbprintf("echoed %d\n", n); 19145450Ssklower return n; 19245450Ssklower } 19345450Ssklower 19445450Ssklower dumpit(what, where, n) 19545450Ssklower char *what; unsigned short *where; int n; 19645450Ssklower { 19745450Ssklower unsigned short *s = where; 19845450Ssklower unsigned short *z = where + (n+1)/2; 19945450Ssklower int count = 0; 20045450Ssklower printf(what); 20145450Ssklower while(s < z) { 20245450Ssklower count++; 20345450Ssklower printf("%x ",*s++); 20445450Ssklower if ((count & 15) == 0) 20545450Ssklower putchar('\n'); 20645450Ssklower } 20745450Ssklower if (count & 15) 20845450Ssklower putchar('\n'); 20945450Ssklower fflush(stdout); 21045450Ssklower } 21145450Ssklower myexit(n) 21245450Ssklower { 21345450Ssklower fflush(stderr); 21445450Ssklower printf("got %d records\n", records); 21545450Ssklower fflush(stdout); 21645450Ssklower exit(n); 21745450Ssklower } 218