149350Ssklower /*- 249353Sbostic * Copyright (c) 1988, 1991 The Regents of the University of California. 345450Ssklower * All rights reserved. 445450Ssklower * 545450Ssklower * %sccs.include.redist.c% 645450Ssklower */ 749353Sbostic 849353Sbostic #ifndef lint 949353Sbostic char copyright[] = 1049353Sbostic "@(#) Copyright (c) 1988, 1991 The Regents of the University of California.\n\ 1149353Sbostic All rights reserved.\n"; 1249353Sbostic #endif /* not lint */ 1349353Sbostic 1449353Sbostic #ifndef lint 15*50422Ssklower static char sccsid[] = "@(#)xi_sink.c 7.5 (Berkeley) 07/15/91"; 1649353Sbostic #endif /* not lint */ 1749353Sbostic 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 46*50422Ssklower long size, count = 10, forkp, echop = 0, mynamep, verbose = 1, playtag = 0; 47*50422Ssklower long records, intercept = 0, confp; 48*50422Ssklower void savedata(); 4945450Ssklower 5045450Ssklower char buf[2048]; 5145450Ssklower char your_it[] = "You're it!"; 5245450Ssklower 5345450Ssklower char *Servername; 5445450Ssklower 5545450Ssklower main(argc, argv, envp) 5645450Ssklower int argc; 5745450Ssklower char *argv[]; 5845450Ssklower char *envp[]; 5945450Ssklower { 6045450Ssklower register char **av = argv; 6145450Ssklower register char *cp; 6245450Ssklower 6345450Ssklower xenvp = envp; 6445450Ssklower while(--argc > 0) { 6545450Ssklower av++; 6645450Ssklower if (strcmp(*av,"host")==0) { 6745450Ssklower av++; 6845450Ssklower ccitt_addr(*av, sx25); 6945450Ssklower argc--; 7045450Ssklower } else if (strcmp(*av,"count")==0) { 7145450Ssklower av++; 7245450Ssklower sscanf(*av,"%ld",&count); 7345450Ssklower argc--; 7445450Ssklower } else if (strcmp(*av,"size")==0) { 7545450Ssklower av++; 7645450Ssklower sscanf(*av,"%ld",&size); 7745450Ssklower argc--; 7845450Ssklower } else if (strcmp(*av, "intercept")==0) { 7945450Ssklower intercept++; 8045450Ssklower } 8145450Ssklower } 8245450Ssklower tisink(); 8345450Ssklower } 8445450Ssklower #define BIG 2048 8545450Ssklower #define MIDLIN 512 8645450Ssklower char readbuf[BIG]; 8745450Ssklower struct iovec iov[1] = { 8845450Ssklower readbuf, 8945450Ssklower sizeof readbuf, 9045450Ssklower }; 9145450Ssklower char name[MIDLIN]; 9245450Ssklower union { 9345450Ssklower struct { 9445450Ssklower struct cmsghdr cmhdr; 9545450Ssklower char cmdata[128 - sizeof(struct cmsghdr)]; 9645450Ssklower } cm; 9745450Ssklower char data[128]; 9845450Ssklower } cbuf; 9945450Ssklower #define control cbuf.data 10045450Ssklower struct msghdr msghdr = { 10145450Ssklower name, sizeof(name), 10245450Ssklower iov, sizeof(iov)/sizeof(iov[1]), 103*50422Ssklower control, sizeof(control), 10445450Ssklower 0 /* flags */ 10545450Ssklower }; 10645450Ssklower 10745450Ssklower tisink() 10845450Ssklower { 10945450Ssklower int x, s, pid, on = 1, loop = 0, n; 11045450Ssklower extern int errno; 11145450Ssklower 11245572Ssklower try(socket, (AF_CCITT, SOCK_STREAM, 0),""); 11345450Ssklower 11445450Ssklower s = x; 11545450Ssklower 11645450Ssklower sx25->x25_opts.op_flags |= X25_MQBIT; 11745450Ssklower try(bind, (s, (struct sockaddr *) sx25, sx25->x25_len), ""); 11845450Ssklower 11945450Ssklower /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */ 12045450Ssklower 12145450Ssklower try(listen, (s, 5), ""); 12245450Ssklower for(;;) { 12345450Ssklower int child, ns; 12445450Ssklower int addrlen = sizeof(faddr); 12545450Ssklower char childname[50]; 12645450Ssklower 12745450Ssklower try (accept, (s, &faddr, &addrlen), ""); 12845450Ssklower ns = x; 12945450Ssklower dumpit("connection from:", &faddr, sizeof faddr); 13045450Ssklower if (mynamep || intercept) { 13145450Ssklower addrlen = sizeof(faddr); 13245450Ssklower try (getsockname, (ns, &faddr, &addrlen), ""); 13345450Ssklower dumpit("connected as:", &faddr, addrlen); 13445450Ssklower } 13545450Ssklower loop++; 13645450Ssklower if (loop > 3) myexit(0); 13745450Ssklower if (forkp) { 13845450Ssklower try(fork, (), ""); 13945450Ssklower } else 14045450Ssklower x = 0; 14145450Ssklower if (x == 0) { 14245450Ssklower long n, count = 0, cn, flags; 14345450Ssklower records = 0; 14445450Ssklower for (;;) { 14545450Ssklower msghdr.msg_iovlen = 1; 14645450Ssklower msghdr.msg_controllen = sizeof(control); 14745450Ssklower iov->iov_len = sizeof(readbuf); 14845450Ssklower n = recvmsg(ns, &msghdr, 0); 14945450Ssklower flags = msghdr.msg_flags; 15045450Ssklower count++; 15145450Ssklower dbprintf("recvmsg from child %d got %d ctl %d flags %x\n", 15245450Ssklower getpid(), n, (cn = msghdr.msg_controllen), 15345450Ssklower flags); 15445450Ssklower fflush(stdout); 15545450Ssklower if (cn && verbose) 15645450Ssklower dumpit("control data:\n", control, cn); 15745450Ssklower if (n < 0) { 15845450Ssklower fprintf(stderr, "errno is %d\n", errno); 15945450Ssklower perror("recvmsg"); 16045450Ssklower /*sleep (10);*/ 16145450Ssklower break; 16245450Ssklower } else { 16345450Ssklower if (verbose) 16445450Ssklower dumpit("data:\n", readbuf, n); 16545450Ssklower } 166*50422Ssklower if (echop) 167*50422Ssklower savedata(n); 16845450Ssklower if (flags & MSG_EOR) 16945450Ssklower records++; 170*50422Ssklower if (echop && (readbuf[0] & 0x80)) { 171*50422Ssklower dbprintf("Answering back!!!!\n"); 172*50422Ssklower answerback(ns); 17345450Ssklower } 17445450Ssklower errno = 0; 17545450Ssklower } 17645450Ssklower } 17745450Ssklower myexit(0); 17845450Ssklower } 17945450Ssklower } 180*50422Ssklower 181*50422Ssklower struct savebuf { 182*50422Ssklower struct savebuf *s_next; 183*50422Ssklower struct savebuf *s_prev; 184*50422Ssklower int s_n; 185*50422Ssklower int s_flags; 186*50422Ssklower } savebuf = {&savebuf, &savebuf}; 187*50422Ssklower 188*50422Ssklower void 189*50422Ssklower savedata(n, flags) 190*50422Ssklower int n; 19145450Ssklower { 192*50422Ssklower register struct savebuf *s = (struct savebuf *)malloc(n + sizeof *s); 193*50422Ssklower if (s == 0) 194*50422Ssklower return; 195*50422Ssklower insque(s, savebuf.s_prev); 196*50422Ssklower s->s_n = n; 197*50422Ssklower s->s_flags = flags; 198*50422Ssklower } 199*50422Ssklower 200*50422Ssklower answerback(ns) 201*50422Ssklower { 202*50422Ssklower int n; 203*50422Ssklower register struct savebuf *s = savebuf.s_next, *t; 20445450Ssklower msghdr.msg_controllen = 0; 20545450Ssklower msghdr.msg_iovlen = 1; 206*50422Ssklower while (s != &savebuf) { 207*50422Ssklower iov->iov_len = s->s_n; 208*50422Ssklower n = sendmsg(ns, &msghdr, s->s_flags); 209*50422Ssklower dbprintf("echoed %d\n", n); 210*50422Ssklower t = s; s = s->s_next; remque(t); free((char *)t); 211*50422Ssklower } 21245450Ssklower } 21345450Ssklower 21445450Ssklower dumpit(what, where, n) 21545450Ssklower char *what; unsigned short *where; int n; 21645450Ssklower { 21745450Ssklower unsigned short *s = where; 21845450Ssklower unsigned short *z = where + (n+1)/2; 21945450Ssklower int count = 0; 22045450Ssklower printf(what); 22145450Ssklower while(s < z) { 22245450Ssklower count++; 22345450Ssklower printf("%x ",*s++); 22445450Ssklower if ((count & 15) == 0) 22545450Ssklower putchar('\n'); 22645450Ssklower } 22745450Ssklower if (count & 15) 22845450Ssklower putchar('\n'); 22945450Ssklower fflush(stdout); 23045450Ssklower } 23145450Ssklower myexit(n) 23245450Ssklower { 23345450Ssklower fflush(stderr); 23445450Ssklower printf("got %d records\n", records); 23545450Ssklower fflush(stdout); 23645450Ssklower exit(n); 23745450Ssklower } 238