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*50423Ssklower static char sccsid[] = "@(#)xi_sink.c 7.6 (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
36*50423Ssklower #ifdef __STDC__
37*50423Ssklower #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,#a,x);\
38*50423Ssklower if(x<0) {perror(#a); myexit(0);}}
39*50423Ssklower #else
4045450Ssklower #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\
4145450Ssklower if(x<0) {perror("a"); myexit(0);}}
42*50423Ssklower #endif
4345450Ssklower
4445450Ssklower
4545450Ssklower struct ifreq ifr;
4645450Ssklower short port = 3000;
4745450Ssklower struct sockaddr_x25 faddr, laddr = { sizeof(laddr), AF_CCITT };
4845450Ssklower struct sockaddr_x25 *sx25 = &laddr;
4945450Ssklower char **xenvp;
5045450Ssklower
5150422Ssklower long size, count = 10, forkp, echop = 0, mynamep, verbose = 1, playtag = 0;
5250422Ssklower long records, intercept = 0, confp;
5350422Ssklower void savedata();
5445450Ssklower
5545450Ssklower char buf[2048];
5645450Ssklower char your_it[] = "You're it!";
5745450Ssklower
5845450Ssklower char *Servername;
5945450Ssklower
main(argc,argv,envp)6045450Ssklower main(argc, argv, envp)
6145450Ssklower int argc;
6245450Ssklower char *argv[];
6345450Ssklower char *envp[];
6445450Ssklower {
6545450Ssklower register char **av = argv;
6645450Ssklower register char *cp;
6745450Ssklower
6845450Ssklower xenvp = envp;
6945450Ssklower while(--argc > 0) {
7045450Ssklower av++;
7145450Ssklower if (strcmp(*av,"host")==0) {
7245450Ssklower av++;
7345450Ssklower ccitt_addr(*av, sx25);
7445450Ssklower argc--;
7545450Ssklower } else if (strcmp(*av,"count")==0) {
7645450Ssklower av++;
7745450Ssklower sscanf(*av,"%ld",&count);
7845450Ssklower argc--;
7945450Ssklower } else if (strcmp(*av,"size")==0) {
8045450Ssklower av++;
8145450Ssklower sscanf(*av,"%ld",&size);
8245450Ssklower argc--;
8345450Ssklower } else if (strcmp(*av, "intercept")==0) {
8445450Ssklower intercept++;
8545450Ssklower }
8645450Ssklower }
87*50423Ssklower xisink();
8845450Ssklower }
8945450Ssklower #define BIG 2048
9045450Ssklower #define MIDLIN 512
9145450Ssklower char readbuf[BIG];
9245450Ssklower char name[MIDLIN];
93*50423Ssklower struct iovec iov[1];
9445450Ssklower union {
9545450Ssklower struct {
9645450Ssklower struct cmsghdr cmhdr;
9745450Ssklower char cmdata[128 - sizeof(struct cmsghdr)];
9845450Ssklower } cm;
9945450Ssklower char data[128];
10045450Ssklower } cbuf;
10145450Ssklower #define control cbuf.data
10245450Ssklower struct msghdr msghdr = {
103*50423Ssklower 0, 0,
10445450Ssklower iov, sizeof(iov)/sizeof(iov[1]),
105*50423Ssklower 0, 0, 0
10645450Ssklower };
10745450Ssklower
xisink()108*50423Ssklower xisink()
10945450Ssklower {
11045450Ssklower int x, s, pid, on = 1, loop = 0, n;
11145450Ssklower extern int errno;
11245450Ssklower
11345572Ssklower try(socket, (AF_CCITT, SOCK_STREAM, 0),"");
11445450Ssklower
11545450Ssklower s = x;
11645450Ssklower
11745450Ssklower sx25->x25_opts.op_flags |= X25_MQBIT;
11845450Ssklower try(bind, (s, (struct sockaddr *) sx25, sx25->x25_len), "");
11945450Ssklower
12045450Ssklower /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */
12145450Ssklower
12245450Ssklower try(listen, (s, 5), "");
12345450Ssklower for(;;) {
12445450Ssklower int child, ns;
12545450Ssklower int addrlen = sizeof(faddr);
12645450Ssklower char childname[50];
12745450Ssklower
128*50423Ssklower try (accept, (s, (struct sockaddr *)&faddr, &addrlen), "");
12945450Ssklower ns = x;
13045450Ssklower dumpit("connection from:", &faddr, sizeof faddr);
13145450Ssklower if (mynamep || intercept) {
13245450Ssklower addrlen = sizeof(faddr);
133*50423Ssklower try (getsockname, (ns, (struct sockaddr *)&faddr,
134*50423Ssklower &addrlen), "");
13545450Ssklower dumpit("connected as:", &faddr, addrlen);
13645450Ssklower }
13745450Ssklower loop++;
13845450Ssklower if (loop > 3) myexit(0);
13945450Ssklower if (forkp) {
14045450Ssklower try(fork, (), "");
14145450Ssklower } else
14245450Ssklower x = 0;
14345450Ssklower if (x == 0) {
14445450Ssklower long n, count = 0, cn, flags;
14545450Ssklower records = 0;
14645450Ssklower for (;;) {
14745450Ssklower msghdr.msg_controllen = sizeof(control);
148*50423Ssklower msghdr.msg_control = control;
14945450Ssklower iov->iov_len = sizeof(readbuf);
150*50423Ssklower iov->iov_base = readbuf;
15145450Ssklower n = recvmsg(ns, &msghdr, 0);
15245450Ssklower flags = msghdr.msg_flags;
15345450Ssklower count++;
15445450Ssklower dbprintf("recvmsg from child %d got %d ctl %d flags %x\n",
15545450Ssklower getpid(), n, (cn = msghdr.msg_controllen),
15645450Ssklower flags);
15745450Ssklower fflush(stdout);
15845450Ssklower if (cn && verbose)
15945450Ssklower dumpit("control data:\n", control, cn);
16045450Ssklower if (n < 0) {
16145450Ssklower fprintf(stderr, "errno is %d\n", errno);
16245450Ssklower perror("recvmsg");
16345450Ssklower /*sleep (10);*/
16445450Ssklower break;
16545450Ssklower } else {
16645450Ssklower if (verbose)
16745450Ssklower dumpit("data:\n", readbuf, n);
16845450Ssklower }
16950422Ssklower if (echop)
17050422Ssklower savedata(n);
17145450Ssklower if (flags & MSG_EOR)
17245450Ssklower records++;
17350422Ssklower if (echop && (readbuf[0] & 0x80)) {
17450422Ssklower dbprintf("Answering back!!!!\n");
17550422Ssklower answerback(ns);
17645450Ssklower }
17745450Ssklower errno = 0;
17845450Ssklower }
17945450Ssklower }
18045450Ssklower myexit(0);
18145450Ssklower }
18245450Ssklower }
18350422Ssklower
18450422Ssklower struct savebuf {
18550422Ssklower struct savebuf *s_next;
18650422Ssklower struct savebuf *s_prev;
18750422Ssklower int s_n;
18850422Ssklower int s_flags;
18950422Ssklower } savebuf = {&savebuf, &savebuf};
19050422Ssklower
19150422Ssklower void
savedata(n)192*50423Ssklower savedata(n)
19350422Ssklower int n;
19445450Ssklower {
19550422Ssklower register struct savebuf *s = (struct savebuf *)malloc(n + sizeof *s);
19650422Ssklower if (s == 0)
19750422Ssklower return;
19850422Ssklower insque(s, savebuf.s_prev);
19950422Ssklower s->s_n = n;
200*50423Ssklower s->s_flags = msghdr.msg_flags;
201*50423Ssklower bcopy(readbuf, (char *)(s + 1), n);
20250422Ssklower }
20350422Ssklower
answerback(ns)20450422Ssklower answerback(ns)
20550422Ssklower {
20650422Ssklower int n;
20750422Ssklower register struct savebuf *s = savebuf.s_next, *t;
20845450Ssklower msghdr.msg_controllen = 0;
209*50423Ssklower msghdr.msg_control = 0;
21050422Ssklower while (s != &savebuf) {
21150422Ssklower iov->iov_len = s->s_n;
212*50423Ssklower iov->iov_base = (char *)(s + 1);
21350422Ssklower n = sendmsg(ns, &msghdr, s->s_flags);
21450422Ssklower dbprintf("echoed %d\n", n);
21550422Ssklower t = s; s = s->s_next; remque(t); free((char *)t);
21650422Ssklower }
21745450Ssklower }
21845450Ssklower
dumpit(what,where,n)21945450Ssklower dumpit(what, where, n)
22045450Ssklower char *what; unsigned short *where; int n;
22145450Ssklower {
22245450Ssklower unsigned short *s = where;
22345450Ssklower unsigned short *z = where + (n+1)/2;
22445450Ssklower int count = 0;
22545450Ssklower printf(what);
22645450Ssklower while(s < z) {
22745450Ssklower count++;
22845450Ssklower printf("%x ",*s++);
22945450Ssklower if ((count & 15) == 0)
23045450Ssklower putchar('\n');
23145450Ssklower }
23245450Ssklower if (count & 15)
23345450Ssklower putchar('\n');
23445450Ssklower fflush(stdout);
23545450Ssklower }
myexit(n)23645450Ssklower myexit(n)
23745450Ssklower {
23845450Ssklower fflush(stderr);
23945450Ssklower printf("got %d records\n", records);
24045450Ssklower fflush(stdout);
24145450Ssklower exit(n);
24245450Ssklower }
243