Socket.st
changeset 3077 032905ddd57a
parent 3072 fbad791801f2
child 3123 55ef9ca4f09f
equal deleted inserted replaced
3076:a71f5a3d6226 3077:032905ddd57a
  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.
  2256             lastErrorNumber := err.
  2266             lastErrorNumber := err.
  2257             ^ false.
  2267             ^ false.
  2258         ].
  2268         ].
  2259     ].
  2269     ].
  2260 
  2270 
  2261 "/ Once we will raise an exception instead of returning false (and have to change some code above):
       
  2262 "/    err notNil ifTrue:[
       
  2263 "/        (OperatingSystem errorHolderForNumber:err) reportError.
       
  2264 "/    ].
       
  2265 
  2271 
  2266     peer := aSocketAddress.
  2272     peer := aSocketAddress.
  2267     port isNil ifTrue:[
  2273     port isNil ifTrue:[
  2268         "socket has not been explicitly bound,
  2274         "socket has not been explicitly bound,
  2269          after connect it has been bound implicitly - fetch the port"
  2275          after connect it has been bound implicitly - fetch the port"
  4213 ! !
  4219 ! !
  4214 
  4220 
  4215 !Socket class methodsFor:'documentation'!
  4221 !Socket class methodsFor:'documentation'!
  4216 
  4222 
  4217 version
  4223 version
  4218     ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.284 2013-08-07 16:10:06 cg Exp $'
  4224     ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.285 2013-08-09 14:40:47 cg Exp $'
  4219 !
  4225 !
  4220 
  4226 
  4221 version_CVS
  4227 version_CVS
  4222     ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.284 2013-08-07 16:10:06 cg Exp $'
  4228     ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.285 2013-08-09 14:40:47 cg Exp $'
  4223 ! !
  4229 ! !
  4224 
  4230