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); }
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); }
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); }
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); }