Mercurial > hgrepos > hgweb.cgi > imapext
diff src/osdep/unix/tcp_unix.c @ 3:2366b362676d draft
imap-2007f
author | HIROSE Yuuji <yuuji@gentei.org> |
---|---|
date | Thu, 30 Oct 2014 00:00:57 +0900 |
parents | 28a55bc1110c |
children | d741b3ecc917 |
line wrap: on
line diff
--- a/src/osdep/unix/tcp_unix.c Mon Sep 14 20:06:41 2009 +0900 +++ b/src/osdep/unix/tcp_unix.c Thu Oct 30 00:00:57 2014 +0900 @@ -239,7 +239,7 @@ size_t len; time_t now; struct protoent *pt = getprotobyname ("tcp"); - fd_set fds,efds; + fd_set rfds,wfds,efds; struct timeval tmo; struct sockaddr *sadr = ip_sockaddr (family,adr,adrlen,port,&len); blocknotify_t bn = (blocknotify_t) mail_parameters (NIL,GET_BLOCKNOTIFY,NIL); @@ -285,13 +285,15 @@ now = time (0); /* open timeout */ ti = ttmo_open ? now + ttmo_open : 0; tmo.tv_usec = 0; - FD_ZERO (&fds); /* initialize selection vector */ + FD_ZERO (&rfds); /* initialize selection vector */ + FD_ZERO (&wfds); /* initialize selection vector */ FD_ZERO (&efds); /* handle errors too */ - FD_SET (sock,&fds); /* block for error or readable */ + FD_SET (sock,&rfds); /* block for error or readable or writable */ + FD_SET (sock,&wfds); FD_SET (sock,&efds); do { /* block under timeout */ tmo.tv_sec = ti ? ti - now : 0; - i = select (sock+1,&fds,NIL,&efds,ti ? &tmo : NIL); + i = select (sock+1,&rfds,&wfds,&efds,ti ? &tmo : NIL); now = time (0); /* fake timeout if interrupt & time expired */ if ((i < 0) && (errno == EINTR) && ti && (ti <= now)) i = 0; } while ((i < 0) && (errno == EINTR)); @@ -300,7 +302,7 @@ fcntl (sock,F_SETFL,flgs); /* This used to be a zero-byte read(), but that crashes Solaris */ /* get socket status */ - while (((i = *ctr = read (sock,tmp,1)) < 0) && (errno == EINTR)); + if(FD_ISSET(sock, &rfds)) while (((i = *ctr = read (sock,tmp,1)) < 0) && (errno == EINTR)); } if (i <= 0) { /* timeout or error? */ i = i ? errno : ETIMEDOUT;/* determine error code */ @@ -818,20 +820,6 @@ return stream->localhost; /* return local host name */ } -/* Get $TCPREMOTEHOST || $TCPREMOTEHOST - * If invoked via tcpserver or couriertcpd, consult $TCPREMOTEHOST - * or $TCPREMOTEIP - */ -char* gettcpremoteip() -{ - if (getenv("TCPREMOTEHOST") && strcmp("0", getenv("TCPREMOTEHOST"))) { - return getenv("TCPREMOTEHOST"); - } else if (getenv("TCPREMOTEIP")) { - return getenv("TCPREMOTEIP"); - } - return "NON-IPv4"; -} - /* TCP/IP get client host address (server calls only) * Returns: client host address */ @@ -862,15 +850,6 @@ if (!myClientHost) { size_t sadrlen; struct sockaddr *sadr = ip_newsockaddr (&sadrlen); -#ifdef INET6 - if (getenv("TCPREMOTEIP")) { - myClientHost = - cpystr((getenv("TCPREMOTEHOST") - && strcasecmp("UNKNOWN", getenv("TCPREMOTEHOST"))) - ? getenv("TCPREMOTEHOST") - : getenv("TCPREMOTEIP")); - } else -#endif if (getpeername (0,sadr,(void *) &sadrlen)) { char *s,*t,*v,tmp[MAILTMPLEN]; if ((s = getenv (t = "SSH_CLIENT")) || @@ -934,8 +913,7 @@ size_t sadrlen; struct sockaddr *sadr = ip_newsockaddr (&sadrlen); /* get stdin's name */ - if (getsockname (0,sadr,(void *) &sadrlen) || - (myServerPort = ip_sockaddrtoport (sadr)) < 0) + if (getsockname (0,sadr,(void *) &sadrlen)) myServerHost = cpystr (mylocalhost ()); else { /* get stdin's name */ myServerHost = tcp_name (sadr,NIL);