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

📄 xtrans.c

📁 手写识别Chinput源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	    int arg;	    arg = 1;	    ret = ioctl (fd, FIOSNBIO, &arg);	}#else#if (defined(AIXV3) || defined(uniosu) || defined(WIN32) || defined(__EMX__)) && defined(FIONBIO)	{	    int arg;	    arg = 1;/* IBM TCP/IP understands this option too well: it causes TRANS(Read) to fail * eventually with EWOULDBLOCK */#ifndef __EMX__	    ret = ioctl (fd, FIONBIO, &arg);#else/*	    ret = ioctl(fd, FIONBIO, &arg, sizeof(int));*/#endif	}#else#ifdef FNDELAY	    ret = fcntl (fd, F_SETFL, FNDELAY);#else	    ret = fcntl (fd, F_SETFL, O_NDELAY);#endif#endif /* AIXV3  || uniosu */#endif /* FIOSNBIO */#endif /* O_NONBLOCK */	    break;	default:	    /* Unknown option */	    break;	}	break;    case TRANS_CLOSEONEXEC:#ifdef F_SETFD#ifdef FD_CLOEXEC	ret = fcntl (fd, F_SETFD, FD_CLOEXEC);#else	ret = fcntl (fd, F_SETFD, 1);#endif /* FD_CLOEXEC */#endif /* F_SETFD */	break;    }        return ret;#endif /* MINIX */}#ifdef TRANS_SERVERintTRANS(CreateListener) (ciptr, port)XtransConnInfo	ciptr;char		*port;{    return ciptr->transptr->CreateListener (ciptr, port);}intTRANS(NoListen) (char * protocol)	{   Xtransport *trans;      if ((trans = TRANS(SelectTransport)(protocol)) == NULL)    {	PRMSG (1,"TRANS(TransNoListen): unable to find transport: %s\n", 	       protocol, 0, 0);	return -1;   }      trans->flags |= TRANS_NOLISTEN;   return 0;}intTRANS(ResetListener) (ciptr)XtransConnInfo	ciptr;{    if (ciptr->transptr->ResetListener)	return ciptr->transptr->ResetListener (ciptr);    else	return TRANS_RESET_NOOP;}XtransConnInfoTRANS(Accept) (ciptr, status)XtransConnInfo	ciptr;int		*status;{    XtransConnInfo	newciptr;    PRMSG (2,"Accept(%d)\n", ciptr->fd, 0, 0);    newciptr = ciptr->transptr->Accept (ciptr, status);    if (newciptr)	newciptr->transptr = ciptr->transptr;    return newciptr;}#endif /* TRANS_SERVER */#ifdef TRANS_CLIENTintTRANS(Connect) (ciptr, address)XtransConnInfo	ciptr;char		*address;{    char	*protocol;    char	*host;    char	*port;    int		ret;    PRMSG (2,"Connect(%d,%s)\n", ciptr->fd, address, 0);    if (TRANS(ParseAddress) (address, &protocol, &host, &port) == 0)    {	PRMSG (1,"Connect: Unable to Parse address %s\n",	       address, 0, 0);	return -1;    }    if (!port || !*port)    {	PRMSG (1,"Connect: Missing port specification in %s\n",	      address, 0, 0);	if (protocol) xfree (protocol);	if (host) xfree (host);	return -1;    }    ret = ciptr->transptr->Connect (ciptr, host, port);    if (protocol) xfree (protocol);    if (host) xfree (host);    if (port) xfree (port);        return ret;}#endif /* TRANS_CLIENT */intTRANS(BytesReadable) (ciptr, pend)XtransConnInfo	ciptr;BytesReadable_t	*pend;{    return ciptr->transptr->BytesReadable (ciptr, pend);}intTRANS(Read) (ciptr, buf, size)XtransConnInfo	ciptr;char		*buf;int		size;{    return ciptr->transptr->Read (ciptr, buf, size);}intTRANS(Write) (ciptr, buf, size)XtransConnInfo	ciptr;char		*buf;int		size;{    return ciptr->transptr->Write (ciptr, buf, size);}intTRANS(Readv) (ciptr, buf, size)XtransConnInfo	ciptr;struct iovec	*buf;int		size;{    return ciptr->transptr->Readv (ciptr, buf, size);}intTRANS(Writev) (ciptr, buf, size)XtransConnInfo	ciptr;struct iovec	*buf;int		size;{    return ciptr->transptr->Writev (ciptr, buf, size);}intTRANS(Disconnect) (ciptr)XtransConnInfo	ciptr;{    return ciptr->transptr->Disconnect (ciptr);}intTRANS(Close) (ciptr)XtransConnInfo	ciptr;{    int ret;    PRMSG (2,"Close(%d)\n", ciptr->fd, 0, 0);    ret = ciptr->transptr->Close (ciptr);    TRANS(FreeConnInfo) (ciptr);    return ret;}intTRANS(CloseForCloning) (ciptr)XtransConnInfo	ciptr;{    int ret;    PRMSG (2,"CloseForCloning(%d)\n", ciptr->fd, 0, 0);    ret = ciptr->transptr->CloseForCloning (ciptr);    TRANS(FreeConnInfo) (ciptr);    return ret;}intTRANS(IsLocal) (ciptr)XtransConnInfo	ciptr;{    return (ciptr->family == AF_UNIX);}intTRANS(GetMyAddr) (ciptr, familyp, addrlenp, addrp)XtransConnInfo	ciptr;int		*familyp;int		*addrlenp;Xtransaddr	**addrp;{    PRMSG (2,"GetMyAddr(%d)\n", ciptr->fd, 0, 0);    *familyp = ciptr->family;    *addrlenp = ciptr->addrlen;    if ((*addrp = (Xtransaddr *) xalloc (ciptr->addrlen)) == NULL)    {	PRMSG (1,"GetMyAddr: malloc failed\n", 0, 0, 0);	return -1;    }    memcpy(*addrp, ciptr->addr, ciptr->addrlen);    return 0;}intTRANS(GetPeerAddr) (ciptr, familyp, addrlenp, addrp)XtransConnInfo	ciptr;int		*familyp;int		*addrlenp;Xtransaddr	**addrp;{    PRMSG (2,"GetPeerAddr(%d)\n", ciptr->fd, 0, 0);    *familyp = ciptr->family;    *addrlenp = ciptr->peeraddrlen;    if ((*addrp = (Xtransaddr *) xalloc (ciptr->peeraddrlen)) == NULL)    {	PRMSG (1,"GetPeerAddr: malloc failed\n", 0, 0, 0);	return -1;    }    memcpy(*addrp, ciptr->peeraddr, ciptr->peeraddrlen);    return 0;}intTRANS(GetConnectionNumber) (ciptr)XtransConnInfo	ciptr;{    return ciptr->fd;}/* * These functions are really utility functions, but they require knowledge * of the internal data structures, so they have to be part of the Transport * Independant API. */static intcomplete_network_count (){    int count = 0;    int found_local = 0;    int i;    /*     * For a complete network, we only need one LOCALCONN transport to work     */    for (i = 0; i < NUMTRANS; i++)    {	if (Xtransports[i].transport->flags & TRANS_ALIAS   	 || Xtransports[i].transport->flags & TRANS_NOLISTEN)	    continue;	if (Xtransports[i].transport->flags & TRANS_LOCAL)	    found_local = 1;	else	    count++;    }    return (count + found_local);}#ifdef TRANS_SERVERintTRANS(MakeAllCOTSServerListeners) (port, partial, count_ret, ciptrs_ret)char		*port;int		*partial;int		*count_ret;XtransConnInfo 	**ciptrs_ret;{    char		buffer[256]; /* ??? What size ?? */    XtransConnInfo	ciptr, temp_ciptrs[NUMTRANS];    int			status, i, j;    PRMSG (2,"MakeAllCOTSServerListeners(%s,%x)\n",	   port ? port : "NULL", ciptrs_ret, 0);    *count_ret = 0;    for (i = 0; i < NUMTRANS; i++)    {	Xtransport *trans = Xtransports[i].transport;	if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN)	    continue;	sprintf(buffer,"%s/:%s", trans->TransName, port ? port : "");	PRMSG (5,"MakeAllCOTSServerListeners: opening %s\n",	       buffer, 0, 0);	if ((ciptr = TRANS(OpenCOTSServer(buffer))) == NULL)	{	    if (trans->flags & TRANS_DISABLED)		continue;	    PRMSG (1,	  "MakeAllCOTSServerListeners: failed to open listener for %s\n",		  trans->TransName, 0, 0);	    continue;	}	if ((status = TRANS(CreateListener (ciptr, port))) < 0)	{	    if (status == TRANS_ADDR_IN_USE)	    {		/*		 * We failed to bind to the specified address because the		 * address is in use.  It must be that a server is already		 * running at this address, and this function should fail.		 */		PRMSG (1,		"MakeAllCOTSServerListeners: server already running\n",		  0, 0, 0);		for (j = 0; j < *count_ret; j++)		    TRANS(Close) (temp_ciptrs[j]);		*count_ret = 0;		*ciptrs_ret = NULL;		*partial = 0;		return -1;	    }	    else	    {		PRMSG (1,	"MakeAllCOTSServerListeners: failed to create listener for %s\n",		  trans->TransName, 0, 0);		continue;	    }	}	PRMSG (5,	      "MakeAllCOTSServerListeners: opened listener for %s, %d\n",	      trans->TransName, ciptr->fd, 0);	temp_ciptrs[*count_ret] = ciptr;	(*count_ret)++;    }    *partial = (*count_ret < complete_network_count());    PRMSG (5,     "MakeAllCLTSServerListeners: partial=%d, actual=%d, complete=%d \n",	*partial, *count_ret, complete_network_count());    if (*count_ret > 0)    {	if ((*ciptrs_ret = (XtransConnInfo *) xalloc (	    *count_ret * sizeof (XtransConnInfo))) == NULL)	{	    return -1;	}	for (i = 0; i < *count_ret; i++)	{	    (*ciptrs_ret)[i] = temp_ciptrs[i];	}    }    else	*ciptrs_ret = NULL;     return 0;}intTRANS(MakeAllCLTSServerListeners) (port, partial, count_ret, ciptrs_ret)char		*port;int		*partial;int		*count_ret;XtransConnInfo 	**ciptrs_ret;{    char		buffer[256]; /* ??? What size ?? */    XtransConnInfo	ciptr, temp_ciptrs[NUMTRANS];    int			status, i, j;    PRMSG (2,"MakeAllCLTSServerListeners(%s,%x)\n",	port ? port : "NULL", ciptrs_ret, 0);    *count_ret = 0;    for (i = 0; i < NUMTRANS; i++)    {	Xtransport *trans = Xtransports[i].transport;	if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN)	    continue;	sprintf(buffer,"%s/:%s", trans->TransName, port ? port : "");	PRMSG (5,"MakeAllCLTSServerListeners: opening %s\n",	    buffer, 0, 0);	if ((ciptr = TRANS(OpenCLTSServer (buffer))) == NULL)	{	    PRMSG (1,	"MakeAllCLTSServerListeners: failed to open listener for %s\n",		  trans->TransName, 0, 0);	    continue;	}	if ((status = TRANS(CreateListener (ciptr, port))) < 0)	{	    if (status == TRANS_ADDR_IN_USE)	    {		/*		 * We failed to bind to the specified address because the		 * address is in use.  It must be that a server is already		 * running at this address, and this function should fail.		 */		PRMSG (1,		"MakeAllCLTSServerListeners: server already running\n",		  0, 0, 0);		for (j = 0; j < *count_ret; j++)		    TRANS(Close) (temp_ciptrs[j]);		*count_ret = 0;		*ciptrs_ret = NULL;		*partial = 0;		return -1;	    }	    else	    {		PRMSG (1,	"MakeAllCLTSServerListeners: failed to create listener for %s\n",		  trans->TransName, 0, 0);		continue;	    }	}	PRMSG (5,	"MakeAllCLTSServerListeners: opened listener for %s, %d\n",	      trans->TransName, ciptr->fd, 0);	temp_ciptrs[*count_ret] = ciptr;	(*count_ret)++;    }    *partial = (*count_ret < complete_network_count());    PRMSG (5,     "MakeAllCLTSServerListeners: partial=%d, actual=%d, complete=%d \n",	*partial, *count_ret, complete_network_count());    if (*count_ret > 0)    {	if ((*ciptrs_ret = (XtransConnInfo *) xalloc (	    *count_ret * sizeof (XtransConnInfo))) == NULL)	{	    return -1;	}	for (i = 0; i < *count_ret; i++)	{	    (*ciptrs_ret)[i] = temp_ciptrs[i];	}    }    else	*ciptrs_ret = NULL;        return 0;}#endif /* TRANS_SERVER *//* * These routines are not part of the X Transport Interface, but they * may be used by it. */#ifdef CRAY/* * Cray UniCOS does not have readv and writev so we emulate */static int TRANS(ReadV) (ciptr, iov, iovcnt)XtransConnInfo	ciptr;struct iovec 	*iov;int 		iovcnt;{    struct msghdr hdr;    hdr.msg_iov = iov;    hdr.msg_iovlen = iovcnt;    hdr.msg_accrights = 0;    hdr.msg_accrightslen = 0;    hdr.msg_name = 0;    hdr.msg_namelen = 0;    return (recvmsg (ciptr->fd, &hdr, 0));}static int TRANS(WriteV) (ciptr, iov, iovcnt)XtransConnInfo	ciptr;struct iovec 	*iov;int 		iovcnt;{    struct msghdr hdr;    hdr.msg_iov = iov;    hdr.msg_iovlen = iovcnt;    hdr.msg_accrights = 0;    hdr.msg_accrightslen = 0;    hdr.msg_name = 0;    hdr.msg_namelen = 0;    return (sendmsg (ciptr->fd, &hdr, 0));}#endif /* CRAY */#if (defined(SYSV) && defined(i386) && !defined(SCO325)) || defined(WIN32) || defined(__sxg__) || defined(__EMX__)/* * emulate readv */static int TRANS(ReadV) (ciptr, iov, iovcnt)XtransConnInfo	ciptr;struct iovec 	*iov;int 		iovcnt;{    int i, len, total;    char *base;    ESET(0);    for (i = 0, total = 0;  i < iovcnt;  i++, iov++) {	len = iov->iov_len;	base = iov->iov_base;	while (len > 0) {	    register int nbytes;	    nbytes = TRANS(Read) (ciptr, base, len);	    if (nbytes < 0 && total == 0)  return -1;	    if (nbytes <= 0)  return total;	    ESET(0);	    len   -= nbytes;	    total += nbytes;	    base  += nbytes;	}    }    return total;}#endif /* SYSV && i386 || WIN32 || __sxg__ */#if (defined(SYSV) && defined(i386) && !defined(SCO325)) || defined(WIN32) || defined(__sxg__) || defined(__EMX__)/* * emulate writev */static int TRANS(WriteV) (ciptr, iov, iovcnt)XtransConnInfo	ciptr;struct iovec 	*iov;int 		iovcnt;{    int i, len, total;    char *base;    ESET(0);    for (i = 0, total = 0;  i < iovcnt;  i++, iov++) {	len = iov->iov_len;	base = iov->iov_base;	while (len > 0) {	    register int nbytes;	    nbytes = TRANS(Write) (ciptr, base, len);	    if (nbytes < 0 && total == 0)  return -1;	    if (nbytes <= 0)  return total;	    ESET(0);	    len   -= nbytes;	    total += nbytes;	    base  += nbytes;	}    }    return total;}#endif /* SYSV && i386 || WIN32 || __sxg__ */#if (defined(_POSIX_SOURCE) && !defined(AIXV3)) || defined(hpux) || defined(USG) || defined(SVR4) || defined(SCO)#ifndef NEED_UTSNAME#define NEED_UTSNAME#endif#include <sys/utsname.h>#endif/* * TRANS(GetHostname) - similar to gethostname but allows special processing. */int TRANS(GetHostname) (buf, maxlen)char *buf;int maxlen;{    int len;#ifdef NEED_UTSNAME    struct utsname name;    uname (&name);    len = strlen (name.nodename);    if (len >= maxlen) len = maxlen - 1;    strncpy (buf, name.nodename, len);    buf[len] = '\0';#else    buf[0] = '\0';    (void) gethostname (buf, maxlen);    buf [maxlen - 1] = '\0';    len = strlen(buf);#endif /* NEED_UTSNAME */    return len;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -