accept: do not wait for input on non-connected socket.
authorStefan Vogel <sv@exept.de>
Mon, 11 Mar 1996 23:56:13 +0100
changeset 208 c3eca2cc16dc
parent 207 e9f6913dc380
child 209 2152fceba563
accept: do not wait for input on non-connected socket.
Socket.st
--- a/Socket.st	Fri Mar 08 22:20:31 1996 +0100
+++ b/Socket.st	Mon Mar 11 23:56:13 1996 +0100
@@ -10,7 +10,7 @@
  hereby transferred.
 "
 
-'From Smalltalk/X, Version:2.10.9 on 5-mar-1996 at 00:24:04'                    !
+'From Smalltalk/X, Version:2.10.9 on 11-mar-1996 at 14:38:28'                   !
 
 NonPositionableExternalStream subclass:#Socket
 	instanceVariableNames:'domain socketType protocol port serviceName peerName'
@@ -1339,117 +1339,10 @@
      This method will suspend the current process if no connection is waiting.
      Return the true if ok; false if not."
 
-    self readWait.
+    aSocket readWait.
     ^ self blockingAcceptOn:aSocket
-!
-
-blockingAcceptOn:aSocket
-    "accept a connection on a server port (created with:'Socket>>onIPPort:')
-     usage is: (Socket basicNew acceptOn:(Socket onIPPort:9999)).
-     Return the true if ok; false if not.
-
-     NOTICE: this method will block, if no connection is already pending.
-	     use readWait or Socket>>accept."
-
-    |serverSocketFd|
-
-    filePointer notNil ifTrue:[
-	^ self error:'already connected'
-    ].
-
-    domain := aSocket domain.
-    socketType := aSocket type.
-    serverSocketFd := aSocket fileDescriptor.
-    serverSocketFd isNil ifTrue:[
-	^ self error:'invalid server socket'
-    ].
-    (serverSocketFd isMemberOf:SmallInteger) ifFalse:[
-	^ self error:'invalid server socket'
-    ].
-%{
-    FILE *fp;
-    int flags;
-    int sock, newSock;
-    union {
-	struct sockaddr_in in ;
-	struct sockaddr_un un ;
-    } sa;
-    int alen;
-    struct hostent *he ;
-    char dotted[20] ;
-
-    sock = _intVal(serverSocketFd);
-
-#if defined(O_NDELAY) && defined(SET_NDELAY)
-    flags = ioctl(sock, F_GETFL, 0);
-    ioctl(sock, F_SETFL, flags | O_NDELAY);
-#endif
-    __BEGIN_INTERRUPTABLE__
-    do {
-	alen = sizeof(sa) ;
-	newSock = accept(sock, (struct sockaddr *) &sa, &alen);
-    } while ((newSock < 0) && (errno == EINTR));
-    __END_INTERRUPTABLE__
-
-#if defined(O_NDELAY) && defined(SET_NDELAY)
-    ioctl(sock, F_SETFL, flags);
-#endif
 
-    if (newSock < 0) {
-	DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno));
-	_INST(lastErrorNumber) = _MKSMALLINT(errno);
-	RETURN (false);
-    }
-
-    /*
-     * extract the partners address
-     */
-#ifdef AF_INET
-    if (_INST(domain) == @symbol(inet)) {
-	he = gethostbyaddr((char *) &sa.in.sin_addr.s_addr, alen, AF_INET) ;
-	if (! he) {
-	    unsigned long norder;
-
-	    norder = htonl(sa.in.sin_addr.s_addr) ;
-	    sprintf(dotted, "%d.%d.%d.%d",
-		    (norder >> 24) & 0xFF,
-		    (norder >> 16) & 0xFF,
-		    (norder >> 8) & 0xFF,
-		    norder & 0xFF);
-	}
-	DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
-	_INST(peerName) = _MKSTRING((he ? he->h_name : dotted) COMMA_CON);
-    }
-#endif
-#ifdef AF_UNIX
-    if (_INST(domain) == @symbol(unix)) {
-	DBGPRINTF(("SOCKET: accepted connection on unix socket\n")) ;
-	/* nothing to be done here */
-    }
-#endif
-
-    /* 
-     * make it a FILE * 
-     */
-    fp = fdopen(newSock, "r+");
-    if (! fp) {
-	DBGPRINTF(("SOCKET: fdopen call failed\n"));
-	_INST(lastErrorNumber) = _MKSMALLINT(errno);
-	close(newSock);
-	RETURN (false);
-    } else {
-#ifdef NO_BUFFER 
-	setbuf(fp, NULL);
-	_INST(buffered) = false;
-#endif
-	_INST(filePointer) = __MKOBJ(fp);
-    }
-%}.
-    mode := #readwrite.
-    Lobby register:self.
-    binary := false.
-    port := aSocket port.
-    ^ true
+    "Modified: 11.3.1996 / 14:21:31 / stefan"
 !
 
 bindTo:aSocketAddress 
@@ -1622,6 +1515,115 @@
     "
 !
 
+blockingAcceptOn:aSocket
+    "accept a connection on a server port (created with:'Socket>>onIPPort:')
+     usage is: (Socket basicNew acceptOn:(Socket onIPPort:9999)).
+     Return the true if ok; false if not.
+
+     NOTICE: this method will block, if no connection is already pending.
+	     use readWait or Socket>>accept."
+
+    |serverSocketFd|
+
+    filePointer notNil ifTrue:[
+	^ self error:'already connected'
+    ].
+
+    domain := aSocket domain.
+    socketType := aSocket type.
+    serverSocketFd := aSocket fileDescriptor.
+    serverSocketFd isNil ifTrue:[
+	^ self error:'invalid server socket'
+    ].
+    (serverSocketFd isMemberOf:SmallInteger) ifFalse:[
+	^ self error:'invalid server socket'
+    ].
+%{
+    FILE *fp;
+    int flags;
+    int sock, newSock;
+    union {
+	struct sockaddr_in in ;
+	struct sockaddr_un un ;
+    } sa;
+    int alen;
+    struct hostent *he ;
+    char dotted[20] ;
+
+    sock = _intVal(serverSocketFd);
+
+#if defined(O_NDELAY) && defined(SET_NDELAY)
+    flags = ioctl(sock, F_GETFL, 0);
+    ioctl(sock, F_SETFL, flags | O_NDELAY);
+#endif
+    __BEGIN_INTERRUPTABLE__
+    do {
+	alen = sizeof(sa) ;
+	newSock = accept(sock, (struct sockaddr *) &sa, &alen);
+    } while ((newSock < 0) && (errno == EINTR));
+    __END_INTERRUPTABLE__
+
+#if defined(O_NDELAY) && defined(SET_NDELAY)
+    ioctl(sock, F_SETFL, flags);
+#endif
+
+    if (newSock < 0) {
+	DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno));
+	_INST(lastErrorNumber) = _MKSMALLINT(errno);
+	RETURN (false);
+    }
+
+    /*
+     * extract the partners address
+     */
+#ifdef AF_INET
+    if (_INST(domain) == @symbol(inet)) {
+	he = gethostbyaddr((char *) &sa.in.sin_addr.s_addr, alen, AF_INET) ;
+	if (! he) {
+	    unsigned long norder;
+
+	    norder = htonl(sa.in.sin_addr.s_addr) ;
+	    sprintf(dotted, "%d.%d.%d.%d",
+		    (norder >> 24) & 0xFF,
+		    (norder >> 16) & 0xFF,
+		    (norder >> 8) & 0xFF,
+		    norder & 0xFF);
+	}
+	DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
+	_INST(peerName) = _MKSTRING((he ? he->h_name : dotted) COMMA_CON);
+    }
+#endif
+#ifdef AF_UNIX
+    if (_INST(domain) == @symbol(unix)) {
+	DBGPRINTF(("SOCKET: accepted connection on unix socket\n")) ;
+	/* nothing to be done here */
+    }
+#endif
+
+    /* 
+     * make it a FILE * 
+     */
+    fp = fdopen(newSock, "r+");
+    if (! fp) {
+	DBGPRINTF(("SOCKET: fdopen call failed\n"));
+	_INST(lastErrorNumber) = _MKSMALLINT(errno);
+	close(newSock);
+	RETURN (false);
+    } else {
+#ifdef NO_BUFFER 
+	setbuf(fp, NULL);
+	_INST(buffered) = false;
+#endif
+	_INST(filePointer) = __MKOBJ(fp);
+    }
+%}.
+    mode := #readwrite.
+    Lobby register:self.
+    binary := false.
+    port := aSocket port.
+    ^ true
+!
+
 closeFile
     "low level close"
 
@@ -2443,5 +2445,5 @@
 !Socket class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.53 1996-03-08 21:20:31 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.54 1996-03-11 22:56:13 stefan Exp $'
 ! !