--- 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 $'
! !