* Copyright (c) 1988, 1991 The Regents of the University of California.
* %sccs.include.redist.c%
"@(#) Copyright (c) 1988, 1991 The Regents of the University of California.\n\
static char sccsid
[] = "@(#)xi_sink.c 7.4 (Berkeley) %G%";
* This is a test program to be a sink for X.25 connections.
#include <netccitt/x25.h>
#define dbprintf if(verbose)printf
#define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\
if(x<0) {perror("a"); myexit(0);}}
struct sockaddr_x25 faddr
, laddr
= { sizeof(laddr
), AF_CCITT
};
struct sockaddr_x25
*sx25
= &laddr
;
long size
, count
= 10, forkp
, confp
, echop
, mynamep
, verbose
= 1, playtag
= 0;
long records
, intercept
= 0, isode_mode
;
char your_it
[] = "You're it!";
register char **av
= argv
;
if (strcmp(*av
,"host")==0) {
} else if (strcmp(*av
,"count")==0) {
sscanf(*av
,"%ld",&count
);
} else if (strcmp(*av
,"size")==0) {
} else if (strcmp(*av
, "intercept")==0) {
char cmdata
[128 - sizeof(struct cmsghdr
)];
#define control cbuf.data
iov
, sizeof(iov
)/sizeof(iov
[1]),
int x
, s
, pid
, on
= 1, loop
= 0, n
;
try(socket
, (AF_CCITT
, SOCK_STREAM
, 0),"");
sx25
->x25_opts
.op_flags
|= X25_MQBIT
;
try(bind
, (s
, (struct sockaddr
*) sx25
, sx25
->x25_len
), "");
/*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */
int addrlen
= sizeof(faddr
);
try (accept
, (s
, &faddr
, &addrlen
), "");
dumpit("connection from:", &faddr
, sizeof faddr
);
if (mynamep
|| intercept
) {
try (getsockname
, (ns
, &faddr
, &addrlen
), "");
dumpit("connected as:", &faddr
, addrlen
);
long n
, count
= 0, cn
, flags
;
{"/usr/sbin/isod.tsap", fdbuf
, "", 0};
sprintf(fdbuf
, "Z%d", ns
);
old_isod_main(3, nargv
, xenvp
);
msghdr
.msg_controllen
= sizeof(control
);
iov
->iov_len
= sizeof(readbuf
);
n
= recvmsg(ns
, &msghdr
, 0);
flags
= msghdr
.msg_flags
;
dbprintf("recvmsg from child %d got %d ctl %d flags %x\n",
getpid(), n
, (cn
= msghdr
.msg_controllen
),
dumpit("control data:\n", control
, cn
);
fprintf(stderr
, "errno is %d\n", errno
);
dumpit("data:\n", readbuf
, n
);
n
= answerback(flags
, n
, ns
);
if (playtag
&& n
== sizeof(your_it
) && (flags
& MSG_EOR
)
&& bcmp(readbuf
, your_it
, n
) == 0) {
printf("Answering back!!!!\n");
answerback(flags
, n
, ns
);
answerback(flags
, n
, ns
);
msghdr
.msg_controllen
= 0;
n
= sendmsg(ns
, &msghdr
, flags
);
dbprintf("echoed %d\n", n
);
char *what
; unsigned short *where
; int n
;
unsigned short *s
= where
;
unsigned short *z
= where
+ (n
+1)/2;
printf("got %d records\n", records
);