closeSocket after fclose: no longer (Q: is this the right thing)
authorClaus Gittinger <cg@exept.de>
Mon, 05 Feb 2007 14:04:56 +0100
changeset 1843 8ee90d243b49
parent 1842 88c04d1e9e6b
child 1844 decc9d62520d
closeSocket after fclose: no longer (Q: is this the right thing)
Socket.st
--- a/Socket.st	Wed Jan 24 17:02:38 2007 +0100
+++ b/Socket.st	Mon Feb 05 14:04:56 2007 +0100
@@ -42,29 +42,10 @@
 
 # define SOCKET_FROM_FD(fd)               (fd)
 
-#if 0
-# undef INT
-# undef Array
-# undef Number
-# undef Method
-# undef Point
-# undef Rectangle
-# undef Block
-# undef Context
-# undef String
-# undef Message
-# undef Object
-# undef Date
-# undef Time
-# undef Set
-# undef Signal
-# undef Delay
-#endif
-
 #endif /* WIN32 */
 
-# define SOCKET_FROM_FILE(f)             (SOCKET_FROM_FD(fileno(f)))
-# define SOCKET_FROM_FILE_OBJECT(f)      (SOCKET_FROM_FILE(__FILEVal(f)))
+#define SOCKET_FROM_FILE(f)             (SOCKET_FROM_FD(fileno(f)))
+#define SOCKET_FROM_FILE_OBJECT(f)      (SOCKET_FROM_FILE(__FILEVal(f)))
 
 #ifndef WIN32
 # define closesocket(sock)    close(sock)
@@ -177,13 +158,19 @@
 typedef int BOOL;
 #endif
 
+#ifdef WIN32
+# undef stdout
+# undef stderr
+# define stdout __win32_stdout()
+# define stderr __win32_stderr()
+#endif
 
 %}
 ! !
 
 !Socket primitiveVariables!
 %{
-static int __debugging__ = 0;
+static int __debugging__ = 1;
 %}
 ! !
 
@@ -2335,10 +2322,12 @@
     if (t != nil) {
 	FILE *fp;
 	SOCKET sock;
+	int fd;
 
 	__INST(filePointer) = nil;
 	fp = __FILEVal(t);
-	sock = SOCKET_FROM_FILE(fp);
+	fd = fileno(fp);
+	sock = SOCKET_FROM_FD(fd);
 
 # ifdef xxDO_WRAP_CALLS
 	{ int ret;
@@ -2358,22 +2347,30 @@
 	}
 # else /* !DO_WRAP_CALLS */
 
-	DBGFPRINTF((stderr, "SOCKET: fflush %x (%d)\n", fp, fileno(fp)));
+	DBGFPRINTF((stderr, "SOCKET: fflush %x (%d %d)\n", fp, fileno(fp), sock));
 	fflush(fp);
-	/* shutdown(fileno(fp), 2); */
-#  ifdef xxWIN32
-	closesocket(sock);
-#  endif
-	DBGFPRINTF((stderr, "SOCKET: fclose %x (%d)\n", fp, sock));
-	if (@global(FileOpenTrace) == true) {
-	    console_fprintf(stderr, "fclose [Socket] %x\n", fp);
-	}
-	fclose(fp);
-#  ifdef WIN32
+
+#  if defined(WIN32) && defined(CLOSESOCKET_BEFORE_FCLOSE)
 	DBGFPRINTF((stderr, "SOCKET: closesocket (%d)\n", sock));
 	closesocket(sock);
 #  endif
-
+	if ((@global(FileOpenTrace) == true) || __debugging__) {
+	    console_fprintf(stderr, "SOCKET: fclose %x (%d %d)\n", fp, fileno(fp), sock);
+	}
+	fclose(fp);
+
+	/*
+	 * mhmh - seems that the stdio is fixed to know how to close a socket.
+	 * (hope that is true...)
+	 */
+# ifdef PRE_24_JAN_2007
+#  define CLOSESOCKET_AFTER_FCLOSE
+# endif
+
+#  if defined(WIN32) && defined(CLOSESOCKET_AFTER_FCLOSE)
+	DBGFPRINTF((stderr, "SOCKET: closesocket (%d)\n", sock));
+	closesocket(sock);
+#  endif
 # endif /* !DO_WRAP_CALLS */
     }
 #endif /* NO_SOCKET */
@@ -2926,9 +2923,9 @@
      */
 # ifdef WIN32
     {
-	HANDLE h;
 	int _fd = _open_osfhandle(newSock, 0);
 	fp = fdopen(_fd, "r+");
+	DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%x\n",newSock,_fd, fp));
     }
 # else
     fp = fdopen(newSock, "r+");
@@ -2952,7 +2949,7 @@
 	RETURN (false);
     }
 
-    if (@global(FileOpenTrace) == true) {
+    if ((@global(FileOpenTrace) == true) || __debugging__) {
 # ifdef WIN32
 	{
 	    HANDLE h;
@@ -3702,7 +3699,7 @@
 	    __END_INTERRUPTABLE__
 # endif
 	} else {
-	    if (@global(FileOpenTrace) == true) {
+	    if ((@global(FileOpenTrace) == true) || __debugging__) {
 		console_fprintf(stderr, "fdopen [Socket] -> %x\n", fp);
 	    }
 
@@ -4078,5 +4075,5 @@
 !Socket class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.228 2007-01-24 16:02:38 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.229 2007-02-05 13:04:56 cg Exp $'
 ! !