--- 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.
].
"