* 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.5 (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
, echop
= 0, mynamep
, verbose
= 1, playtag
= 0;
long records
, intercept
= 0, confp
;
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]),
control
, sizeof(control
),
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
;
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
);
if (echop
&& (readbuf
[0] & 0x80)) {
dbprintf("Answering back!!!!\n");
} savebuf
= {&savebuf
, &savebuf
};
register struct savebuf
*s
= (struct savebuf
*)malloc(n
+ sizeof *s
);
insque(s
, savebuf
.s_prev
);
register struct savebuf
*s
= savebuf
.s_next
, *t
;
msghdr
.msg_controllen
= 0;
n
= sendmsg(ns
, &msghdr
, s
->s_flags
);
dbprintf("echoed %d\n", n
);
t
= s
; s
= s
->s_next
; remque(t
); free((char *)t
);
char *what
; unsigned short *where
; int n
;
unsigned short *s
= where
;
unsigned short *z
= where
+ (n
+1)/2;
printf("got %d records\n", records
);