@@ -20,19 +20,20 @@ #include "tlsInt.h" /* * Forward declarations */ -static int TlsBlockModeProc (ClientData instanceData, int mode); -static int TlsCloseProc (ClientData instanceData, Tcl_Interp *interp); -static int TlsInputProc (ClientData instanceData, char *buf, int bufSize, int *errorCodePtr); -static int TlsOutputProc (ClientData instanceData, const char *buf, int toWrite, int *errorCodePtr); -static int TlsGetOptionProc (ClientData instanceData, Tcl_Interp *interp, const char *optionName, Tcl_DString *dsPtr); -static void TlsWatchProc (ClientData instanceData, int mask); -static int TlsGetHandleProc (ClientData instanceData, int direction, ClientData *handlePtr); -static int TlsNotifyProc (ClientData instanceData, int mask); -static void TlsChannelHandlerTimer (ClientData clientData); +static int TlsBlockModeProc (void *instanceData, int mode); +static int TlsCloseProc (void *instanceData, Tcl_Interp *interp); +static int TlsClose2Proc (void *instanceData, Tcl_Interp *interp, int flags); +static int TlsInputProc (void *instanceData, char *buf, int bufSize, int *errorCodePtr); +static int TlsOutputProc (void *instanceData, const char *buf, int toWrite, int *errorCodePtr); +static int TlsGetOptionProc (void *instanceData, Tcl_Interp *interp, const char *optionName, Tcl_DString *dsPtr); +static void TlsWatchProc (void *instanceData, int mask); +static int TlsGetHandleProc (void *instanceData, int direction, void **handlePtr); +static int TlsNotifyProc (void *instanceData, int mask); +static void TlsChannelHandlerTimer (void *clientData); /* * TLS Channel Type */ static const Tcl_ChannelType tlsChannelType = { @@ -44,14 +45,17 @@ 0, /* seekProc */ 0, /* setOptionProc */ TlsGetOptionProc, /* getOptionProc */ TlsWatchProc, /* watchProc */ TlsGetHandleProc, /* getHandleProc */ - NULL, /* close2Proc */ + TlsClose2Proc, /* close2Proc */ TlsBlockModeProc, /* blockModeProc */ 0, /* flushProc */ - TlsNotifyProc /* handlerProc */ + TlsNotifyProc, /* handlerProc */ + 0, /* wideSeekProc */ + 0, /* threadActionProc */ + 0 /* truncateProc */ }; /* *------------------------------------------------------------------- @@ -85,11 +89,11 @@ * Side effects: * Sets the device into blocking or nonblocking mode. * *------------------------------------------------------------------- */ -static int TlsBlockModeProc(ClientData instanceData, int mode) { +static int TlsBlockModeProc(void *instanceData, int mode) { State *statePtr = (State *) instanceData; if (mode == TCL_MODE_NONBLOCKING) { statePtr->flags |= TLS_TCL_ASYNC; } else { @@ -116,11 +120,11 @@ * Side effects: * Closes the socket of the channel. * *------------------------------------------------------------------- */ -static int TlsCloseProc(ClientData instanceData, TCL_UNUSED(Tcl_Interp *)) { +static int TlsCloseProc(void *instanceData, TCL_UNUSED(Tcl_Interp *)) { State *statePtr = (State *) instanceData; dprintf("TlsCloseProc(%p)", statePtr); Tls_Clean(statePtr); @@ -128,10 +132,17 @@ dprintf("Returning TCL_OK"); return(TCL_OK); } + +static int TlsClose2Proc(void *instanceData, Tcl_Interp *interp, int flags) { + if (!(flags&(TCL_CLOSE_READ|TCL_CLOSE_WRITE))) { + return TlsCloseProc(instanceData, interp); + } + return EINVAL; +} /* *------------------------------------------------------* * * Tls_WaitForConnect -- @@ -326,11 +337,11 @@ * Reads input from the input device of the channel. * *------------------------------------------------------------------- */ -static int TlsInputProc(ClientData instanceData, char *buf, int bufSize, int *errorCodePtr) { +static int TlsInputProc(void *instanceData, char *buf, int bufSize, int *errorCodePtr) { unsigned long backingError; State *statePtr = (State *) instanceData; int bytesRead; int tlsConnect; int err; @@ -454,11 +465,11 @@ * Writes output on the output device of the channel. * *------------------------------------------------------------------- */ -static int TlsOutputProc(ClientData instanceData, const char *buf, int toWrite, int *errorCodePtr) { +static int TlsOutputProc(void *instanceData, const char *buf, int toWrite, int *errorCodePtr) { unsigned long backingError; State *statePtr = (State *) instanceData; int written, err; int tlsConnect; @@ -594,11 +605,11 @@ * None. * *------------------------------------------------------------------- */ static int -TlsGetOptionProc(ClientData instanceData, /* Socket state. */ +TlsGetOptionProc(void *instanceData, /* Socket state. */ Tcl_Interp *interp, /* For errors - can be NULL. */ const char *optionName, /* Name of the option to * retrieve the value for, or * NULL to get all options and * their values. */ @@ -641,11 +652,11 @@ * *------------------------------------------------------------------- */ static void -TlsWatchProc(ClientData instanceData, /* The socket state. */ +TlsWatchProc(void *instanceData, /* The socket state. */ int mask) /* Events of interest; an OR-ed * combination of TCL_READABLE, * TCL_WRITABLE and TCL_EXCEPTION. */ { Tcl_Channel downChan; @@ -705,11 +716,11 @@ /* * There is interest in readable events and we actually have * data waiting, so generate a timer to flush that. */ dprintf("Creating a new timer since data appears to be waiting"); - statePtr->timer = Tcl_CreateTimerHandler(TLS_TCL_DELAY, TlsChannelHandlerTimer, (ClientData) statePtr); + statePtr->timer = Tcl_CreateTimerHandler(TLS_TCL_DELAY, TlsChannelHandlerTimer, statePtr); } } } /* @@ -726,11 +737,11 @@ * Side effects: * None. * *------------------------------------------------------------------- */ -static int TlsGetHandleProc(ClientData instanceData, int direction, ClientData *handlePtr) { +static int TlsGetHandleProc(void *instanceData, int direction, void **handlePtr) { State *statePtr = (State *) instanceData; return(Tcl_GetChannelHandle(Tls_GetParent(statePtr, TLS_TCL_FASTPATH), direction, handlePtr)); } @@ -749,11 +760,11 @@ * May process the incoming event by itself. * *------------------------------------------------------------------- */ -static int TlsNotifyProc(ClientData instanceData, int mask) { +static int TlsNotifyProc(void *instanceData, int mask) { State *statePtr = (State *) instanceData; int errorCode; /* * An event occured in the underlying channel. This @@ -816,17 +827,17 @@ *------------------------------------------------------* */ static void TlsChannelHandler (clientData, mask) - ClientData clientData; + void * clientData; int mask; { State *statePtr = (State *) clientData; dprintf("HANDLER(0x%x)", mask); - Tcl_Preserve( (ClientData)statePtr); + Tcl_Preserve(statePtr); if (mask & TCL_READABLE) { BIO_set_flags(statePtr->p_bio, BIO_FLAGS_READ); } else { BIO_clear_flags(statePtr->p_bio, BIO_FLAGS_READ); @@ -868,13 +879,13 @@ if ((mask & TCL_READABLE) && Tcl_InputBuffered(statePtr->self) > 0) { /* * Data is waiting, flush it out in short time */ statePtr->timer = Tcl_CreateTimerHandler(TLS_TCL_DELAY, - TlsChannelHandlerTimer, (ClientData) statePtr); + TlsChannelHandlerTimer, statePtr); } - Tcl_Release( (ClientData)statePtr); + Tcl_Release(statePtr); } #endif /* *------------------------------------------------------* @@ -893,11 +904,11 @@ * None. * *------------------------------------------------------* */ -static void TlsChannelHandlerTimer(ClientData clientData) { +static void TlsChannelHandlerTimer(void *clientData) { State *statePtr = (State *) clientData; int mask = 0; dprintf("Called");