Mercurial > hgrepos > hgweb.cgi > imapext
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); |