summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--unix/tclUnixChan.c13
2 files changed, 13 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 4577c55..2b7927d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2003-10-23 Andreas Kupries <andreask@activestate.com>
+ * unix/tclUnixChan.c (Tcl_MakeFileChannel): Applied [Patch 813606]
+ fixing [Bug 813087]. Detection of sockets was off for Mac OS X
+ which implements pipes as local sockets. The new code ensures
+ that only IP sockets are detected as such.
+
* win/tclWinSock.c (TcpWatchProc): Watch for FD_CLOSE too when
asked for writable events by the generic layer.
(SocketEventProc): Generate a writable event too when a close is
diff --git a/unix/tclUnixChan.c b/unix/tclUnixChan.c
index 133e44f..bb2b9c0 100644
--- a/unix/tclUnixChan.c
+++ b/unix/tclUnixChan.c
@@ -10,7 +10,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclUnixChan.c,v 1.42 2003/02/21 02:36:27 hobbs Exp $
+ * RCS: @(#) $Id: tclUnixChan.c,v 1.43 2003/10/23 18:00:10 andreas_kupries Exp $
*/
#include "tclInt.h" /* Internal definitions for Tcl. */
@@ -1889,8 +1889,8 @@ Tcl_MakeFileChannel(handle, mode)
#ifdef DEPRECATED
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
#endif /* DEPRECATED */
- int socketType = 0;
- socklen_t argLength = sizeof(int);
+ struct sockaddr sockaddr;
+ socklen_t sockaddrLen = sizeof(sockaddr);
if (mode == 0) {
return NULL;
@@ -1911,6 +1911,8 @@ Tcl_MakeFileChannel(handle, mode)
}
#endif /* DEPRECATED */
+ sockaddr.sa_family = AF_UNSPEC;
+
#ifdef SUPPORTS_TTY
if (isatty(fd)) {
fsPtr = TtyInit(fd, 0);
@@ -1918,8 +1920,9 @@ Tcl_MakeFileChannel(handle, mode)
sprintf(channelName, "serial%d", fd);
} else
#endif /* SUPPORTS_TTY */
- if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (VOID *)&socketType,
- &argLength) == 0 && socketType == SOCK_STREAM) {
+ if (getsockname(fd, (struct sockaddr *)&sockaddr, &sockaddrLen) == 0
+ && sockaddrLen > 0
+ && sockaddr.sa_family == AF_INET) {
return MakeTcpClientChannelMode((ClientData) fd, mode);
} else {
channelTypePtr = &fileChannelType;