diff options
author | ferrieux <ferrieux@users.sourceforge.net> | 2008-12-18 01:14:16 (GMT) |
---|---|---|
committer | ferrieux <ferrieux@users.sourceforge.net> | 2008-12-18 01:14:16 (GMT) |
commit | a189e6bf469919f77d6e9884d112c93599363de5 (patch) | |
tree | 087ebe5ba2e9e57828831c8ad3ba41d50edb7eb4 /unix/tclUnixChan.c | |
parent | cd0108cccb852eff4a8a65fa1e68297e85bc12ec (diff) | |
download | tcl-a189e6bf469919f77d6e9884d112c93599363de5.zip tcl-a189e6bf469919f77d6e9884d112c93599363de5.tar.gz tcl-a189e6bf469919f77d6e9884d112c93599363de5.tar.bz2 |
TIP #332 IMPLEMENTATION - Half-Close for Bidirectional Channels
Diffstat (limited to 'unix/tclUnixChan.c')
-rw-r--r-- | unix/tclUnixChan.c | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/unix/tclUnixChan.c b/unix/tclUnixChan.c index 653f223..51781c0 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.96 2008/10/26 12:45:04 dkf Exp $ + * RCS: @(#) $Id: tclUnixChan.c,v 1.97 2008/12/18 01:14:16 ferrieux Exp $ */ #include "tclInt.h" /* Internal definitions for Tcl. */ @@ -218,6 +218,9 @@ static void TcpAccept(ClientData data, int mask); static int TcpBlockModeProc(ClientData data, int mode); static int TcpCloseProc(ClientData instanceData, Tcl_Interp *interp); +static int TcpClose2Proc(ClientData instanceData, + Tcl_Interp *interp, + int flags); static int TcpGetHandleProc(ClientData instanceData, int direction, ClientData *handlePtr); static int TcpGetOptionProc(ClientData instanceData, @@ -318,7 +321,7 @@ static Tcl_ChannelType tcpChannelType = { TcpGetOptionProc, /* Get option proc. */ TcpWatchProc, /* Initialize notifier. */ TcpGetHandleProc, /* Get OS handles out of channel. */ - NULL, /* close2proc. */ + TcpClose2Proc, /* Close2 proc. */ TcpBlockModeProc, /* Set blocking or non-blocking mode.*/ NULL, /* flush proc. */ NULL, /* handler proc. */ @@ -2018,6 +2021,57 @@ TcpCloseProc( /* *---------------------------------------------------------------------- * + * TcpClose2Proc -- + * + * This function is called by the generic IO level to perform the channel + * type specific part of a half-close: namely, a shutdown() on a socket. + * + * Results: + * 0 if successful, the value of errno if failed. + * + * Side effects: + * Shuts down one side of the socket. + * + *---------------------------------------------------------------------- + */ + +static int +TcpClose2Proc( + ClientData instanceData, /* The socket to close. */ + Tcl_Interp *interp, /* For error reporting. */ + int flags) /* Flags that indicate which side to close. */ +{ + TcpState *statePtr = (TcpState *) instanceData; + int errorCode = 0; + int sd; + + /* + * Shutdown the OS socket handle. + */ + switch(flags) + { + case TCL_CLOSE_READ: + sd=SHUT_RD; + break; + case TCL_CLOSE_WRITE: + sd=SHUT_WR; + break; + default: + if (interp) { + Tcl_AppendResult(interp, "Socket close2proc called bidirectionally", NULL); + } + return TCL_ERROR; + } + if (shutdown(statePtr->fd,sd)<0) { + errorCode = errno; + } + + return errorCode; +} + +/* + *---------------------------------------------------------------------- + * * TcpGetOptionProc -- * * Computes an option value for a TCP socket based channel, or a list of |