?? xtrans.c
字號:
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;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -