?? xtranstli.c
字號:
PRMSG(1, "TLIAccept: TRANS(TLIGetPeerAddr)() failed: %d\n", errno, 0,0 ); t_close(newciptr->fd); xfree(newciptr); *status = TRANS_ACCEPT_MISC_ERROR; return NULL; } if( TRANS(TLIGetPeerAddr)(newciptr) < 0 ) { PRMSG(1, "TLIAccept: TRANS(TLIGetPeerAddr)() failed: %d\n", errno, 0,0 ); t_close(newciptr->fd); xfree(newciptr->addr); xfree(newciptr); *status = TRANS_ACCEPT_MISC_ERROR; return NULL; } if( ioctl(newciptr->fd, I_POP,"timod") < 0 ) { PRMSG(1, "TLIAccept() ioctl(I_POP, \"timod\") failed %d\n", errno,0,0 ); t_close(newciptr->fd); xfree(newciptr->addr); xfree(newciptr); *status = TRANS_ACCEPT_MISC_ERROR; return NULL; } if( ioctl(newciptr->fd, I_PUSH,"tirdwr") < 0 ) { PRMSG(1, "TLIAccept() ioctl(I_PUSH,\"tirdwr\") failed %d\n", errno,0,0 ); t_close(newciptr->fd); xfree(newciptr->addr); xfree(newciptr); *status = TRANS_ACCEPT_MISC_ERROR; return NULL; } *status = 0; return newciptr;}#endif /* TRANS_SERVER */#ifdef TRANS_CLIENTstaticTRANS(TLIConnect)(ciptr, sndcall )XtransConnInfo ciptr;struct t_call *sndcall;{ PRMSG(2, "TLIConnect(%x->%d,%x)\n", ciptr, ciptr->fd, sndcall); if( t_connect(ciptr->fd,sndcall,NULL) < 0 ) { extern char *t_errlist[]; extern int t_errno; PRMSG(1, "TLIConnect() t_connect() failed\n", 0,0,0 ); PRMSG(1, "TLIConnect: %s\n", t_errlist[t_errno], 0,0 ); t_free((char *)sndcall,T_CALL); if (t_errno == TLOOK && t_look(ciptr->fd) == T_DISCONNECT) { t_rcvdis(ciptr->fd,NULL); return TRANS_TRY_CONNECT_AGAIN; } else return TRANS_CONNECT_FAILED; } t_free((char *)sndcall,T_CALL); /* * Sync up the address fields of ciptr. */ if( TRANS(TLIGetAddr)(ciptr) < 0 ) { PRMSG(1, "TLIConnect: ...TLIGetAddr() failed: %d\n", errno, 0,0 ); return TRANS_CONNECT_FAILED; } if( TRANS(TLIGetPeerAddr)(ciptr) < 0 ) { PRMSG(1, "TLIConnect: ...TLIGetPeerAddr() failed: %d\n", errno, 0,0 ); return TRANS_CONNECT_FAILED; } if( ioctl(ciptr->fd, I_POP,"timod") < 0 ) { PRMSG(1, "TLIConnect() ioctl(I_POP,\"timod\") failed %d\n", errno,0,0 ); return TRANS_CONNECT_FAILED; } if( ioctl(ciptr->fd, I_PUSH,"tirdwr") < 0 ) { PRMSG(1, "TLIConnect() ioctl(I_PUSH,\"tirdwr\") failed %d\n", errno,0,0 ); return TRANS_CONNECT_FAILED; } return 0;}staticTRANS(TLIINETConnect)(ciptr, host, port)XtransConnInfo ciptr;char *host;char *port;{#define PORTBUFSIZE 64 /* what is a real size for this? */ char portbuf[PORTBUFSIZE]; struct t_call *sndcall; PRMSG(2, "TLIINETConnect(%s,%s)\n", host, port, 0); #ifdef X11_t /* * X has a well known port, that is transport dependant. 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#endif strncpy(portbuf,port,PORTBUFSIZE); if( (sndcall=(struct t_call *)t_alloc(ciptr->fd,T_CALL,T_ALL)) == NULL ) { PRMSG(1, "TLIINETConnect() failed to allocate a t_call\n", 0,0,0 ); return TRANS_CONNECT_FAILED; } if( TRANS(TLIAddrToNetbuf)(ciptr->index, host, portbuf, &(sndcall->addr) ) < 0 ) { PRMSG(1, "TLIINETConnect() unable to resolve name:%s.%s\n", host, portbuf, 0 ); t_free((char *)sndcall,T_CALL); return TRANS_CONNECT_FAILED; } return TRANS(TLIConnect)(ciptr, sndcall );}staticTRANS(TLITLIConnect)(ciptr, host, port)XtransConnInfo ciptr;char *host;char *port;{ struct t_call *sndcall; struct sockaddr_un *sunaddr; PRMSG(2, "TLITLIConnect(%s,%s)\n", host, port, 0); if( (sndcall=(struct t_call *)t_alloc(ciptr->fd,T_CALL,T_OPT|T_UDATA)) == NULL ) { PRMSG(1, "TLITLIConnect() failed to allocate a t_call\n", 0,0,0 ); return TRANS_CONNECT_FAILED; } if( (sunaddr=(struct sockaddr_un *) malloc(sizeof(struct sockaddr_un))) == NULL ) { PRMSG(1, "TLITLIConnect: failed to allocate a sockaddr_un\n", 0,0,0 ); t_free((char *)sndcall,T_CALL); return TRANS_CONNECT_FAILED; } sunaddr->sun_family=AF_UNIX; if( *port == '/' || strncmp (port, TLINODENAME, strlen (TLINODENAME)) == 0) { /* Use the port as is */ (void) strcpy(sunaddr->sun_path, port); } else { (void) sprintf(sunaddr->sun_path,"%s%s", TLINODENAME, port ); } sndcall->addr.buf=(char *)sunaddr; sndcall->addr.len=sizeof(*sunaddr); sndcall->addr.maxlen=sizeof(*sunaddr); return TRANS(TLIConnect)(ciptr, sndcall );}#endif /* TRANS_CLIENT */staticTRANS(TLIBytesReadable)(ciptr, pend)XtransConnInfo ciptr;BytesReadable_t *pend;{ int ret; struct pollfd filedes; PRMSG(2, "TLIByteReadable(%x->%d,%x)\n", ciptr, ciptr->fd, pend ); /* * This function should detect hangup conditions. Use poll to check * if no data is present. On SVR4, the M_HANGUP message sits on the * streams head, and ioctl(N_READ) keeps returning 0 because there is * no data available. The hangup goes undetected, and the client hangs. */ ret=ioctl(ciptr->fd, I_NREAD, (char *)pend); if( ret != 0 ) return ret; /* Data present or error */ /* Zero data, or POLLHUP message */ filedes.fd=ciptr->fd; filedes.events=POLLIN; ret=poll(&filedes, 1, 0); if( ret == 0 ) { *pend=0; return 0; /* Really, no data */ } if( ret < 0 ) return -1; /* just pass back the error */ if( filedes.revents & (POLLHUP|POLLERR) ) /* check for hangup */ return -1; /* Should only get here if data arrived after the first ioctl() */ return ioctl(ciptr->fd, I_NREAD, (char *)pend);}staticTRANS(TLIRead)(ciptr, buf, size)XtransConnInfo ciptr;char *buf;int size;{ PRMSG(2, "TLIRead(%d,%x,%d)\n", ciptr->fd, buf, size ); return read(ciptr->fd,buf,size);}staticTRANS(TLIWrite)(ciptr, buf, size)XtransConnInfo ciptr;char *buf;int size;{ PRMSG(2, "TLIWrite(%d,%x,%d)\n", ciptr->fd, buf, size ); return write(ciptr->fd,buf,size);}staticTRANS(TLIReadv)(ciptr, buf, size)XtransConnInfo ciptr;struct iovec *buf;int size;{ PRMSG(2, "TLIReadv(%d,%x,%d)\n", ciptr->fd, buf, size ); return READV(ciptr,buf,size);}staticTRANS(TLIWritev)(ciptr, buf, size)XtransConnInfo ciptr;struct iovec *buf;int size;{ PRMSG(2, "TLIWritev(%d,%x,%d)\n", ciptr->fd, buf, size ); return WRITEV(ciptr,buf,size);}staticTRANS(TLIDisconnect)(ciptr)XtransConnInfo ciptr;{ PRMSG(2, "TLIDisconnect(%x->%d)\n", ciptr, ciptr->fd, 0 ); /* * Restore the TLI modules so that the connection can be properly shutdown. * This avoids the situation where a connection goes into the TIME_WAIT * state, and the address remains unavailable for a while. */ ioctl(ciptr->fd, I_POP,"tirdwr"); ioctl(ciptr->fd, I_PUSH,"timod"); t_snddis(ciptr->fd,NULL); return 0;}staticTRANS(TLIClose)(ciptr)XtransConnInfo ciptr;{ PRMSG(2, "TLIClose(%x->%d)\n", ciptr, ciptr->fd, 0 ); t_unbind(ciptr->fd); return (t_close(ciptr->fd));}staticTRANS(TLICloseForCloning)(ciptr)XtransConnInfo ciptr;{ /* * Don't unbind. */ PRMSG(2, "TLICloseForCloning(%x->%d)\n", ciptr, ciptr->fd, 0 ); return (t_close(ciptr->fd));}Xtransport TRANS(TLITCPFuncs) = { /* TLI Interface */ "tcp", 0,#ifdef TRANS_CLIENT TRANS(TLIOpenCOTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(TLIOpenCOTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(TLIOpenCLTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(TLIOpenCLTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_REOPEN TRANS(TLIReopenCOTSServer), TRANS(TLIReopenCLTSServer),#endif TRANS(TLISetOption),#ifdef TRANS_SERVER TRANS(TLIINETCreateListener), NULL, /* ResetListener */ TRANS(TLIAccept),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(TLIINETConnect),#endif /* TRANS_CLIENT */ TRANS(TLIBytesReadable), TRANS(TLIRead), TRANS(TLIWrite), TRANS(TLIReadv), TRANS(TLIWritev), TRANS(TLIDisconnect), TRANS(TLIClose), TRANS(TLICloseForCloning),};Xtransport TRANS(TLIINETFuncs) = { /* TLI Interface */ "inet", TRANS_ALIAS,#ifdef TRANS_CLIENT TRANS(TLIOpenCOTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(TLIOpenCOTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(TLIOpenCLTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(TLIOpenCLTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_REOPEN TRANS(TLIReopenCOTSServer), TRANS(TLIReopenCLTSServer),#endif TRANS(TLISetOption),#ifdef TRANS_SERVER TRANS(TLIINETCreateListener), NULL, /* ResetListener */ TRANS(TLIAccept),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(TLIINETConnect),#endif /* TRANS_CLIENT */ TRANS(TLIBytesReadable), TRANS(TLIRead), TRANS(TLIWrite), TRANS(TLIReadv), TRANS(TLIWritev), TRANS(TLIDisconnect), TRANS(TLIClose), TRANS(TLICloseForCloning),};Xtransport TRANS(TLITLIFuncs) = { /* TLI Interface */ "tli", 0,#ifdef TRANS_CLIENT TRANS(TLIOpenCOTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(TLIOpenCOTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(TLIOpenCLTSClient),#endif /* TRANS_CLIENT */#ifdef TRANS_SERVER TRANS(TLIOpenCLTSServer),#endif /* TRANS_SERVER */#ifdef TRANS_REOPEN TRANS(TLIReopenCOTSServer), TRANS(TLIReopenCLTSServer),#endif TRANS(TLISetOption),#ifdef TRANS_SERVER TRANS(TLITLICreateListener), NULL, /* ResetListener */ TRANS(TLIAccept),#endif /* TRANS_SERVER */#ifdef TRANS_CLIENT TRANS(TLITLIConnect),#endif /* TRANS_CLIENT */ TRANS(TLIBytesReadable), TRANS(TLIRead), TRANS(TLIWrite), TRANS(TLIReadv), TRANS(TLIWritev), TRANS(TLIDisconnect), TRANS(TLIClose), TRANS(TLICloseForCloning),};
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -