Socket.st
changeset 3615 ffe86e1b14ed
parent 3614 a950d8f8c4ce
child 3616 0a1001b5c867
--- a/Socket.st	Tue Sep 29 18:24:17 2015 +0200
+++ b/Socket.st	Tue Sep 29 19:04:44 2015 +0200
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
  COPYRIGHT (c) 1992 by Claus Gittinger
 	      All Rights Reserved
@@ -2394,10 +2396,14 @@
      On error, the unix error code is left in the lastErrorNumber
      instance variable."
 
-    ^ self receiveFrom:anAddressBuffer buffer:aDataBuffer start:1 for:(aDataBuffer size)
+    ^ self receiveFrom:anAddressBuffer buffer:aDataBuffer start:1 for:(aDataBuffer size) flags:0
 !
 
 receiveFrom:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes
+    ^ self receiveFrom:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes flags:0
+!
+
+receiveFrom:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes flags:flags
     "receive datagramm data
      - put address of originating host into anAddressBuffer, data into aBuffer.
      For backward compatibility, the addressBuffer may be a non-SocketAddress;
@@ -2434,9 +2440,9 @@
         SOCKET sock;
         INT objSize;
         union sockaddr_u sa;
-        unsigned INT alen = 0;
+        socklen_t alen = 0;
         INT n, offs;
-        INT flags = 0;
+        int _flags = __longIntVal(flags);
         char *extPtr;
         unsigned char *allocatedBuffer = NULL;
         unsigned char *buffer = NULL;
@@ -2459,7 +2465,7 @@
         do {
             __threadErrno = 0;
             alen = sizeof(sa);
-            n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, flags, (struct sockaddr *)&sa, &alen);
+            n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, _flags, (struct sockaddr *)&sa, &alen);
         } while ((n < 0) && (__threadErrno == EINTR));
         if (n < 0) {
             errno = __threadErrno;
@@ -2476,9 +2482,9 @@
         do {
             alen = sizeof(sa);
             if (extPtr) {
-                n = recvfrom(sock, extPtr + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
+                n = recvfrom(sock, extPtr + offs, objSize, _flags, (struct sockaddr *) &sa, &alen);
             } else {
-                n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
+                n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, (struct sockaddr *) &sa, &alen);
             }
         } while ((n < 0) && (errno == EINTR));
         __END_INTERRUPTABLE__
@@ -2556,73 +2562,68 @@
     if ((fp != nil)
      && __isSmallInteger(startIndex)
      && __isSmallInteger(nBytes)) {
-	SOCKET sock;
-	INT objSize;
-	INT n;
-	char *extPtr;
-	INT _flags = 0;
-	INT offs;
-	unsigned long norder;
-	unsigned char *buffer;
-	unsigned char *allocatedBuffer = NULL;
-
-	_flags = __longIntVal(flags);
-
-	sock = SOCKET_FROM_FILE_OBJECT(fp);
-
-	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
-	if (__isSmallInteger(nBytes)) {
-	    if (__intVal(nBytes) < objSize) {
-		objSize = __intVal(nBytes);
-	    }
-	}
+        SOCKET sock;
+        INT objSize, n, offs;
+        char *extPtr;
+        int _flags = __longIntVal(flags);
+        unsigned long norder;
+        unsigned char *buffer, *allocatedBuffer = NULL;
+
+        sock = SOCKET_FROM_FILE_OBJECT(fp);
+
+        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
+        if (__isSmallInteger(nBytes)) {
+            if (__intVal(nBytes) < objSize) {
+                objSize = __intVal(nBytes);
+            }
+        }
 
 # ifdef DGRAM_DEBUG
-	console_printf("sending %d bytes ...\n", nBytes);
+        console_printf("sending %d bytes ...\n", nBytes);
 # endif
 
 #ifdef DO_WRAP_CALLS
-	if (extPtr) {
-	    buffer = extPtr + offs;
-	} else {
-	    allocatedBuffer = buffer = (char *)malloc(objSize);
-	    bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
-	}
-
-	do {
-	    __threadErrno = 0;
-	    n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
-	} while ((n < 0) && (__threadErrno == EINTR));
-	if (n < 0) {
-	    errno = __threadErrno;
-	}
-
-	if (allocatedBuffer) {
-	    free(allocatedBuffer);
-	}
+        if (extPtr) {
+            buffer = extPtr + offs;
+        } else {
+            allocatedBuffer = buffer = (char *)malloc(objSize);
+            bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
+        }
+
+        do {
+            __threadErrno = 0;
+            n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
+        } while ((n < 0) && (__threadErrno == EINTR));
+        if (n < 0) {
+            errno = __threadErrno;
+        }
+
+        if (allocatedBuffer) {
+            free(allocatedBuffer);
+        }
 #else
-	__BEGIN_INTERRUPTABLE__
-	do {
-	    if (extPtr) {
-		n = send(sock, extPtr + offs, objSize, _flags);
-	    } else {
-		n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
-	    }
-	} while ((n < 0) && (errno == EINTR));
-	__END_INTERRUPTABLE__
+        __BEGIN_INTERRUPTABLE__
+        do {
+            if (extPtr) {
+                n = send(sock, extPtr + offs, objSize, _flags);
+            } else {
+                n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
+            }
+        } while ((n < 0) && (errno == EINTR));
+        __END_INTERRUPTABLE__
 #endif
 
-	if (n < 0) {
-	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
-	} else {
-	    RETURN (__MKSMALLINT(n));
-	}
+        if (n < 0) {
+            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
+        } else {
+            RETURN (__MKSMALLINT(n));
+        }
     }
 #endif
 bad: ;
 %}.
     error notNil ifTrue:[
-	self writeError:error.
+        self writeError:error.
     ].
 
     "
@@ -2670,16 +2671,16 @@
     |domainClass addr error|
 
     (anAddressBuffer isKindOf:SocketAddress) ifTrue:[
-	addr := anAddressBuffer.
+        addr := anAddressBuffer.
     ] ifFalse:[
-	anAddressBuffer isByteArray ifFalse:[
-	    ^ self error:'bad socketAddress argument'
-	].
-	domainClass := self class socketAddressClassForDomain:domain.
-	domainClass isNil ifTrue:[
-	    ^ self error:'invalid (unsupported) domain'.
-	].
-	addr := domainClass hostAddress:anAddressBuffer.
+        anAddressBuffer isByteArray ifFalse:[
+            ^ self error:'bad socketAddress argument'
+        ].
+        domainClass := self class socketAddressClassForDomain:domain.
+        domainClass isNil ifTrue:[
+            ^ self error:'invalid (unsupported) domain'.
+        ].
+        addr := domainClass hostAddress:anAddressBuffer.
     ].
 %{
 #ifndef NO_SOCKET
@@ -2688,92 +2689,90 @@
     if ((fp != nil)
      && __isSmallInteger(startIndex)
      && __isSmallInteger(nBytes)) {
-	SOCKET sock;
-	INT objSize;
-	struct sockaddr *sockaddr_ptr;
-	union sockaddr_u sa;
-	INT alen = 0;
-	INT sockAddrOffs, sockaddr_size;
-	INT n;
-	char *extPtr;
-	INT _flags = 0;
-	INT offs;
-	unsigned long norder;
-	unsigned char *buffer;
-	unsigned char *allocatedBuffer = NULL;
-
-	_flags = __longIntVal(flags);
-	sock = SOCKET_FROM_FILE_OBJECT(fp);
-
-	if (! __isBytes(addr)) {
-	    sockaddr_size = 0;
-	    sockaddr_ptr = (struct sockaddr *)0;
-	} else {
-	    int nIndex;
-	    OBJ cls;
-
-	    sockAddrOffs = 0;
-	    if ((cls = __qClass(addr)) != @global(ByteArray))
-		sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-	    nIndex = __qSize(addr) - OHDR_SIZE;
-	    sockaddr_size = nIndex - sockAddrOffs;
-	    if (sockaddr_size > sizeof(sa)) {
-		console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
-		goto bad;
-	    }
-	    memcpy(&sa, (__byteArrayVal(addr) + sockAddrOffs), sockaddr_size);
-	    sockaddr_ptr = (struct sockaddr *)(&sa);
-	}
-
-	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
-	if (__isSmallInteger(nBytes)) {
-	    if (__intVal(nBytes) < objSize) {
-		objSize = __intVal(nBytes);
-	    }
-	}
+        SOCKET sock;
+        INT objSize;
+        struct sockaddr *sockaddr_ptr;
+        union sockaddr_u sa;
+        socklen_t sockaddr_size, alen = 0;
+        INT sockAddrOffs; 
+        INT n, offs;
+        char *extPtr;
+        int _flags = __longIntVal(flags);
+        unsigned long norder;
+        unsigned char *buffer;
+        unsigned char *allocatedBuffer = NULL;
+
+        sock = SOCKET_FROM_FILE_OBJECT(fp);
+
+        if (! __isBytes(addr)) {
+            sockaddr_size = 0;
+            sockaddr_ptr = (struct sockaddr *)0;
+        } else {
+            int nIndex;
+            OBJ cls;
+
+            sockAddrOffs = 0;
+            if ((cls = __qClass(addr)) != @global(ByteArray))
+                sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+            nIndex = __qSize(addr) - OHDR_SIZE;
+            sockaddr_size = nIndex - sockAddrOffs;
+            if (sockaddr_size > sizeof(sa)) {
+                console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
+                goto bad;
+            }
+            memcpy(&sa, (__byteArrayVal(addr) + sockAddrOffs), sockaddr_size);
+            sockaddr_ptr = (struct sockaddr *)(&sa);
+        }
+
+        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
+        if (__isSmallInteger(nBytes)) {
+            if (__intVal(nBytes) < objSize) {
+                objSize = __intVal(nBytes);
+            }
+        }
 
 #ifdef DO_WRAP_CALLS
-	if (extPtr) {
-	    buffer = extPtr + offs;
-	} else {
-	    allocatedBuffer = buffer = (char *)malloc(objSize);
-	    bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
-	}
-
-	do {
-	    __threadErrno = 0;
-	    n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
-	} while ((n < 0) && (__threadErrno == EINTR));
-	if (n < 0) {
-	    errno = __threadErrno;
-	}
-
-	if (allocatedBuffer) {
-	    free(allocatedBuffer);
-	}
+        if (extPtr) {
+            buffer = extPtr + offs;
+        } else {
+            allocatedBuffer = buffer = (char *)malloc(objSize);
+            bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
+        }
+
+        do {
+            __threadErrno = 0;
+            n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
+        } while ((n < 0) && (__threadErrno == EINTR));
+        if (n < 0) {
+            errno = __threadErrno;
+        }
+
+        if (allocatedBuffer) {
+            free(allocatedBuffer);
+        }
 #else
-	__BEGIN_INTERRUPTABLE__
-	do {
-	    if (extPtr) {
-		n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
-	    } else {
-		n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
-	    }
-	} while ((n < 0) && (errno == EINTR));
-	__END_INTERRUPTABLE__
+        __BEGIN_INTERRUPTABLE__
+        do {
+            if (extPtr) {
+                n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
+            } else {
+                n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
+            }
+        } while ((n < 0) && (errno == EINTR));
+        __END_INTERRUPTABLE__
 #endif
 
-	if (n < 0) {
-	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
-	} else {
-	    RETURN (__MKSMALLINT(n));
-	}
+        if (n < 0) {
+            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
+        } else {
+            RETURN (__MKSMALLINT(n));
+        }
     }
 #endif
 bad: ;
 %}.
     error notNil ifTrue:[
-	self writeError:error.
+        self writeError:error.
     ].
 
     "