⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xtranstli.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -