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