982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
|
*/
static void TlsChannelHandlerTimer(
ClientData clientData) /* Socket state. */
{
State *statePtr = (State *) clientData;
int mask = statePtr->want; /* Init to SSL_ERROR_WANT_READ and SSL_ERROR_WANT_WRITE */
dprintf("Called");
statePtr->timer = (Tcl_TimerToken) NULL;
/* Check for amount of data pending in BIO write buffer */
if (BIO_wpending(statePtr->bio)) {
dprintf("[chan=%p] BIO writable", statePtr->self);
mask |= TCL_WRITABLE;
}
/* Check for amount of data pending in BIO read buffer */
if (BIO_pending(statePtr->bio)) {
dprintf("[chan=%p] BIO readable", statePtr->self);
mask |= TCL_READABLE;
}
/* Notify the generic IO layer that the mask events have occurred on the channel */
dprintf("Notifying ourselves");
Tcl_NotifyChannel(statePtr->self, mask);
statePtr->want = 0;
dprintf("Returning");
return;
}
/*
*-----------------------------------------------------------------------------
*
* TlsWatchProc --
|
|
|
|
|
|
|
|
<
<
<
|
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
|
*/
static void TlsChannelHandlerTimer(
ClientData clientData) /* Socket state. */
{
State *statePtr = (State *) clientData;
int mask = statePtr->want; /* Init to SSL_ERROR_WANT_READ and SSL_ERROR_WANT_WRITE */
dprintf("Called with mask 0x%02x", mask);
statePtr->timer = (Tcl_TimerToken) NULL;
/* Check for amount of data pending in IO or BIO write buffer */
if (Tcl_OutputBuffered(statePtr->self) || BIO_wpending(statePtr->bio)) {
dprintf("[chan=%p] BIO writable", statePtr->self);
mask |= TCL_WRITABLE;
}
/* Check for amount of data pending in IO or BIO read buffer */
if (Tcl_InputBuffered(statePtr->self) || BIO_pending(statePtr->bio)) {
dprintf("[chan=%p] BIO readable", statePtr->self);
mask |= TCL_READABLE;
}
/* Notify the generic IO layer that mask events have occurred on the channel */
dprintf("Notifying ourselves with mask=%d", mask);
Tcl_NotifyChannel(statePtr->self, mask);
statePtr->want = 0;
return;
}
/*
*-----------------------------------------------------------------------------
*
* TlsWatchProc --
|
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
|
watchProc(Tcl_GetChannelInstanceData(parent), mask);
/* Do we have any pending events */
pending = (statePtr->want || \
((mask & TCL_READABLE) && ((Tcl_InputBuffered(statePtr->self) > 0) || (BIO_ctrl_pending(statePtr->bio) > 0))) ||
((mask & TCL_WRITABLE) && ((Tcl_OutputBuffered(statePtr->self) > 0) || (BIO_ctrl_wpending(statePtr->bio) > 0))));
dprintf("IO Want=%d, input buffer=%d, output buffer=%d, BIO pending=%zd, BIO wpending=%zd", \
statePtr->want, Tcl_InputBuffered(statePtr->self), Tcl_OutputBuffered(statePtr->self), \
BIO_ctrl_pending(statePtr->bio), BIO_ctrl_wpending(statePtr->bio));
if (!(mask & TCL_READABLE) || pending == 0) {
/* Remove timer, if any */
if (statePtr->timer != (Tcl_TimerToken) NULL) {
dprintf("A timer was found, deleting it");
Tcl_DeleteTimerHandler(statePtr->timer);
statePtr->timer = (Tcl_TimerToken) NULL;
|
|
|
|
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
|
watchProc(Tcl_GetChannelInstanceData(parent), mask);
/* Do we have any pending events */
pending = (statePtr->want || \
((mask & TCL_READABLE) && ((Tcl_InputBuffered(statePtr->self) > 0) || (BIO_ctrl_pending(statePtr->bio) > 0))) ||
((mask & TCL_WRITABLE) && ((Tcl_OutputBuffered(statePtr->self) > 0) || (BIO_ctrl_wpending(statePtr->bio) > 0))));
dprintf("IO Want=%d, input buffer=%d, output buffer=%d, BIO pending=%zd, BIO wpending=%zd, pending=%d", \
statePtr->want, Tcl_InputBuffered(statePtr->self), Tcl_OutputBuffered(statePtr->self), \
BIO_ctrl_pending(statePtr->bio), BIO_ctrl_wpending(statePtr->bio), pending);
if (!(mask & TCL_READABLE) || pending == 0) {
/* Remove timer, if any */
if (statePtr->timer != (Tcl_TimerToken) NULL) {
dprintf("A timer was found, deleting it");
Tcl_DeleteTimerHandler(statePtr->timer);
statePtr->timer = (Tcl_TimerToken) NULL;
|
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
|
ClientData instanceData, /* Socket state. */
int mask) /* type of event that occurred: OR-ed
* combination of TCL_READABLE or TCL_WRITABLE */
{
State *statePtr = (State *) instanceData;
int errorCode = 0;
dprintf("Called");
/*
* Delete an existing timer. It was not fired, yet we are
* here, so the channel below generated such an event and we
* don't have to. The renewal of the interest after the
* execution of channel handlers will eventually cause us to
* recreate the timer (in WatchProc).
*/
if (statePtr->timer != (Tcl_TimerToken) NULL) {
Tcl_DeleteTimerHandler(statePtr->timer);
statePtr->timer = (Tcl_TimerToken) NULL;
}
/* Skip if user verify callback is still running */
if (statePtr->flags & TLS_TCL_CALLBACK) {
dprintf("Callback is on-going, returning failed");
return 0;
}
/* If not initialized, do connect */
if (statePtr->flags & TLS_TCL_INIT) {
|
|
<
<
<
<
<
<
<
<
<
<
<
<
|
>
|
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
|
ClientData instanceData, /* Socket state. */
int mask) /* type of event that occurred: OR-ed
* combination of TCL_READABLE or TCL_WRITABLE */
{
State *statePtr = (State *) instanceData;
int errorCode = 0;
dprintf("Called with mask 0x%02x", mask);
/* Abort if the user verify callback is still running to avoid triggering
* another call before the current one is complete. */
if (statePtr->flags & TLS_TCL_CALLBACK) {
dprintf("Callback is on-going, returning failed");
return 0;
}
/* If not initialized, do connect */
if (statePtr->flags & TLS_TCL_INIT) {
|
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
|
return 0;
}
dprintf("Tls_WaitForConnect returned an error");
}
}
dprintf("Returning %i", mask);
/*
* An event occurred in the underlying channel. This
* transformation doesn't process such events thus returns the
* incoming mask unchanged.
*/
return mask;
}
/*
*-----------------------------------------------------------------------------
*
* Tls_ChannelType --
|
<
>
>
>
>
>
>
>
>
>
|
>
|
|
<
>
|
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
|
return 0;
}
dprintf("Tls_WaitForConnect returned an error");
}
}
/*
* Delete an existing timer. It was not fired, yet we are here, so the
* channel below generated such an event and we don't have to. The renewal
* of the interest after the execution of channel handlers will eventually
* cause us to recreate the timer (in WatchProc).
*/
if (statePtr->timer != (Tcl_TimerToken) NULL) {
Tcl_DeleteTimerHandler(statePtr->timer);
statePtr->timer = (Tcl_TimerToken) NULL;
}
/*
* An event occurred in the underlying channel. This transformation doesn't
* process such events thus returns the incoming mask unchanged.
*/
dprintf("Returning %i", mask);
return mask;
}
/*
*-----------------------------------------------------------------------------
*
* Tls_ChannelType --
|