* Copyright (c) 1988, 1990 Regents of the University of California.
* %sccs.include.redist.c%
static char sccsid
[] = "@(#)tisrc.c 7.1 (Berkeley) %G%";
* This is a test program to be a source for TP4 connections.
#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"); exit(1);}}
struct iso_addr eon
= {20, 0x47, 0, 6, 3, 0, 0, 0, 25 /*EGP for Berkeley*/};
struct sockaddr_iso to_s
= { sizeof(to_s
), AF_ISO
}, *to
= &to_s
;
fd_set readfds
, writefds
, exceptfds
;
int verbose
= 1, selectp
, type
= SOCK_SEQPACKET
, nobuffs
, errno
, playtag
= 0;
char your_it
[] = "You're it!";
char *port
, *conndata
, data_msg
[2048];
struct iovec iov
[1] = {data_msg
};
char cmdata
[128 - sizeof (struct cmsghdr
)];
struct msghdr msg
= { 0, 0, iov
, 1, 0, 0, 0};
register char **av
= argv
;
struct iso_addr
iso_addr();
if(strcmp(*av
,"Servername")==0) {
} else if(strcmp(*av
,"conndata")==0) {
} else if(strcmp(*av
,"host")==0) {
to_s
.siso_addr
= iso_addr(*av
);
} else if(strcmp(*av
,"port")==0) {
sscanf(*av
,"%hd",&portnumber
);
} else if(strcmp(*av
,"count")==0) {
sscanf(*av
,"%ld",&count
);
} else if(strcmp(*av
,"size")==0) {
} else if(strcmp(*av
,"stream")==0) {
} else if (strcmp(*av
,"eon") == 0) {
unsigned long l
, inet_addr();
l
= inet_addr(*++av
); argc
--;
bcopy((char *)&l
, &to_s
.siso_data
[15], 4);
to_s
.siso_tlen
= strlen(port
);
len
= 1 + to_s
.siso_nlen
+ strlen(port
)
+ sizeof(*to
) - sizeof(struct iso_addr
);
to
= (struct sockaddr_iso
*)malloc(len
);
bcopy(port
, TSEL(to
), strlen(port
));
to_s
.siso_tlen
= sizeof(portnumber
);
portnumber
= htons(portnumber
);
bcopy((char *)&portnumber
, TSEL(to
), sizeof(portnumber
));
int x
, s
, pid
, on
= 1, flags
= 8, n
;
try(socket
, (AF_ISO
, type
, 0),"");
/*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), "");*/
if (conndata
) doconndata(s
);
try(connect
, (s
, (struct sockaddr
*) to
, to
->siso_len
), "");
FD_ZERO(&writefds
); FD_SET(s
, &writefds
);
select(1, &writefds
, 0, 0, 0);
if (size
<= 0 && get_record(&flags
) == EOF
)
n
= put_record(s
, flags
);
if (n
==-1 && errno
== 55) {
fprintf(stderr
, "wrote %d < %d, count %d,",
iov
->iov_len
= sizeof your_it
;
sendmsg(s
, &msg
, MSG_EOR
);
sendmsg(s
, &msg
, MSG_EOR
);
iov
->iov_base
= data_msg
;
iov
->iov_len
= sizeof data_msg
;
try(recvmsg
, (s
, &msg
, flags
), " playtag ");
printf("looped %d times waiting for bufs\n", nobuffs
);
unsigned short *zp
, *zlim
;
if (msg
.msg_controllen
) {
zp
= (unsigned short *)&(cm
.cm
.cmhdr
.cmsg_len
);
printf("(CMessage Type is %x) ", cm
.cm
.cmhdr
.cmsg_type
);
zlim
= zp
+ ((x
+ 1) / 2);
while (zp
< zlim
) printf("%x ", *zp
++);
(flags
& MSG_OOB
? "(OOB Data)" : ""),
(flags
& MSG_EOR
? "(Record Mark)" : ""));
zp
= (unsigned short *)data_msg
;
zlim
= zp
+ ((x
+ 1) / 2);
while (zp
< zlim
) printf("%x ", *zp
++);
bcopy(iov
->iov_base
, dupbuf
, buflen
);
try(sendmsg
, (s
, &msg
, flags
), " put_record ");
while (verify
&& buflen
> 0) {
try(recvmsg
, (s
, &msg
, flags
), " put_record ");
printf("verify got %d\n", x
);
int *datasize
= &iov
->iov_len
;
datasize
= (int *)&msg
.msg_controllen
;
cplim
= cp
+ sizeof(cm
.cm
.cmdata
);
cm
.cm
.cmhdr
.cmsg_level
= SOL_TRANSPORT
;
cm
.cm
.cmhdr
.cmsg_type
= type
;
msg
.msg_control
= cm
.data
;
get_control_data(TPOPT_CONN_DATA
);
*datasize
= strlen(conndata
) + sizeof(cm
.cm
.cmhdr
);
cm
.cm
.cmhdr
.cmsg_len
= *datasize
;
bcopy(conndata
, cp
, *datasize
);
datasize
= &iov
->iov_len
;
cplim
= cp
+ sizeof(data_msg
);
x
= scanf("%s", workbuf
);
if (strcmp(workbuf
, "disc") == 0)
x
= get_control_data(TPOPT_DISC_DATA
);
else if (strcmp(workbuf
, "cfrm") == 0)
x
= get_control_data(TPOPT_CFRM_DATA
);
else if (strcmp(workbuf
, "oob") == 0)
else if (strcmp(workbuf
, "eom") == 0)
else if (strcmp(workbuf
, "factor") == 0) {
x
= scanf("%d", &factor
);
if (factor
<= 0) factor
= 1;
int len
= strlen(workbuf
);
if (datasize
!= &iov
->iov_len
) {
*datasize
+= sizeof(cm
.cm
.cmhdr
);
cm
.cm
.cmhdr
.cmsg_len
= *datasize
;