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