2138 int on = 1; |
2138 int on = 1; |
2139 int sockaddr_size; |
2139 int sockaddr_size; |
2140 |
2140 |
2141 if (!__isNonNilObject(aSocketAddress) || !__isBytes(aSocketAddress)) { |
2141 if (!__isNonNilObject(aSocketAddress) || !__isBytes(aSocketAddress)) { |
2142 DBGPRINTF(("SOCKET: invalid socketAddress\n")); |
2142 DBGPRINTF(("SOCKET: invalid socketAddress\n")); |
2143 RETURN (false); |
2143 err = @symbol(argumentError); |
|
2144 goto out; |
2144 } |
2145 } |
2145 |
2146 |
2146 { |
2147 { |
2147 int sockAddrOffs, nIndex; |
2148 int sockAddrOffs = 0; |
2148 OBJ cls; |
2149 int nIndex =__byteArraySize(aSocketAddress); |
2149 |
2150 OBJ cls = __qClass(aSocketAddress); |
2150 sockAddrOffs = 0; |
2151 |
2151 if ((cls = __qClass(aSocketAddress)) != @global(ByteArray)) |
2152 //if (cls != @global(ByteArray)) |
2152 sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars)); |
2153 // sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars)); |
2153 nIndex = __qSize(aSocketAddress) - OHDR_SIZE; |
|
2154 sockaddr_size = nIndex - sockAddrOffs; |
2154 sockaddr_size = nIndex - sockAddrOffs; |
2155 if (sockaddr_size > sizeof(sa)) { |
2155 if (sockaddr_size > sizeof(sa)) { |
2156 console_fprintf(stderr, "Socket: bad socketAddr\n"); |
2156 DBGPRINTF(("SOCKET: invalid (short) socketAddress\n")); |
2157 RETURN (false); |
2157 err = @symbol(argumentError); |
|
2158 goto out; |
2158 } |
2159 } |
2159 bcopy((__byteArrayVal(aSocketAddress) + sockAddrOffs), &sa, sockaddr_size); |
2160 memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size); |
2160 } |
2161 } |
2161 |
2162 |
2162 sock = SOCKET_FROM_FILE_OBJECT(fp); |
2163 sock = SOCKET_FROM_FILE_OBJECT(fp); |
2163 |
2164 |
2164 # if defined(O_NONBLOCK) |
2165 # if defined(O_NONBLOCK) && !defined(WIN32) |
2165 # if !defined(WIN32) |
|
2166 /* |
2166 /* |
2167 * set to non-blocking and wait later |
2167 * set to non-blocking and wait later |
2168 */ |
2168 */ |
2169 oldFlags = fcntl(sock, F_GETFL, 0); |
2169 oldFlags = fcntl(sock, F_GETFL, 0); |
2170 /* on SUNOS4.x, would use fcntl(osfd, F_SETFL, flags | FNDELAY); */ |
2170 /* on SUNOS4.x, would use fcntl(osfd, F_SETFL, flags | FNDELAY); */ |
2171 fcntl(sock, F_SETFL, oldFlags | O_NONBLOCK); |
2171 fcntl(sock, F_SETFL, oldFlags | O_NONBLOCK); |
2172 # endif |
|
2173 # endif |
2172 # endif |
2174 |
2173 |
2175 /* |
2174 /* |
2176 * connect |
2175 * connect |
2177 */ |
2176 */ |
2178 # ifdef DO_WRAP_CALLS |
2177 # if defined(DO_WRAP_CALLS) |
2179 /* __setWrapCallDebugging(1,1); */ |
2178 // __setWrapCallDebugging(1,1); |
2180 |
2179 |
2181 do { |
2180 do { |
2182 DBGFPRINTF((stderr, "SOCKET: connect...\n")); |
2181 DBGFPRINTF((stderr, "SOCKET: (sock=%d) connect...\n", sock)); |
2183 __threadErrno = 0; |
2182 ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size); |
2184 ret = (INT)STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size); |
|
2185 DBGFPRINTF((stderr, "SOCKET: connect(%d) -> %"_ld_" (%d)\n", sock, (INT)ret, __threadErrno)); |
2183 DBGFPRINTF((stderr, "SOCKET: connect(%d) -> %"_ld_" (%d)\n", sock, (INT)ret, __threadErrno)); |
2186 } while ((ret < 0) && (__threadErrno == EINTR)); |
2184 } while ((ret < 0) && (__threadErrno == EINTR)); |
2187 /* __setWrapCallDebugging(1,0); */ |
2185 if (ret < 0) { |
|
2186 errno = __threadErrno; |
|
2187 } |
|
2188 |
|
2189 // __setWrapCallDebugging(1,0); |
2188 # else |
2190 # else |
2189 __BEGIN_INTERRUPTABLE__ |
2191 __BEGIN_INTERRUPTABLE__ |
2190 do { |
2192 do { |
2191 ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size); |
2193 ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size); |
2192 } while ((ret < 0) |
2194 } while ((ret < 0) |
2228 for (i=0; i<sockaddr_size; i++) { |
2230 for (i=0; i<sockaddr_size; i++) { |
2229 console_printf(" %02x\n", *cp++); |
2231 console_printf(" %02x\n", *cp++); |
2230 } |
2232 } |
2231 } |
2233 } |
2232 # endif |
2234 # endif |
2233 err = __INST(lastErrorNumber) = __MKSMALLINT(errno); |
2235 err = __MKSMALLINT(errno); |
2234 RETURN (false); |
|
2235 } |
2236 } |
2236 } |
2237 } |
2237 |
2238 |
2238 # if defined(O_NONBLOCK) |
2239 # if defined(O_NONBLOCK) && !defined(WIN32) |
2239 # if !defined(WIN32) |
|
2240 fcntl(sock, F_SETFL, oldFlags); |
2240 fcntl(sock, F_SETFL, oldFlags); |
2241 # endif |
|
2242 # endif |
2241 # endif |
2243 |
2242 |
2244 # else /* NO_SOCKET */ |
2243 # else /* NO_SOCKET */ |
2245 RETURN (false); |
2244 err = @symbol(notSupported); |
2246 # endif /* NO_SOCKET */ |
2245 # endif /* NO_SOCKET */ |
|
2246 out:; |
2247 %}. |
2247 %}. |
|
2248 |
|
2249 err notNil ifTrue:[ |
|
2250 err isSymbol ifTrue:[ |
|
2251 self primitiveFailed:err. |
|
2252 ]. |
|
2253 lastErrorNumber := err. |
|
2254 ^ false. |
|
2255 "/ Once we will raise an exception instead of returning false (and have to change some code above): |
|
2256 "/ (OperatingSystem errorHolderForNumber:err) reportError. |
|
2257 ]. |
2248 isAsync == true ifTrue:[ |
2258 isAsync == true ifTrue:[ |
2249 (self writeWaitWithTimeoutMs:timeout) ifTrue:[ |
2259 (self writeWaitWithTimeoutMs:timeout) ifTrue:[ |
2250 "/ a timeout occured |
2260 "/ a timeout occured |
2251 "/ should I cancel the connect? |
2261 "/ should I cancel the connect? |
2252 ^ false. |
2262 ^ false. |