?? xtranstli.c
字號:
TRANS(TLIOpenCOTSServer)(thistrans, protocol, host, port)Xtransport *thistrans;char *protocol;char *host;char *port;{ XtransConnInfo ciptr; int i; PRMSG(2,"TLIOpenCOTSServer(%s,%s,%s)\n", protocol, host, port ); if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 ) { PRMSG(1, "TLIOpenCOTSServer: Unable to determine device for %s\n", thistrans->TransName, 0,0 ); return NULL; } if( (ciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcotsname)) == NULL ) { PRMSG(1, "TLIOpenCOTSServer: Unable to open device for %s\n", thistrans->TransName, 0,0 ); return NULL; } /* Set the family type */ ciptr->family = TLItrans2devtab[i].family; /* Save the TLIFamily for later use in TLIAddrToNetbuf() lookups */ ciptr->index = i; return ciptr;}#endif /* TRANS_SERVER */#ifdef TRANS_CLIENTstatic XtransConnInfoTRANS(TLIOpenCLTSClient)(thistrans, protocol, host, port)Xtransport *thistrans;char *protocol;char *host;char *port;{ XtransConnInfo ciptr; int i; PRMSG(2,"TLIOpenCLTSClient(%s,%s,%s)\n", protocol, host, port ); if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 ) { PRMSG(1, "TLIOpenCLTSClient: Unable to determine device for %s\n", thistrans->TransName, 0,0 ); return NULL; } if( (ciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcltsname)) == NULL ) { PRMSG(1, "TLIOpenCLTSClient: Unable to open device for %s\n", thistrans->TransName, 0,0 ); return NULL; } if( TRANS(TLITLIBindLocal)(ciptr->fd,TLItrans2devtab[i].family,port) < 0 ) { PRMSG(1, "TLIOpenCLTSClient: ...TLITLIBindLocal() failed: %d\n", errno, 0,0 ); t_close(ciptr->fd); xfree(ciptr); return NULL; } if( TRANS(TLIGetAddr)(ciptr) < 0 ) { PRMSG(1, "TLIOpenCLTSClient: ...TLIGetPeerAddr() failed: %d\n", errno, 0,0 ); t_close(ciptr->fd); xfree(ciptr); return NULL; } return ciptr;} #endif /* TRANS_CLIENT */#ifdef TRANS_SERVERstatic XtransConnInfoTRANS(TLIOpenCLTSServer)(thistrans, protocol, host, port)Xtransport *thistrans;char *protocol;char *host;char *port;{ XtransConnInfo ciptr; int i; PRMSG(2,"TLIOpenCLTSServer(%s,%s,%s)\n", protocol, host, port ); if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 ) { PRMSG(1, "TLIOpenCLTSServer: Unable to determine device for %s\n", thistrans->TransName, 0,0 ); return NULL; } if( (ciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcltsname)) == NULL ) { PRMSG(1, "TLIOpenCLTSServer: Unable to open device for %s\n", thistrans->TransName, 0,0 ); return NULL; } return ciptr;} #endif /* TRANS_SERVER */#ifdef TRANS_REOPENstatic XtransConnInfoTRANS(TLIReopenCOTSServer)(thistrans, fd, port)Xtransport *thistrans;int fd;char *port;{ XtransConnInfo ciptr; int i; PRMSG(2,"TLIReopenCOTSServer(%d, %s)\n", fd, port, 0 ); if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 ) { PRMSG(1, "TLIReopenCOTSServer: Unable to determine device for %s\n", thistrans->TransName, 0,0 ); return NULL; } if( (ciptr=TRANS(TLIReopen)( TLItrans2devtab[i].devcotsname, fd, port)) == NULL ) { PRMSG(1, "TLIReopenCOTSServer: Unable to open device for %s\n", thistrans->TransName, 0,0 ); return NULL; } /* Save the TLIFamily for later use in TLIAddrToNetbuf() lookups */ ciptr->index = i; return ciptr;}static XtransConnInfoTRANS(TLIReopenCLTSServer)(thistrans, fd, port)Xtransport *thistrans;int fd;char *port;{ XtransConnInfo ciptr; int i; PRMSG(2,"TLIReopenCLTSServer(%d, %s)\n", fd, port, 0 ); if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 ) { PRMSG(1, "TLIReopenCLTSServer: Unable to determine device for %s\n", thistrans->TransName, 0,0 ); return NULL; } if( (ciptr=TRANS(TLIReopen)( TLItrans2devtab[i].devcltsname, fd, port)) == NULL ) { PRMSG(1, "TLIReopenCLTSServer: Unable to open device for %s\n", thistrans->TransName, 0,0 ); return NULL; } ciptr->index = i; return ciptr;} #endif /* TRANS_REOPEN */staticTRANS(TLISetOption)(ciptr, option, arg)XtransConnInfo ciptr;int option;int arg;{ PRMSG(2,"TLISetOption(%d,%d,%d)\n", ciptr->fd, option, arg ); return -1;}#ifdef TRANS_SERVERstaticTRANS(TLICreateListener)(ciptr, req)XtransConnInfo ciptr;struct t_bind *req;{ struct t_bind *ret; PRMSG(2,"TLICreateListener(%x->%d,%x)\n", ciptr, ciptr->fd, req ); if( (ret=(struct t_bind *)t_alloc(ciptr->fd,T_BIND,T_ALL)) == NULL ) { PRMSG(1, "TLICreateListener: failed to allocate a t_bind\n", 0,0,0 ); return TRANS_CREATE_LISTENER_FAILED; } if( t_bind(ciptr->fd, req, ret) < 0 ) { PRMSG(1, "TLICreateListener: t_bind failed\n", 0,0,0 ); t_free((char *)req,T_BIND); t_free((char *)ret,T_BIND); return TRANS_CREATE_LISTENER_FAILED; } if( memcmp(req->addr.buf,ret->addr.buf,req->addr.len) != 0 ) { PRMSG(1, "TLICreateListener: unable to bind to %x\n", req, 0,0 ); t_free((char *)req,T_BIND); t_free((char *)ret,T_BIND); return TRANS_ADDR_IN_USE; } /* * Everything looks good: fill in the XtransConnInfo structure. */ if( (ciptr->addr=(char *)xalloc(ret->addr.len)) == NULL ) { PRMSG(1, "TLICreateListener: Unable to allocate space for the address\n", 0,0,0 ); t_free((char *)req,T_BIND); t_free((char *)ret, T_BIND); return TRANS_CREATE_LISTENER_FAILED; } ciptr->addrlen=ret->addr.len; memcpy(ciptr->addr,ret->addr.buf,ret->addr.len); t_free((char *)req,T_BIND); t_free((char *)ret, T_BIND); return 0;}staticTRANS(TLIINETCreateListener)(ciptr, port)XtransConnInfo ciptr;char *port;{#define PORTBUFSIZE 64 /* what is a real size for this? */ char portbuf[PORTBUFSIZE]; struct t_bind *req; struct sockaddr_in *sinaddr; PRMSG(2,"TLIINETCreateListener(%x->%d,%s)\n", ciptr, ciptr->fd, port ? port : "NULL" ); #ifdef X11_t /* * X has a well known port, that is transport dependent. It is easier * to handle it here, than try and come up with a transport independent * representation that can be passed in and resolved the usual way. * * The port that is passed here is really a string containing the idisplay * from ConnectDisplay(). */ if (is_numeric (port)) { short tmpport = (short) atoi (port); sprintf(portbuf,"%d", X_TCP_PORT+tmpport ); } else strncpy(portbuf,port,PORTBUFSIZE); port=portbuf;#endif if( (req=(struct t_bind *)t_alloc(ciptr->fd,T_BIND,T_ALL)) == NULL ) { PRMSG(1, "TLIINETCreateListener: failed to allocate a t_bind\n", 0,0,0 ); return TRANS_CREATE_LISTENER_FAILED; } if( port && *port ) { if(TRANS(TLIAddrToNetbuf)(ciptr->index,HOST_SELF,port,&(req->addr)) < 0) { PRMSG(1, "TLIINETCreateListener: can't resolve name:HOST_SELF.%s\n", port, 0,0 ); t_free((char *)req,T_BIND); return TRANS_CREATE_LISTENER_FAILED; } } else { sinaddr=(struct sockaddr_in *)req->addr.buf; sinaddr->sin_family=AF_INET; sinaddr->sin_port=0; sinaddr->sin_addr.s_addr=0; } /* Set the qlen */ req->qlen=1; return TRANS(TLICreateListener)(ciptr, req);}staticTRANS(TLITLICreateListener)(ciptr, port)XtransConnInfo ciptr;char *port;{ struct t_bind *req; struct sockaddr_un *sunaddr; PRMSG(2,"TLITLICreateListener(%x->%d,%s)\n", ciptr, ciptr->fd, port ? port : "NULL"); if( (req=(struct t_bind *)t_alloc(ciptr->fd,T_BIND,0)) == NULL ) { PRMSG(1, "TLITLICreateListener: failed to allocate a t_bind\n", 0,0,0 ); return TRANS_CREATE_LISTENER_FAILED; } if( (sunaddr=(struct sockaddr_un *) malloc(sizeof(struct sockaddr_un))) == NULL ) { PRMSG(1, "TLITLICreateListener: failed to allocate a sockaddr_un\n", 0,0,0 ); t_free((char *)req,T_BIND); return TRANS_CREATE_LISTENER_FAILED; } sunaddr->sun_family=AF_UNIX; if( port && *port ) { if( *port == '/' ) { /* A full pathname */ (void) strcpy(sunaddr->sun_path, port); } else { (void) sprintf(sunaddr->sun_path,"%s%s", TLINODENAME, port ); } } else { (void) sprintf(sunaddr->sun_path,"%s%d", TLINODENAME, getpid()); } req->addr.buf=(char *)sunaddr; req->addr.len=sizeof(*sunaddr); req->addr.maxlen=sizeof(*sunaddr); /* Set the qlen */ req->qlen=1; return TRANS(TLICreateListener)(ciptr, req);}static XtransConnInfoTRANS(TLIAccept)(ciptr, status)XtransConnInfo ciptr;int *status;{ struct t_call *call; XtransConnInfo newciptr; int i; PRMSG(2,"TLIAccept(%x->%d)\n", ciptr, ciptr->fd, 0 ); if( (call=(struct t_call *)t_alloc(ciptr->fd,T_CALL,T_ALL)) == NULL ) { PRMSG(1, "TLIAccept() failed to allocate a t_call\n", 0,0,0 ); *status = TRANS_ACCEPT_BAD_MALLOC; return NULL; } if( t_listen(ciptr->fd,call) < 0 ) { extern char *t_errlist[]; extern int t_errno; PRMSG(1, "TLIAccept() t_listen() failed\n", 0,0,0 ); PRMSG(1, "TLIAccept: %s\n", t_errlist[t_errno], 0,0 ); t_free((char *)call,T_CALL); *status = TRANS_ACCEPT_MISC_ERROR; return NULL; } /* * Now we need to set up the new endpoint for the incoming connection. */ i=ciptr->index; /* Makes the next line more readable */ if( (newciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcotsname)) == NULL ) { PRMSG(1, "TLIAccept() failed to open a new endpoint\n", 0,0,0 ); t_free((char *)call,T_CALL); *status = TRANS_ACCEPT_MISC_ERROR; return NULL; } if( TRANS(TLITLIBindLocal)(newciptr->fd,TLItrans2devtab[i].family,"") < 0 ) { PRMSG(1, "TLIAccept: TRANS(TLITLIBindLocal)() failed: %d\n", errno, 0,0 ); t_free((char *)call,T_CALL); t_close(newciptr->fd); xfree(newciptr); *status = TRANS_ACCEPT_MISC_ERROR; return NULL; } if( t_accept(ciptr->fd,newciptr->fd,call) < 0 ) { extern char *t_errlist[]; extern int t_errno; PRMSG(1, "TLIAccept() t_accept() failed\n", 0,0,0 ); PRMSG(1, "TLIAccept: %s\n", t_errlist[t_errno], 0,0 ); t_free((char *)call,T_CALL); t_close(newciptr->fd); xfree(newciptr->addr); xfree(newciptr); *status = TRANS_ACCEPT_FAILED; return NULL; } t_free((char *)call,T_CALL); if( TRANS(TLIGetAddr)(newciptr) < 0 ) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -