* Copyright (c) 1988, 1990 Regents of the University of California.
* %sccs.include.redist.c%
static char sccsid
[] = "@(#)tisink.c 7.5 (Berkeley) %G%";
* This is a test program to be a sink for ISO packets.
#include <netiso/tp_param.h>
#include <netiso/tp_user.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_iso faddr
, laddr
= { sizeof(laddr
), AF_ISO
};
struct sockaddr_iso
*siso
= &laddr
;
long size
, count
= 10, forkp
, confp
, echop
, mynamep
, verbose
= 1, playtag
= 0;
long records
, intercept
= 0, isode_mode
= 0, dgramp
= 0;
char your_it
[] = "You're it!";
register char **av
= argv
;
struct iso_addr
*iso_addr();
if(strcmp(*av
,"Servername")==0) {
} else if (strcmp(*av
,"host")==0) {
laddr
.siso_addr
= *iso_addr(*av
);
} else if (strcmp(*av
,"count")==0) {
sscanf(*av
,"%ld",&count
);
} else if (strcmp(*av
,"port")==0) {
} else if (strcmp(*av
,"size")==0) {
} else if (strcmp(*av
, "intercept")==0) {
int tlen
= laddr
.siso_tlen
= strlen(Servername
);
int len
= TSEL(siso
) + tlen
- (caddr_t
) &siso
;
if (len
> sizeof(*siso
)) {
siso
= (struct sockaddr_iso
*)malloc(len
);
bcopy(Servername
, TSEL(siso
), tlen
);
laddr
.siso_tlen
= sizeof(port
);
bcopy((char *)&port
, TSEL(siso
), sizeof(port
));
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
, ns
;
int socktype
= (dgramp
? SOCK_DGRAM
: SOCK_SEQPACKET
);
int addrlen
= sizeof(faddr
);
try(socket
, (AF_ISO
, socktype
, 0),"");
try(bind
, (s
, (struct sockaddr
*) siso
, siso
->siso_len
), "");
/*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */
(s
, SOL_TRANSPORT
, TPOPT_INTERCEPT
, &on
, sizeof(on
)), "");
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
;
cbuf
.cm
.cmhdr
.cmsg_len
= sizeof (cbuf
.cm
.cmhdr
);
cbuf
.cm
.cmhdr
.cmsg_level
= SOL_TRANSPORT
;
cbuf
.cm
.cmhdr
.cmsg_type
= TPOPT_CFRM_DATA
;
n
= sendmsg(ns
, &msghdr
, 0);
printf("confirm: errno is %d\n", errno
);
{"/usr/sbin/isod.tsap", fdbuf
, "", 0};
sprintf(fdbuf
, "Z%d", ns
);
old_isod_main(3, nargv
, xenvp
);
msghdr
.msg_controllen
= sizeof(control
);
msghdr
.msg_namelen
= (dgramp
? (sizeof name
) : 0);
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
), flags
);
if (dgramp
&& msghdr
.msg_namelen
&& verbose
)
dumpit("from:\n", name
, msghdr
.msg_namelen
);
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
);