Index: tls.c ================================================================== --- tls.c +++ tls.c @@ -38,30 +38,17 @@ Tcl_TranslateFileName(interp, (key), (dsp))) #define REASON() ERR_reason_error_string(ERR_get_error()) static void InfoCallback(const SSL *ssl, int where, int ret); -static int CiphersObjCmd(ClientData clientData, - Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); - -static int HandshakeObjCmd(ClientData clientData, - Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); - -static int ImportObjCmd(ClientData clientData, - Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); - -static int StatusObjCmd(ClientData clientData, - Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); - -static int VersionObjCmd(ClientData clientData, - Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); - -static int MiscObjCmd(ClientData clientData, - Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); - -static int UnimportObjCmd(ClientData clientData, - Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static Tcl_ObjCmdProc CiphersObjCmd; +static Tcl_ObjCmdProc HandshakeObjCmd; +static Tcl_ObjCmdProc ImportObjCmd; +static Tcl_ObjCmdProc StatusObjCmd; +static Tcl_ObjCmdProc VersionObjCmd; +static Tcl_ObjCmdProc MiscObjCmd; +static Tcl_ObjCmdProc UnimportObjCmd; static SSL_CTX *CTX_Init(State *statePtr, int isServer, int proto, char *key, char *certfile, unsigned char *key_asn1, unsigned char *cert_asn1, int key_asn1_len, int cert_asn1_len, char *CAdir, char *CAfile, char *ciphers, char *DHparams); @@ -173,11 +160,11 @@ static void InfoCallback(const SSL *ssl, int where, int ret) { State *statePtr = (State*)SSL_get_app_data((SSL *)ssl); Tcl_Obj *cmdPtr; - char *major; char *minor; + const char *major, *minor; dprintf("Called"); if (statePtr->callback == (Tcl_Obj*)NULL) return; @@ -271,11 +258,11 @@ static int VerifyCallback(int ok, X509_STORE_CTX *ctx) { Tcl_Obj *cmdPtr, *result; char *errStr, *string; - int length; + Tcl_Size length; SSL *ssl = (SSL*)X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()); X509 *cert = X509_STORE_CTX_get_current_cert(ctx); State *statePtr = (State*)SSL_get_app_data(ssl); int depth = X509_STORE_CTX_get_error_depth(ctx); int err = X509_STORE_CTX_get_error(ctx); @@ -491,15 +478,15 @@ * constructs and destroys SSL context (CTX) * *------------------------------------------------------------------- */ static int -CiphersObjCmd(clientData, interp, objc, objv) - ClientData clientData; /* Not used. */ - Tcl_Interp *interp; - int objc; - Tcl_Obj *const objv[]; +CiphersObjCmd( + TCL_UNUSED(void *), + Tcl_Interp *interp, + int objc, + Tcl_Obj *const objv[]) { static const char *protocols[] = { "ssl2", "ssl3", "tls1", "tls1.1", "tls1.2", "tls1.3", NULL }; enum protocol { @@ -595,11 +582,11 @@ } } else { sk = SSL_get_ciphers(ssl); for (index = 0; index < sk_SSL_CIPHER_num(sk); index++) { - register size_t i; + size_t i; SSL_CIPHER_description( sk_SSL_CIPHER_value( sk, index), buf, sizeof(buf)); for (i = strlen(buf) - 1; i ; i--) { if (buf[i] == ' ' || buf[i] == '\n' || buf[i] == '\r' || buf[i] == '\t') { @@ -615,11 +602,10 @@ SSL_free(ssl); SSL_CTX_free(ctx); Tcl_SetObjResult( interp, objPtr); return TCL_OK; - clientData = clientData; } /* *------------------------------------------------------------------- * @@ -635,11 +621,16 @@ * May force SSL negotiation to take place. * *------------------------------------------------------------------- */ -static int HandshakeObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { +static int HandshakeObjCmd( + TCL_UNUSED(void *), + Tcl_Interp *interp, + int objc, + Tcl_Obj *const objv[]) +{ Tcl_Channel chan; /* The channel to set a mode on. */ State *statePtr; /* client state for ssl socket */ const char *errStr = NULL; int ret = 1; int err = 0; @@ -697,12 +688,10 @@ } dprintf("Returning TCL_OK with data \"%i\"", ret); Tcl_SetObjResult(interp, Tcl_NewIntObj(ret)); return(TCL_OK); - - clientData = clientData; } /* *------------------------------------------------------------------- * @@ -720,31 +709,32 @@ * *------------------------------------------------------------------- */ static int -ImportObjCmd(clientData, interp, objc, objv) - ClientData clientData; /* Not used. */ - Tcl_Interp *interp; - int objc; - Tcl_Obj *const objv[]; +ImportObjCmd( + TCL_UNUSED(void *), + Tcl_Interp *interp, + int objc, + Tcl_Obj *const objv[]) { Tcl_Channel chan; /* The channel to set a mode on. */ State *statePtr; /* client state for ssl socket */ SSL_CTX *ctx = NULL; Tcl_Obj *script = NULL; Tcl_Obj *password = NULL; Tcl_DString upperChannelTranslation, upperChannelBlocking, upperChannelEncoding, upperChannelEOFChar; - int idx, len; + int idx; + Tcl_Size len; int flags = TLS_TCL_INIT; int server = 0; /* is connection incoming or outgoing? */ char *keyfile = NULL; char *certfile = NULL; unsigned char *key = NULL; - int key_len = 0; - unsigned char *cert = NULL; - int cert_len = 0; + Tcl_Size key_len = 0; + unsigned char *cert = NULL; + Tcl_Size cert_len = 0; char *ciphers = NULL; char *CAfile = NULL; char *CAdir = NULL; char *DHparams = NULL; char *model = NULL; @@ -817,13 +807,13 @@ OPTBOOL( "-ssl2", ssl2); OPTBOOL( "-ssl3", ssl3); OPTBOOL( "-tls1", tls1); OPTBOOL( "-tls1.1", tls1_1); OPTBOOL( "-tls1.2", tls1_2); - OPTBOOL( "-tls1.3", tls1_3); - OPTBYTE("-cert", cert, cert_len); - OPTBYTE("-key", key, key_len); + OPTBOOL( "-tls1.3", tls1_3) + OPTBYTE("-cert", cert, cert_len); + OPTBYTE("-key", key, key_len); OPTBAD( "option", "-cadir, -cafile, -cert, -certfile, -cipher, -command, -dhparams, -key, -keyfile, -model, -password, -require, -request, -server, -servername, -ssl2, -ssl3, -tls1, -tls1.1, -tls1.2, or tls1.3"); return TCL_ERROR; } @@ -878,11 +868,11 @@ if (model != NULL) { int mode; /* Get the "model" context */ chan = Tcl_GetChannel(interp, model, &mode); if (chan == (Tcl_Channel) NULL) { - Tls_Free(statePtr); + Tls_Free((void *)statePtr); return TCL_ERROR; } /* * Make sure to operate on the topmost channel @@ -889,19 +879,19 @@ */ chan = Tcl_GetTopChannel(chan); if (Tcl_GetChannelType(chan) != Tls_ChannelType()) { Tcl_AppendResult(interp, "bad channel \"", Tcl_GetChannelName(chan), "\": not a TLS channel", NULL); - Tls_Free(statePtr); + Tls_Free((void *)statePtr); return TCL_ERROR; } ctx = ((State *)Tcl_GetChannelInstanceData(chan))->ctx; } else { if ((ctx = CTX_Init(statePtr, server, proto, keyfile, certfile, key, cert, key_len, cert_len, CAdir, CAfile, ciphers, DHparams)) == (SSL_CTX*)0) { - Tls_Free(statePtr); + Tls_Free((void *)statePtr); return TCL_ERROR; } } statePtr->ctx = ctx; @@ -927,11 +917,11 @@ dprintf("Created channel named %s", Tcl_GetChannelName(statePtr->self)); if (statePtr->self == (Tcl_Channel) NULL) { /* * No use of Tcl_EventuallyFree because no possible Tcl_Preserve. */ - Tls_Free(statePtr); + Tls_Free((void *)statePtr); return TCL_ERROR; } Tcl_SetChannelOption(interp, statePtr->self, "-translation", Tcl_DStringValue(&upperChannelTranslation)); Tcl_SetChannelOption(interp, statePtr->self, "-encoding", Tcl_DStringValue(&upperChannelEncoding)); @@ -945,20 +935,20 @@ statePtr->ssl = SSL_new(statePtr->ctx); if (!statePtr->ssl) { /* SSL library error */ Tcl_AppendResult(interp, "couldn't construct ssl session: ", REASON(), (char *) NULL); - Tls_Free(statePtr); + Tls_Free((void *)statePtr); return TCL_ERROR; } #ifndef OPENSSL_NO_TLSEXT if (servername) { if (!SSL_set_tlsext_host_name(statePtr->ssl, servername) && require) { Tcl_AppendResult(interp, "setting TLS host name extension failed", (char *) NULL); - Tls_Free(statePtr); + Tls_Free((void *)statePtr); return TCL_ERROR; } } #endif @@ -990,11 +980,10 @@ */ dprintf("Returning %s", Tcl_GetChannelName(statePtr->self)); Tcl_SetResult(interp, (char *) Tcl_GetChannelName(statePtr->self), TCL_VOLATILE); return TCL_OK; - clientData = clientData; } /* *------------------------------------------------------------------- * @@ -1010,15 +999,15 @@ * *------------------------------------------------------------------- */ static int -UnimportObjCmd(clientData, interp, objc, objv) - ClientData clientData; /* Not used. */ - Tcl_Interp *interp; - int objc; - Tcl_Obj *const objv[]; +UnimportObjCmd( + TCL_UNUSED(void *), + Tcl_Interp *interp, + int objc, + Tcl_Obj *const objv[]) { Tcl_Channel chan; /* The channel to set a mode on. */ dprintf("Called"); @@ -1046,11 +1035,10 @@ if (Tcl_UnstackChannel(interp, chan) == TCL_ERROR) { return TCL_ERROR; } return TCL_OK; - clientData = clientData; } /* *------------------------------------------------------------------- * @@ -1064,25 +1052,24 @@ * *------------------------------------------------------------------- */ static SSL_CTX * -CTX_Init(statePtr, isServer, proto, keyfile, certfile, key, cert, - key_len, cert_len, CAdir, CAfile, ciphers, DHparams) - State *statePtr; - int isServer; - int proto; - char *keyfile; - char *certfile; - unsigned char *key; - unsigned char *cert; - int key_len; - int cert_len; - char *CAdir; - char *CAfile; - char *ciphers; - char *DHparams; +CTX_Init( + State *statePtr, + TCL_UNUSED(int) /* isServer */, + int proto, + char *keyfile, + char *certfile, + unsigned char *key, + unsigned char *cert, + int key_len, + int cert_len, + char *CAdir, + char *CAfile, + char *ciphers, + char *DHparams) { Tcl_Interp *interp = statePtr->interp; SSL_CTX *ctx = NULL; Tcl_DString ds; Tcl_DString ds1; @@ -1397,15 +1384,15 @@ * None. * *------------------------------------------------------------------- */ static int -StatusObjCmd(clientData, interp, objc, objv) - ClientData clientData; /* Not used. */ - Tcl_Interp *interp; - int objc; - Tcl_Obj *const objv[]; +StatusObjCmd( + TCL_UNUSED(void *), + Tcl_Interp *interp, + int objc, + Tcl_Obj *const objv[]) { State *statePtr; X509 *peer; Tcl_Obj *objPtr; Tcl_Channel chan; @@ -1422,11 +1409,11 @@ case 3: if (!strcmp (Tcl_GetString (objv[1]), "-local")) { channelName = Tcl_GetString(objv[2]); break; } - /* else fall... */ + /* fallthrough */ default: Tcl_WrongNumArgs(interp, 1, objv, "?-local? channel"); return TCL_ERROR; } @@ -1474,11 +1461,10 @@ Tcl_ListObjAppendElement(interp, objPtr, Tcl_NewStringObj(SSL_get_version(statePtr->ssl), -1)); Tcl_SetObjResult( interp, objPtr); return TCL_OK; - clientData = clientData; } /* *------------------------------------------------------------------- * @@ -1491,27 +1477,24 @@ * None. * *------------------------------------------------------------------- */ static int -VersionObjCmd(clientData, interp, objc, objv) - ClientData clientData; /* Not used. */ - Tcl_Interp *interp; - int objc; - Tcl_Obj *const objv[]; +VersionObjCmd( + TCL_UNUSED(void *), + Tcl_Interp *interp, + TCL_UNUSED(int) /* objc */, + TCL_UNUSED(Tcl_Obj *const *) /* objv */) { Tcl_Obj *objPtr; dprintf("Called"); objPtr = Tcl_NewStringObj(OPENSSL_VERSION_TEXT, -1); Tcl_SetObjResult(interp, objPtr); return TCL_OK; - clientData = clientData; - objc = objc; - objv = objv; } /* *------------------------------------------------------------------- * @@ -1524,15 +1507,15 @@ * None. * *------------------------------------------------------------------- */ static int -MiscObjCmd(clientData, interp, objc, objv) - ClientData clientData; /* Not used. */ - Tcl_Interp *interp; - int objc; - Tcl_Obj *const objv[]; +MiscObjCmd( + TCL_UNUSED(void *), + Tcl_Interp *interp, + int objc, + Tcl_Obj *const objv[]) { static const char *commands [] = { "req", NULL }; enum command { C_REQ, C_DUMMY }; int cmd; @@ -1551,15 +1534,15 @@ case C_REQ: { EVP_PKEY *pkey=NULL; X509 *cert=NULL; X509_NAME *name=NULL; Tcl_Obj **listv; - int listc,i; + Tcl_Size listc,i; BIO *out=NULL; - char *k_C="",*k_ST="",*k_L="",*k_O="",*k_OU="",*k_CN="",*k_Email=""; + const char *k_C="",*k_ST="",*k_L="",*k_O="",*k_OU="",*k_CN="",*k_Email=""; char *keyout,*pemout,*str; int keysize,serial=0,days=365; if ((objc<5) || (objc>6)) { Tcl_WrongNumArgs(interp, 2, objv, "keysize keyfile certfile ?info?"); @@ -1672,11 +1655,10 @@ break; default: break; } return TCL_OK; - clientData = clientData; } /* *------------------------------------------------------------------- * @@ -1692,11 +1674,15 @@ * Frees all the state * *------------------------------------------------------------------- */ void +#if TCL_MAJOR_VERSION > 8 Tls_Free( void *blockPtr ) +#else +Tls_Free( char *blockPtr ) +#endif { State *statePtr = (State *)blockPtr; dprintf("Called"); Index: tlsBIO.c ================================================================== --- tlsBIO.c +++ tlsBIO.c @@ -76,13 +76,13 @@ parentChannel = Tls_GetParent(statePtr, 0); parentChannelType = Tcl_GetChannelType(parentChannel); validParentChannelFd = 0; if (strcmp(parentChannelType->typeName, "tcp") == 0) { - tclGetChannelHandleRet = Tcl_GetChannelHandle(parentChannel, TCL_READABLE, (ClientData) &parentChannelFdIn_p); + tclGetChannelHandleRet = Tcl_GetChannelHandle(parentChannel, TCL_READABLE, &parentChannelFdIn_p); if (tclGetChannelHandleRet == TCL_OK) { - tclGetChannelHandleRet = Tcl_GetChannelHandle(parentChannel, TCL_WRITABLE, (ClientData) &parentChannelFdOut_p); + tclGetChannelHandleRet = Tcl_GetChannelHandle(parentChannel, TCL_WRITABLE, &parentChannelFdOut_p); if (tclGetChannelHandleRet == TCL_OK) { parentChannelFdIn = PTR2INT(parentChannelFdIn_p); parentChannelFdOut = PTR2INT(parentChannelFdOut_p); if (parentChannelFdIn == parentChannelFdOut) { parentChannelFd = parentChannelFdIn; @@ -224,18 +224,22 @@ Tcl_Channel chan; long ret = 1; chan = Tls_GetParent((State *) BIO_get_data(bio), 0); - dprintf("BioCtrl(%p, 0x%x, 0x%x, %p)", (void *) bio, (unsigned int) cmd, (unsigned int) num, (void *) ptr); + dprintf("BioCtrl(%p, 0x%x, 0x%lx, %p)", bio, cmd, num, ptr); switch (cmd) { case BIO_CTRL_RESET: dprintf("Got BIO_CTRL_RESET"); num = 0; + ret = 0; + break; case BIO_C_FILE_SEEK: dprintf("Got BIO_C_FILE_SEEK"); + ret = 0; + break; case BIO_C_FILE_TELL: dprintf("Got BIO_C_FILE_TELL"); ret = 0; break; case BIO_CTRL_INFO: Index: tlsIO.c ================================================================== --- tlsIO.c +++ tlsIO.c @@ -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"); Index: tlsInt.h ================================================================== --- tlsInt.h +++ tlsInt.h @@ -145,11 +145,11 @@ SSL *ssl; /* Struct for SSL processing */ SSL_CTX *ctx; /* SSL Context */ BIO *bio; /* Struct for SSL processing */ BIO *p_bio; /* Parent BIO (that is layered on Tcl_Channel) */ - char *err; + const char *err; } State; #ifdef USE_TCL_STUBS #ifndef Tcl_StackChannel #error "Unable to compile on this version of Tcl" @@ -169,23 +169,30 @@ # else # define TCL_UNUSED(T) T JOIN(dummy, __LINE__) # endif #endif +#if (TCL_MAJOR_VERSION < 9) && defined(TCL_MINOR_VERSION) && (TCL_MINOR_VERSION < 7) && !defined(Tcl_Size) +# define Tcl_Size int +#endif /* * Forward declarations */ const Tcl_ChannelType *Tls_ChannelType(void); Tcl_Channel Tls_GetParent(State *statePtr, int maskFlags); Tcl_Obj *Tls_NewX509Obj(Tcl_Interp *interp, X509 *cert); void Tls_Error(State *statePtr, char *msg); +#if TCL_MAJOR_VERSION > 8 void Tls_Free(void *blockPtr); +#else +void Tls_Free(char *blockPtr); +#endif void Tls_Clean(State *statePtr); int Tls_WaitForConnect(State *statePtr, int *errorCodePtr, int handshakeFailureIsPermanent); BIO *BIO_new_tcl(State* statePtr, int flags); #define PTR2INT(x) ((int) ((intptr_t) (x))) #endif /* _TLSINT_H */