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);

yatex.org