Beispiel #1
0
int
main(int argc, char **argv)
{
	int					fd;
	struct t_opthdr		*topt;
	struct t_optmgmt	*req, *ret;

	if (argc != 3)
		err_quit("usage: setbufs <device> <bufsiz>");

	fd = T_open(argv[1], O_RDWR, NULL);
	printf("Device = %s\n", argv[1]);
	T_bind(fd, NULL, NULL);

	req = T_alloc(fd, T_OPTMGMT, T_ALL);
	ret = T_alloc(fd, T_OPTMGMT, T_ALL);

	topt = (struct t_opthdr *) req->opt.buf;
	topt->level = XTI_GENERIC;
	topt->name = XTI_RCVBUF;
	topt->len = sizeof(struct t_opthdr) + sizeof(u_long);
	topt->status = 0;	/* ??? */
	req->opt.len = topt->len;
	*((u_long *) (topt + 1)) = atol(argv[2]);

#ifdef	notdef
	topt = OPT_NEXTHDR(req->opt.buf, req->opt.maxlen, topt);
	topt->level = XTI_GENERIC;
	topt->name = XTI_SNDBUF;
	topt->len = sizeof(struct t_opthdr) + sizeof(u_long);
	*((u_long *) (topt + 1)) = atol(argv[2]);
	req->opt.len += topt->len;
#endif

	req->flags = T_NEGOTIATE;
	T_optmgmt(fd, req, ret);
	printf("returned flags = %ld, len = %d\n", ret->flags, ret->opt.len);

	for (topt = (struct t_opthdr *) ret->opt.buf; topt != NULL;
		 topt = OPT_NEXTHDR(ret->opt.buf, ret->opt.len, topt)) {

		if (topt->level == XTI_GENERIC && topt->name == XTI_RCVBUF) {
			printf("RCVBUF = %ld, status = %ld\n",
				   *((u_long *) (topt + 1)), topt->status);

		} else if (topt->level == XTI_GENERIC && topt->name == XTI_SNDBUF) {
			printf("SNDBUF = %ld, status = %ld\n",
				   *((u_long *) (topt + 1)), topt->status);

		} else {
			printf("unexpected option: len = %ld, level = %ld, name = %ld\n",
				   topt->len, topt->level, topt->name);
		}
	}
	exit(0);
}
Beispiel #2
0
int main(int argc, char** argv)
{
    int fd;
    struct t_call* tcall;

    fd = T_open(XTI_TCP, O_RDWR, NULL);

    tcall = T_alloc(fd, T_CALL, T_ALL);
    printf("first t_alloc OK\n");

    tcall = T_alloc(fd, T_CALL, T_ADDR | T_OPT | T_UDATA);
    printf("second t_alloc OK\n");

    exit(0);
}
int
main(int argc, char **argv)
{
	int					tfd, flags;
	char				recvline[MAXLINE + 1];
	socklen_t			addrlen;
	struct t_unitdata	*sndptr, *rcvptr;

	if (argc != 3)
		err_quit("usage: daytimeudpcli <hostname> <service>");

	tfd = Udp_client(argv[1], argv[2], (void **) &sndptr, &addrlen);

	rcvptr = T_alloc(tfd, T_UNITDATA, T_ADDR);

	printf("sending to %s\n", Xti_ntop_host(&sndptr->addr));

	sndptr->udata.maxlen = MAXLINE;
	sndptr->udata.len = 1;
	sndptr->udata.buf = recvline;
	recvline[0] = 0;		/* 1-byte datagram containing null byte */
	T_sndudata(tfd, sndptr);

	rcvptr->udata.maxlen = MAXLINE;
	rcvptr->udata.buf = recvline;
	T_rcvudata(tfd, rcvptr, &flags);
	recvline[rcvptr->udata.len] = 0;	/* null terminate */
	printf("from %s: %s", Xti_ntop_host(&rcvptr->addr), recvline);

	exit(0);
}
Beispiel #4
0
int
main(int argc, char **argv)
{
	int					tfd, flags;
	char				buff[MAXLINE];
	time_t				ticks;
	struct t_unitdata	*tud;

	if (argc == 2)
		tfd = Udp_server(NULL, argv[1], NULL);
	else if (argc == 3)
		tfd = Udp_server(argv[1], argv[2], NULL);
	else
		err_quit("usage: daytimeudpsrv [ <host> ] <service or port>");

	tud = T_alloc(tfd, T_UNITDATA, T_ADDR);

	for ( ; ; ) {
		tud->udata.maxlen = MAXLINE;
		tud->udata.buf = buff;
		T_rcvudata(tfd, tud, &flags);
		printf("datagram from %s\n", Xti_ntop(&tud->addr));

        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
		tud->udata.len = strlen(buff);
        T_sndudata(tfd, tud);
	}
}
int
xti_getopt(int fd, int level, int name, void *optval, socklen_t *optlenp)
{
	int					rc, len;
	struct t_optmgmt	*req, *ret;
	struct t_opthdr		*topt;

	req = T_alloc(fd, T_OPTMGMT, T_ALL);
	ret = T_alloc(fd, T_OPTMGMT, T_ALL);
	if (req->opt.maxlen == 0)
		err_quit("xti_getopt: opt.maxlen == 0");

	topt = (struct t_opthdr *) req->opt.buf;
	topt->level = level;
	topt->name = name;
	topt->len = sizeof(struct t_opthdr);	/* just a t_opthdr{} */
	req->opt.len = topt->len;

	req->flags = T_CURRENT;
	if (t_optmgmt(fd, req, ret) < 0) {
		T_free(req, T_OPTMGMT);
		T_free(ret, T_OPTMGMT);
		return(-1);
	}
	rc = ret->flags;

	if (rc == T_SUCCESS || rc == T_READONLY) {
			/*4copy back value and length */
		topt = (struct t_opthdr *) ret->opt.buf;
		len = topt->len - sizeof(struct t_opthdr);
		len = min(len, *optlenp);
		memcpy(optval, topt+1, len);
		*optlenp = len;
	}

	T_free(req, T_OPTMGMT);
	T_free(ret, T_OPTMGMT);

	if (rc == T_SUCCESS || rc == T_READONLY)
		return(0);
	return(-1);		/* T_NOTSUPPORT */
}
int
main(int argc, char **argv)
{
	int					fd;

	if (argc != 2)
		err_quit("usage: checkopts <device>");

	fd = T_open(argv[1], O_RDWR, NULL);
	T_bind(fd, NULL, NULL);

	req = T_alloc(fd, T_OPTMGMT, T_ALL);
	ret = T_alloc(fd, T_OPTMGMT, T_ALL);

	xti_def_uchar_opt(fd, "T_IP_TOS", T_INET_IP, T_IP_TOS);
	xti_def_uchar_opt(fd, "T_IP_TTL", T_INET_IP, T_IP_TTL);

	xti_def_uscalar_opt(fd, "T_TCP_MAXSEG", T_INET_TCP, T_TCP_MAXSEG);
	xti_def_uscalar_opt(fd, "T_TCP_NODELAY", T_INET_TCP, T_TCP_NODELAY);

	exit(0);
}
Beispiel #7
0
int
main(int argc, char **argv)
{
	int					fd;

	if (argc != 2)
		err_quit("usage: checkopts <device>");

	fd = T_open(argv[1], O_RDWR, NULL);
	T_bind(fd, NULL, NULL);

	req = T_alloc(fd, T_OPTMGMT, T_ALL);
	ret = T_alloc(fd, T_OPTMGMT, T_ALL);

	xti_set_uchar_opt(fd, "T_IP_TOS", T_INET_IP, T_IP_TOS,
									SET_TOS(T_ROUTINE, T_LDELAY));
	xti_set_uchar_opt(fd, "T_IP_TTL", T_INET_IP, T_IP_TTL, 23);

	/* xti_def_ulong_opt(fd, "TCP_MAXSEG", INET_TCP, TCP_MAXSEG); */
	/* xti_def_ulong_opt(fd, "TCP_NODELAY", INET_TCP, TCP_NODELAY); */

	exit(0);
}
int
udp_client(const char *host, const char *serv, void **vptr, socklen_t *lenp)
{
	int					tfd;
	void				*handle;
	struct netconfig	*ncp;
	struct nd_hostserv	hs;
	struct nd_addrlist	*alp;
	struct netbuf		*np;
	struct t_unitdata	*tudptr;

	handle = Setnetpath();

	hs.h_host = (char *) host;
	hs.h_serv = (char *) serv;

	while ( (ncp = getnetpath(handle)) != NULL) {
		if (strcmp(ncp->nc_proto, "udp") != 0)
			continue;

		if (netdir_getbyname(ncp, &hs, &alp) != 0)
			continue;

		tfd = T_open(ncp->nc_device, O_RDWR, NULL);
	
		T_bind(tfd, NULL, NULL);

		tudptr = T_alloc(tfd, T_UNITDATA, T_ADDR);

		np = alp->n_addrs;				/* use first server address */
		tudptr->addr.len = min(tudptr->addr.maxlen, np->len);
		memcpy(tudptr->addr.buf, np->buf, tudptr->addr.len);
	
		endnetpath(handle);
		netdir_free(alp, ND_ADDRLIST);

		*vptr = tudptr;				/* return pointer to t_unitdata{} */
		*lenp = tudptr->addr.maxlen;/* and size of addresses */
		return(tfd);
	}
	endnetpath(handle);
	return(-1);
}
int
tcp_connect(const char *host, const char *serv)
{
	int					tfd, i;
	void				*handle;
	struct t_call		tcall;
	struct t_discon		tdiscon;
	struct netconfig	*ncp;
	struct nd_hostserv	hs;
	struct nd_addrlist	*alp;
	struct netbuf		*np;
	struct t_opthdr		*topt;

	handle = Setnetpath();

	hs.h_host = (char *) host;
	hs.h_serv = (char *) serv;

	while ( (ncp = getnetpath(handle)) != NULL) {
		if (strcmp(ncp->nc_proto, "tcp") != 0)
			continue;

		if (netdir_getbyname(ncp, &hs, &alp) != 0)
			continue;

				/* try each server address */
		for (i = 0, np = alp->n_addrs; i < alp->n_cnt; i++, np++) {
			tfd = T_open(ncp->nc_device, O_RDWR, NULL);
		
			T_bind(tfd, NULL, NULL);

			tcall.addr.len  = np->len;
			tcall.addr.buf  = np->buf;	/* pointer copy */
			tcall.opt.len   = 0;		/* no options */
			tcall.udata.len = 0;		/* no user data with connect */
		
			if (t_connect(tfd, &tcall, NULL) == 0) {
				endnetpath(handle);		/* success, connected to server */
				netdir_free(alp, ND_ADDRLIST);

				req = T_alloc(fd, T_OPTMGMT, T_ALL);
				ret = T_alloc(fd, T_OPTMGMT, T_ALL);

				topt = (struct t_opthdr *) req->opt.buf;
				topt->level = T_INET_TCP;
				topt->name = T_TCP_MAXSEG;
				topt->len = sizeof(struct t_opthdr) + sizeof(u_long);
				req->opt.len = topt->len;

				topt = OPT_NEXTHDR(req->opt.buf, req->opt.maxlen, topt);
				topt->level = XTI_GENERIC;
				topt->name = XTI_SNDBUF;
				topt->len = sizeof(struct t_opthdr) + sizeof(u_long);
				req->opt.len += topt->len;

				return(tfd);
			}

			if (t_errno == TLOOK && t_look(tfd) == T_DISCONNECT) {
				t_rcvdis(tfd, &tdiscon);
				errno = tdiscon.reason;
			}
			t_close(tfd);
		}
		netdir_free(alp, ND_ADDRLIST);
	}
	endnetpath(handle);
	return(-1);
}