Socket.st
changeset 822 a08e230988fe
parent 821 40b0b69bf4b5
child 823 85c20f9e71de
--- a/Socket.st	Thu Sep 23 21:47:00 1999 +0200
+++ b/Socket.st	Fri Sep 24 17:31:12 1999 +0200
@@ -22,7 +22,12 @@
 
 #ifdef LINUX
 # define BUGGY_STDIO_LIB
-#endif
+# include <linux/version.h>
+
+# ifndef KERNEL_VERSION
+#  define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
+# endif
+#endif /* LINUX */
 
 #include <stdio.h>
 #include <errno.h>
@@ -51,12 +56,22 @@
 #endif
 
 #ifdef LINUX
-# define WANT__AF_APPLETALK
-# define xxWANT__AF_X25
-# define xxWANT__AF_AX25
-# define xxWANT__AF_IPX
-# define WANT__AF_INET6 */
-#endif
+# ifndef LINUX_VERSION_CODE
+   /* PRE 2.0 Linux kernel. */
+# else
+#  if LINUX_VERSION_CODE < KERNEL_VERSION(2,0,0)
+   /* PRE 2.0 Linux kernel. */
+#  else
+#   if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)
+#    define WANT__AF_APPLETALK
+#    define xxWANT__AF_X25
+#    define xxWANT__AF_AX25
+#    define xxWANT__AF_IPX
+#    define WANT__AF_INET6 */
+#   endif /* >= 2.1.0 */
+#  endif /* pre 2.0.0 */
+# endif /* pre 2.0.0 */
+#endif /* LINIX */
 
 #ifdef solaris2_0
 # define xxxWANT__AF_DECNET
@@ -1381,31 +1396,31 @@
 
     sa.sin_family = -1;
     if (__bothSmallInteger(b1, b2) && __bothSmallInteger(b3, b4)) {
-        bzero(&sa, sizeof(sa)) ;
-        sa.sin_addr.s_addr = _intVal(b1) & 0xFF;
-        sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b2) & 0xFF);
-        sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b3) & 0xFF);
-        sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b4) & 0xFF);
-        sa.sin_addr.s_addr = htonl(sa.sin_addr.s_addr);    
-        sa.sin_family = AF_INET;
-        /* do we know the host's address? */
-        GETHOSTBYADDR(hp, (char *) &sa.sin_addr, sizeof(sa.sin_addr), AF_INET);
+	bzero(&sa, sizeof(sa)) ;
+	sa.sin_addr.s_addr = _intVal(b1) & 0xFF;
+	sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b2) & 0xFF);
+	sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b3) & 0xFF);
+	sa.sin_addr.s_addr = (sa.sin_addr.s_addr << 8) | (_intVal(b4) & 0xFF);
+	sa.sin_addr.s_addr = htonl(sa.sin_addr.s_addr);    
+	sa.sin_family = AF_INET;
+	/* do we know the host's address? */
+	GETHOSTBYADDR(hp, (char *) &sa.sin_addr, sizeof(sa.sin_addr), AF_INET);
         
-        if (hp == NULL) {
-            DBGPRINTF(("SOCKET: unknown ip address: %d.%d.%d.%d\n", 
-                       _intVal(b1), _intVal(b2), _intVal(b3), _intVal(b4)));
-        } else {
-            sa.sin_family = hp->h_addrtype;
-        }
+	if (hp == NULL) {
+	    DBGPRINTF(("SOCKET: unknown ip address: %d.%d.%d.%d\n", 
+		       _intVal(b1), _intVal(b2), _intVal(b3), _intVal(b4)));
+	} else {
+	    sa.sin_family = hp->h_addrtype;
+	}
     }
 
     /* if the addressing family is not AF_INET, Return nil */
     if (sa.sin_family != AF_INET) {
-        RETURN ( nil );
+	RETURN ( nil );
     }
 
     if (hp != NULL) {
-        RETURN (__MKSTRING(hp->h_name));
+	RETURN (__MKSTRING(hp->h_name));
     }
 
     /*
@@ -3096,22 +3111,22 @@
      Return the true if ok; false if not.
 
      NOTICE: this method will block, if no connection is already pending.
-             use readWait or Socket>>accept."
+	     use readWait or Socket>>accept."
 
     |serverSocketFd|
 
     filePointer notNil ifTrue:[
-        ^ self errorAlreadyOpen
+	^ self errorAlreadyOpen
     ].
 
     domain := aSocket domain.
     socketType := aSocket type.
     serverSocketFd := aSocket fileDescriptor.
     serverSocketFd isNil ifTrue:[
-        ^ self error:'invalid server socket'
+	^ self error:'invalid server socket'
     ].
     (serverSocketFd isMemberOf:SmallInteger) ifFalse:[
-        ^ self error:'invalid server socket'
+	^ self error:'invalid server socket'
     ].
 %{
 #ifndef NO_SOCKET
@@ -3132,22 +3147,22 @@
 
 #ifdef AF_INET
     if (__INST(domain) == @symbol(inet)) {
-        alen0 = sizeof(sa.in);
+	alen0 = sizeof(sa.in);
     }
 #endif
 #ifdef AF_INET6
     if (__INST(domain) == @symbol(inet6)) {
-        alen0 = sizeof(sa.in6);
+	alen0 = sizeof(sa.in6);
     }
 #endif
 #ifdef AF_UNIX
     if (__INST(domain) == @symbol(unix)) {
-        alen0 = sizeof(sa.un);
+	alen0 = sizeof(sa.un);
     }
 #endif
 # ifdef AF_APPLETALK
     if (__INST(domain) == @symbol(appletalk)) {
-        alen0 = sizeof(sa.at);
+	alen0 = sizeof(sa.at);
     }
 # endif
 
@@ -3156,12 +3171,12 @@
      */
 # ifdef AF_X25
     if (__INST(domain) == @symbol(x25)) {
-        alen0 = sizeof(sa.x25);
+	alen0 = sizeof(sa.x25);
     }
 # endif
 # ifdef AF_AX25
     if (__INST(domain) == @symbol(ax25)) {
-        alen0 = sizeof(sa.ax25);
+	alen0 = sizeof(sa.ax25);
     }
 # endif
 # ifdef AF_NS
@@ -3171,12 +3186,12 @@
 # endif
 # ifdef AF_DECnet
     if (__INST(domain) == @symbol(decnet)) {
-        alen0 = sizeof(sa.dn);
+	alen0 = sizeof(sa.dn);
     }
 # endif
 # ifdef AF_SNA
     if (__INST(domain) == @symbol(sna)) {
-        alen0 = sizeof(sa.sna);
+	alen0 = sizeof(sa.sna);
     }
 # endif
 # ifdef AF_RAW
@@ -3193,7 +3208,7 @@
 # endif
 # ifdef AF_IPX
     if (__INST(domain) == @symbol(ipx)) {
-        alen0 = sizeof(sa.ipx);
+	alen0 = sizeof(sa.ipx);
     }
 # endif
 # ifdef AF_BRIDGE
@@ -3215,8 +3230,8 @@
 
     __BEGIN_INTERRUPTABLE__
     do {
-        alen = alen0;
-        newSock = accept(sock, (struct sockaddr *) &sa, &alen);
+	alen = alen0;
+	newSock = accept(sock, (struct sockaddr *) &sa, &alen);
     } while ((newSock < 0) && (errno == EINTR));
     __END_INTERRUPTABLE__
     DBGFPRINTF((stderr, "socket accept newSock=%d\n", newSock));
@@ -3226,9 +3241,9 @@
 #endif
 
     if (newSock < 0) {
-        DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno));
-        __INST(lastErrorNumber) = __MKSMALLINT(errno);
-        RETURN (false);
+	DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno));
+	__INST(lastErrorNumber) = __MKSMALLINT(errno);
+	RETURN (false);
     }
 
     /*
@@ -3236,71 +3251,71 @@
      */
 #ifdef AF_INET
     if (__INST(domain) == @symbol(inet)) {
-        GETHOSTBYADDR(he, (char *) &sa.in.sin_addr, sizeof(sa.in.sin_addr), 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));
-        __STORESELF(peerName);
+	GETHOSTBYADDR(he, (char *) &sa.in.sin_addr, sizeof(sa.in.sin_addr), 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));
+	__STORESELF(peerName);
     }
 #endif
 
 #ifdef AF_INET6
     if (__INST(domain) == @symbol(inet6)) {
-        GETHOSTBYADDR(he, (char *) &sa.in6.sin6_addr, sizeof(sa.in6.sin6_addr), AF_INET6);
-        if (! he) {
-            unsigned long norder;
-
-            /*
-             * XXX: what is inet6's naming convention ?
-             */
-            norder = htonl(sa.in.sin_addr.s_addr) ;
-            sprintf(dotted, "%d.%d.%d.%d.%d.%d...",
-                    sa.in6.sin6_addr.s6_addr[0],
-                    sa.in6.sin6_addr.s6_addr[1],
-                    sa.in6.sin6_addr.s6_addr[2],
-                    sa.in6.sin6_addr.s6_addr[3],
-                    sa.in6.sin6_addr.s6_addr[4],
-                    sa.in6.sin6_addr.s6_addr[5]);
-        }
-        DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
-        __INST(peerName) = __MKSTRING((he ? he->h_name : dotted));
-        __STORESELF(peerName);
+	GETHOSTBYADDR(he, (char *) &sa.in6.sin6_addr, sizeof(sa.in6.sin6_addr), AF_INET6);
+	if (! he) {
+	    unsigned long norder;
+
+	    /*
+	     * XXX: what is inet6's naming convention ?
+	     */
+	    norder = htonl(sa.in.sin_addr.s_addr) ;
+	    sprintf(dotted, "%d.%d.%d.%d.%d.%d...",
+		    sa.in6.sin6_addr.s6_addr[0],
+		    sa.in6.sin6_addr.s6_addr[1],
+		    sa.in6.sin6_addr.s6_addr[2],
+		    sa.in6.sin6_addr.s6_addr[3],
+		    sa.in6.sin6_addr.s6_addr[4],
+		    sa.in6.sin6_addr.s6_addr[5]);
+	}
+	DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
+	__INST(peerName) = __MKSTRING((he ? he->h_name : dotted));
+	__STORESELF(peerName);
     }
 #endif
 
 #ifdef AF_UNIX
     if (__INST(domain) == @symbol(unix)) {
-        DBGPRINTF(("SOCKET: accepted connection on unix socket\n")) ;
-        /* nothing to be done here */
+	DBGPRINTF(("SOCKET: accepted connection on unix socket\n")) ;
+	/* nothing to be done here */
     }
 #endif
 
 #ifdef AF_APPLETALK
     if (__INST(domain) == @symbol(appletalk)) {
-        GETHOSTBYADDR(he, (char *) &sa.at.sat_addr, sizeof(sa.at.sat_addr), AF_APPLETALK);
-        if (! he) {
-            unsigned net;
-
-            /*
-             * XXX: what is apples naming convention ?
-             */
-            net = htons(sa.at.sat_addr.s_net) ;
-            sprintf(dotted, "%d.%d",
-                    net,
-                    sa.at.sat_addr.s_node);
-        }
-        DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
-        __INST(peerName) = __MKSTRING((he ? he->h_name : dotted));
-        __STORESELF(peerName);
+	GETHOSTBYADDR(he, (char *) &sa.at.sat_addr, sizeof(sa.at.sat_addr), AF_APPLETALK);
+	if (! he) {
+	    unsigned net;
+
+	    /*
+	     * XXX: what is apples naming convention ?
+	     */
+	    net = htons(sa.at.sat_addr.s_net) ;
+	    sprintf(dotted, "%d.%d",
+		    net,
+		    sa.at.sat_addr.s_node);
+	}
+	DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
+	__INST(peerName) = __MKSTRING((he ? he->h_name : dotted));
+	__STORESELF(peerName);
     }
 # endif
 
@@ -3366,18 +3381,18 @@
      */
     fp = fdopen(newSock, "r+");
     if (! fp) {
-        DBGPRINTF(("SOCKET: fdopen call failed\n"));
-        __INST(lastErrorNumber) = __MKSMALLINT(errno);
-        close(newSock);
+	DBGPRINTF(("SOCKET: fdopen call failed\n"));
+	__INST(lastErrorNumber) = __MKSMALLINT(errno);
+	close(newSock);
 	DBGFPRINTF((stderr, "socket close (fdopen failed) (%d)\n", newSock));
-        RETURN (false);
+	RETURN (false);
     } else {
 #ifdef BUGGY_STDIO_LIB
-        setbuf(fp, NULL);
-        __INST(buffered) = false;
+	setbuf(fp, NULL);
+	__INST(buffered) = false;
 #endif
-        __INST(filePointer) = __MKOBJ(fp);
-        __STORESELF(filePointer);
+	__INST(filePointer) = __MKOBJ(fp);
+	__STORESELF(filePointer);
     }
 #endif
 %}.
@@ -4315,7 +4330,7 @@
 		__INST(lastErrorNumber) = __MKSMALLINT(errno);
 		__BEGIN_INTERRUPTABLE__
 		close(sock);
-	  	DBGFPRINTF((stderr, "socket close (fdopen failed) (%d)\n", sock));
+		DBGFPRINTF((stderr, "socket close (fdopen failed) (%d)\n", sock));
 		__END_INTERRUPTABLE__
 	    } else {
 #ifdef BUGGY_STDIO_LIB
@@ -4542,5 +4557,5 @@
 !Socket class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.134 1999-09-23 19:46:59 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.135 1999-09-24 15:31:11 cg Exp $'
 ! !