@@ -16,16 +16,21 @@ * SSLtcl (Peter Antman) * */ #include "tlsInt.h" + /* * Forward declarations */ static int TlsBlockModeProc (ClientData instanceData, int mode); +#if TCL_MAJOR_VERSION < 9 static int TlsCloseProc (ClientData instanceData, Tcl_Interp *interp); +#else +static int TlsClose2Proc (ClientData instanceData, Tcl_Interp *interp, int flags); +#endif 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); @@ -78,19 +83,23 @@ * against an older variant. */ size = sizeof(Tcl_ChannelType); /* Base size */ tlsChannelType = (Tcl_ChannelType *) ckalloc(size); - memset(tlsChannelType, 0, size); + memset((void *) tlsChannelType, 0, size); /* * Common elements of the structure (no changes in location or name) * close2Proc, seekProc, setOptionProc stay NULL. */ tlsChannelType->typeName = "tls"; +#if TCL_MAJOR_VERSION < 9 tlsChannelType->closeProc = TlsCloseProc; +#else + tlsChannelType->close2Proc = TlsClose2Proc; +#endif tlsChannelType->inputProc = TlsInputProc; tlsChannelType->outputProc = TlsOutputProc; tlsChannelType->getOptionProc = TlsGetOptionProc; tlsChannelType->watchProc = TlsWatchProc; tlsChannelType->getHandleProc = TlsGetHandleProc; @@ -159,10 +168,27 @@ * Closes the socket of the channel. * *------------------------------------------------------------------- */ static int TlsCloseProc(ClientData instanceData, Tcl_Interp *interp) { + State *statePtr = (State *) instanceData; + + dprintf("TlsCloseProc(%p)", (void *) statePtr); + + Tls_Clean(statePtr); + Tcl_EventuallyFree((ClientData)statePtr, Tls_Free); + + dprintf("Returning TCL_OK"); + + return(TCL_OK); + + /* Interp is unused. */ + interp = interp; +} + +static int TlsClose2Proc(ClientData instanceData, Tcl_Interp *interp, int flags) { + if ((flags & (TCL_CLOSE_READ|TCL_CLOSE_WRITE)) == 0) { State *statePtr = (State *) instanceData; dprintf("TlsCloseProc(%p)", (void *) statePtr); Tls_Clean(statePtr); @@ -169,13 +195,14 @@ Tcl_EventuallyFree((ClientData)statePtr, Tls_Free); dprintf("Returning TCL_OK"); return(TCL_OK); + } - /* Interp is unused. */ - interp = interp; + /* Interp is unused. */ + interp = interp; } /* *------------------------------------------------------* * @@ -641,11 +668,11 @@ *------------------------------------------------------------------- */ static int TlsGetOptionProc(ClientData instanceData, /* Socket state. */ Tcl_Interp *interp, /* For errors - can be NULL. */ - const char *optionName, /* Name of the option to + const char *optionName, /* Name of the option to * retrieve the value for, or * NULL to get all options and * their values. */ Tcl_DString *dsPtr) /* Where to store the computed value * initialized by caller. */ @@ -822,17 +849,16 @@ return 0; } dprintf("Calling Tls_WaitForConnect"); errorCode = 0; + if (Tls_WaitForConnect(statePtr, &errorCode, 1) < 0) { if (errorCode == EAGAIN) { dprintf("Async flag could be set (didn't check) and errorCode == EAGAIN: Returning 0"); - return 0; } - dprintf("Tls_WaitForConnect returned an error"); } dprintf("Returning %i", mask);