break;
case ASOCKERR_BUSY:
result = MSGID(asyncsocket.busy) "Concurrent operations on socket";
+ break;
+ case ASOCKERR_PROXY_NEEDS_AUTHENTICATION:
+ result = MSGID(asyncsocket.proxyneedsauthentication)
+ "Proxy needs authentication";
+ break;
+ case ASOCKERR_PROXY_CONNECT_FAILED:
+ result = MSGID(asyncsocket.proxyconnectfailed)
+ "Connection failed through proxy";
+ break;
}
if (!result) {
sysErr, Err_Errno2String(sysErr));
/*
- * If "network unreachable" error happens, explicitly propogate
+ * If "network unreachable" or "No route to host"
+ * errors happens, explicitly propogate
* the error to trigger the reconnection if possible.
*/
- error = (sysErr == ASOCK_ENETUNREACH) ? ASOCKERR_NETUNREACH :
- ASOCKERR_CONNECT;
+ error = (sysErr == ASOCK_ENETUNREACH ||
+ sysErr == ASOCK_EHOSTUNREACH) ? ASOCKERR_NETUNREACH :
+ ASOCKERR_CONNECT;
goto errorHaveAsock;
}
} else {
if (optval != 0) {
s->genericErrno = optval;
TCPSOCKLOG(1, s, "connection SO_ERROR: %s\n", Err_Errno2String(optval));
-
- return ASOCKERR_GENERIC;
+ if (optval == ASOCK_ENETUNREACH || optval == ASOCK_EHOSTUNREACH) {
+ return ASOCKERR_NETUNREACH;
+ } else {
+ return ASOCKERR_CONNECT;
+ }
}
s->localAddrLen = sizeof s->localAddr;
AsyncTCPSocketAddRef(asock);
retval = AsyncTCPSocketConnectInternal(asock);
if (retval != ASOCKERR_SUCCESS) {
- ASSERT(retval == ASOCKERR_GENERIC); /* Only one we're expecting */
+ ASSERT(retval == ASOCKERR_GENERIC ||
+ retval == ASOCKERR_NETUNREACH ||
+ retval == ASOCKERR_CONNECT);
AsyncTCPSocketHandleError(asock, retval);
}
AsyncTCPSocketRelease(asock);
#define ASOCKERR_NETUNREACH 14
#define ASOCKERR_ADDRUNRESV 15
#define ASOCKERR_BUSY 16
+#define ASOCKERR_PROXY_NEEDS_AUTHENTICATION 17
+#define ASOCKERR_PROXY_CONNECT_FAILED 18
/*
* Cross-platform codes for AsyncSocket_GetGenericError():
#define ASOCK_ECONNRESET WSAECONNRESET
#define ASOCK_ECONNABORTED WSAECONNABORTED
#define ASOCK_EPIPE ERROR_NO_DATA
+#define ASOCK_EHOSTUNREACH WSAEHOSTUNREACH
#else
#define ASOCK_ENOTCONN ENOTCONN
#define ASOCK_ENOTSOCK ENOTSOCK
#define ASOCK_ECONNRESET ECONNRESET
#define ASOCK_ECONNABORTED ECONNABORTED
#define ASOCK_EPIPE EPIPE
+#define ASOCK_EHOSTUNREACH EHOSTUNREACH
#endif
/*