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