comparison 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
comparison
equal deleted inserted replaced
2:fc6002700ecd 3:2366b362676d
237 { 237 {
238 int i,ti,sock,flgs; 238 int i,ti,sock,flgs;
239 size_t len; 239 size_t len;
240 time_t now; 240 time_t now;
241 struct protoent *pt = getprotobyname ("tcp"); 241 struct protoent *pt = getprotobyname ("tcp");
242 fd_set fds,efds; 242 fd_set rfds,wfds,efds;
243 struct timeval tmo; 243 struct timeval tmo;
244 struct sockaddr *sadr = ip_sockaddr (family,adr,adrlen,port,&len); 244 struct sockaddr *sadr = ip_sockaddr (family,adr,adrlen,port,&len);
245 blocknotify_t bn = (blocknotify_t) mail_parameters (NIL,GET_BLOCKNOTIFY,NIL); 245 blocknotify_t bn = (blocknotify_t) mail_parameters (NIL,GET_BLOCKNOTIFY,NIL);
246 /* fetid Solaris */ 246 /* fetid Solaris */
247 void *data = (*bn) (BLOCK_SENSITIVE,NIL); 247 void *data = (*bn) (BLOCK_SENSITIVE,NIL);
283 } 283 }
284 if ((sock >= 0) && ctr) { /* want open timeout? */ 284 if ((sock >= 0) && ctr) { /* want open timeout? */
285 now = time (0); /* open timeout */ 285 now = time (0); /* open timeout */
286 ti = ttmo_open ? now + ttmo_open : 0; 286 ti = ttmo_open ? now + ttmo_open : 0;
287 tmo.tv_usec = 0; 287 tmo.tv_usec = 0;
288 FD_ZERO (&fds); /* initialize selection vector */ 288 FD_ZERO (&rfds); /* initialize selection vector */
289 FD_ZERO (&wfds); /* initialize selection vector */
289 FD_ZERO (&efds); /* handle errors too */ 290 FD_ZERO (&efds); /* handle errors too */
290 FD_SET (sock,&fds); /* block for error or readable */ 291 FD_SET (sock,&rfds); /* block for error or readable or writable */
292 FD_SET (sock,&wfds);
291 FD_SET (sock,&efds); 293 FD_SET (sock,&efds);
292 do { /* block under timeout */ 294 do { /* block under timeout */
293 tmo.tv_sec = ti ? ti - now : 0; 295 tmo.tv_sec = ti ? ti - now : 0;
294 i = select (sock+1,&fds,NIL,&efds,ti ? &tmo : NIL); 296 i = select (sock+1,&rfds,&wfds,&efds,ti ? &tmo : NIL);
295 now = time (0); /* fake timeout if interrupt & time expired */ 297 now = time (0); /* fake timeout if interrupt & time expired */
296 if ((i < 0) && (errno == EINTR) && ti && (ti <= now)) i = 0; 298 if ((i < 0) && (errno == EINTR) && ti && (ti <= now)) i = 0;
297 } while ((i < 0) && (errno == EINTR)); 299 } while ((i < 0) && (errno == EINTR));
298 if (i > 0) { /* success, make sure really connected */ 300 if (i > 0) { /* success, make sure really connected */
299 /* restore blocking status */ 301 /* restore blocking status */
300 fcntl (sock,F_SETFL,flgs); 302 fcntl (sock,F_SETFL,flgs);
301 /* This used to be a zero-byte read(), but that crashes Solaris */ 303 /* This used to be a zero-byte read(), but that crashes Solaris */
302 /* get socket status */ 304 /* get socket status */
303 while (((i = *ctr = read (sock,tmp,1)) < 0) && (errno == EINTR)); 305 if(FD_ISSET(sock, &rfds)) while (((i = *ctr = read (sock,tmp,1)) < 0) && (errno == EINTR));
304 } 306 }
305 if (i <= 0) { /* timeout or error? */ 307 if (i <= 0) { /* timeout or error? */
306 i = i ? errno : ETIMEDOUT;/* determine error code */ 308 i = i ? errno : ETIMEDOUT;/* determine error code */
307 close (sock); /* flush socket */ 309 close (sock); /* flush socket */
308 sock = -1; 310 sock = -1;
816 fs_give ((void **) &sadr); 818 fs_give ((void **) &sadr);
817 } 819 }
818 return stream->localhost; /* return local host name */ 820 return stream->localhost; /* return local host name */
819 } 821 }
820 822
821 /* Get $TCPREMOTEHOST || $TCPREMOTEHOST
822 * If invoked via tcpserver or couriertcpd, consult $TCPREMOTEHOST
823 * or $TCPREMOTEIP
824 */
825 char* gettcpremoteip()
826 {
827 if (getenv("TCPREMOTEHOST") && strcmp("0", getenv("TCPREMOTEHOST"))) {
828 return getenv("TCPREMOTEHOST");
829 } else if (getenv("TCPREMOTEIP")) {
830 return getenv("TCPREMOTEIP");
831 }
832 return "NON-IPv4";
833 }
834
835 /* TCP/IP get client host address (server calls only) 823 /* TCP/IP get client host address (server calls only)
836 * Returns: client host address 824 * Returns: client host address
837 */ 825 */
838 826
839 char *tcp_clientaddr () 827 char *tcp_clientaddr ()
860 char *tcp_clienthost () 848 char *tcp_clienthost ()
861 { 849 {
862 if (!myClientHost) { 850 if (!myClientHost) {
863 size_t sadrlen; 851 size_t sadrlen;
864 struct sockaddr *sadr = ip_newsockaddr (&sadrlen); 852 struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
865 #ifdef INET6
866 if (getenv("TCPREMOTEIP")) {
867 myClientHost =
868 cpystr((getenv("TCPREMOTEHOST")
869 && strcasecmp("UNKNOWN", getenv("TCPREMOTEHOST")))
870 ? getenv("TCPREMOTEHOST")
871 : getenv("TCPREMOTEIP"));
872 } else
873 #endif
874 if (getpeername (0,sadr,(void *) &sadrlen)) { 853 if (getpeername (0,sadr,(void *) &sadrlen)) {
875 char *s,*t,*v,tmp[MAILTMPLEN]; 854 char *s,*t,*v,tmp[MAILTMPLEN];
876 if ((s = getenv (t = "SSH_CLIENT")) || 855 if ((s = getenv (t = "SSH_CLIENT")) ||
877 (s = getenv (t = "KRB5REMOTEADDR")) || 856 (s = getenv (t = "KRB5REMOTEADDR")) ||
878 (s = getenv (t = "SSH2_CLIENT"))) { 857 (s = getenv (t = "SSH2_CLIENT"))) {
932 { 911 {
933 if (!myServerHost) { /* once-only */ 912 if (!myServerHost) { /* once-only */
934 size_t sadrlen; 913 size_t sadrlen;
935 struct sockaddr *sadr = ip_newsockaddr (&sadrlen); 914 struct sockaddr *sadr = ip_newsockaddr (&sadrlen);
936 /* get stdin's name */ 915 /* get stdin's name */
937 if (getsockname (0,sadr,(void *) &sadrlen) || 916 if (getsockname (0,sadr,(void *) &sadrlen))
938 (myServerPort = ip_sockaddrtoport (sadr)) < 0)
939 myServerHost = cpystr (mylocalhost ()); 917 myServerHost = cpystr (mylocalhost ());
940 else { /* get stdin's name */ 918 else { /* get stdin's name */
941 myServerHost = tcp_name (sadr,NIL); 919 myServerHost = tcp_name (sadr,NIL);
942 if (!myServerAddr) myServerAddr = cpystr (ip_sockaddrtostring (sadr)); 920 if (!myServerAddr) myServerAddr = cpystr (ip_sockaddrtostring (sadr));
943 if (myServerPort < 0) myServerPort = ip_sockaddrtoport (sadr); 921 if (myServerPort < 0) myServerPort = ip_sockaddrtoport (sadr);

yatex.org