0000: 2f 2a 0a 20 2a 20 50 72 6f 76 69 64 65 73 20 43 /*. * Provides C
0010: 75 73 74 6f 6d 20 42 49 4f 20 6c 61 79 65 72 20 ustom BIO layer
0020: 74 6f 20 69 6e 74 65 72 66 61 63 65 20 4f 70 65 to interface Ope
0030: 6e 53 53 4c 20 77 69 74 68 20 54 43 4c 2e 20 54 nSSL with TCL. T
0040: 68 65 73 65 0a 20 2a 20 66 75 6e 63 74 69 6f 6e hese. * function
0050: 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 65 72 s directly inter
0060: 66 61 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 face between the
0070: 20 49 4f 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 IO channel and
0080: 42 49 4f 20 62 75 66 66 65 72 73 2e 0a 20 2a 0a BIO buffers.. *.
0090: 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 * Copyright (C)
00a0: 20 31 39 39 37 2d 32 30 30 30 20 4d 61 74 74 20 1997-2000 Matt
00b0: 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 6e 6f 76 Newman <matt@nov
00c0: 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a 20 43 6f adigm.com>. * Co
00d0: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 32 34 pyright (C) 2024
00e0: 20 42 72 69 61 6e 20 4f 27 48 61 67 61 6e 0a 20 Brian O'Hagan.
00f0: 2a 0a 20 2a 2f 0a 0a 2f 2a 0a 09 09 74 6c 73 42 *. */../*...tlsB
0100: 49 4f 2e 63 09 09 09 09 74 6c 73 49 4f 2e 63 0a IO.c....tlsIO.c.
0110: 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 +------+
0120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0130: 20 20 20 2b 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 +-----+
0140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b +
0160: 2d 2d 2d 2d 2d 2d 2b 0a 20 20 7c 20 20 20 20 20 ------+. |
0170: 20 7c 54 63 6c 5f 57 72 69 74 65 52 61 77 20 3c |Tcl_WriteRaw <
0180: 2d 2d 20 42 69 6f 57 72 69 74 65 7c 20 53 53 4c -- BioWrite| SSL
0190: 20 7c 42 49 4f 5f 77 72 69 74 65 20 3c 2d 2d 20 |BIO_write <--
01a0: 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 3c 2d TlsOutputProc <-
01b0: 2d 20 57 72 69 74 65 7c 20 20 20 20 20 20 7c 0a - Write| |.
01c0: 20 20 7c 73 6f 63 6b 65 74 7c 20 20 20 20 20 20 |socket|
01d0: 3c 65 6e 63 72 79 70 74 65 64 3e 20 20 20 20 20 <encrypted>
01e0: 20 20 20 7c 20 42 49 4f 20 7c 20 20 20 20 20 20 | BIO |
01f0: 20 20 20 20 20 20 3c 75 6e 65 6e 63 72 79 70 74 <unencrypt
0200: 65 64 3e 20 20 20 20 20 20 20 20 20 20 20 20 7c ed> |
0210: 20 41 70 70 20 20 7c 20 0a 20 20 7c 20 20 20 20 App | . |
0220: 20 20 7c 54 63 6c 5f 52 65 61 64 52 61 77 20 20 |Tcl_ReadRaw
0230: 2d 2d 3e 20 20 42 69 6f 52 65 61 64 7c 20 20 20 --> BioRead|
0240: 20 20 7c 42 49 4f 5f 52 65 61 64 20 20 2d 2d 3e |BIO_Read -->
0250: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 20 2d TlsInputProc -
0260: 2d 3e 20 20 52 65 61 64 7c 20 20 20 20 20 20 7c -> Read| |
0270: 0a 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 . +------+
0280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0290: 20 20 20 20 2b 2d 2d 2d 2d 2d 2b 20 20 20 20 20 +-----+
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
02c0: 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a 2f 0a 0a 23 69 6e +------+.*/..#in
02d0: 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 clude "tlsInt.h"
02e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 .#include <opens
02f0: 73 6c 2f 62 69 6f 2e 68 3e 0a 0a 2f 2a 20 44 65 sl/bio.h>../* De
0300: 66 69 6e 65 20 42 49 4f 20 6d 65 74 68 6f 64 73 fine BIO methods
0310: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 structure */.st
0320: 61 74 69 63 20 42 49 4f 5f 4d 45 54 48 4f 44 20 atic BIO_METHOD
0330: 2a 42 69 6f 4d 65 74 68 6f 64 73 20 3d 20 4e 55 *BioMethods = NU
0340: 4c 4c 3b 0a 0a 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d LL;..../*. *----
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
03a0: 42 49 4f 53 68 6f 75 6c 64 52 65 74 72 79 20 2d BIOShouldRetry -
03b0: 2d 0a 20 2a 0a 20 2a 09 44 65 74 65 72 6d 69 6e -. *. *.Determin
03c0: 65 20 69 66 20 73 68 6f 75 6c 64 20 72 65 74 72 e if should retr
03d0: 79 20 6f 70 65 72 61 74 69 6f 6e 20 62 61 73 65 y operation base
03e0: 64 20 6f 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e d on error code.
03f0: 20 53 61 6d 65 0a 20 2a 09 63 6f 6e 64 69 74 69 Same. *.conditi
0400: 6f 6e 73 20 61 73 20 42 49 4f 5f 73 6f 63 6b 5f ons as BIO_sock_
0410: 73 68 6f 75 6c 64 5f 72 65 74 72 79 20 66 75 6e should_retry fun
0420: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 ction.. *. * Res
0430: 75 6c 74 73 3a 0a 20 2a 09 31 20 3d 20 72 65 74 ults:. *.1 = ret
0440: 72 79 2c 20 30 20 3d 20 6e 6f 20 72 65 74 72 79 ry, 0 = no retry
0450: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
0460: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a cts:. *.None. *.
0470: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
0480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
04c0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 */..static int
04d0: 42 49 4f 53 68 6f 75 6c 64 52 65 74 72 79 28 69 BIOShouldRetry(i
04e0: 6e 74 20 63 6f 64 65 29 20 7b 0a 20 20 20 20 69 nt code) {. i
04f0: 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 nt res = 0;.
0500: 64 70 72 69 6e 74 66 28 22 42 49 4f 53 68 6f 75 dprintf("BIOShou
0510: 6c 64 52 65 74 72 79 20 25 64 3d 25 73 22 2c 20 ldRetry %d=%s",
0520: 63 6f 64 65 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d code, Tcl_ErrnoM
0530: 73 67 28 63 6f 64 65 29 29 3b 0a 0a 20 20 20 20 sg(code));..
0540: 69 66 20 28 63 6f 64 65 20 3d 3d 20 45 41 47 41 if (code == EAGA
0550: 49 4e 20 7c 7c 20 63 6f 64 65 20 3d 3d 20 45 57 IN || code == EW
0560: 4f 55 4c 44 42 4c 4f 43 4b 20 7c 7c 20 63 6f 64 OULDBLOCK || cod
0570: 65 20 3d 3d 20 45 4e 4f 54 43 4f 4e 4e 20 7c 7c e == ENOTCONN ||
0580: 20 63 6f 64 65 20 3d 3d 20 45 50 52 4f 54 4f 20 code == EPROTO
0590: 7c 7c 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 ||.#ifdef _WIN32
05a0: 0a 09 63 6f 64 65 20 3d 3d 20 57 53 41 45 57 4f ..code == WSAEWO
05b0: 55 4c 44 42 4c 4f 43 4b 20 7c 7c 0a 23 65 6e 64 ULDBLOCK ||.#end
05c0: 69 66 0a 09 63 6f 64 65 20 3d 3d 20 45 49 4e 54 if..code == EINT
05d0: 52 20 7c 7c 20 63 6f 64 65 20 3d 3d 20 45 49 4e R || code == EIN
05e0: 50 52 4f 47 52 45 53 53 20 7c 7c 20 63 6f 64 65 PROGRESS || code
05f0: 20 3d 3d 20 45 41 4c 52 45 41 44 59 29 20 7b 0a == EALREADY) {.
0600: 09 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a .res = 1;. }.
0610: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 . dprintf("BI
0620: 4f 53 68 6f 75 6c 64 52 65 74 72 79 20 25 64 3d OShouldRetry %d=
0630: 25 73 2c 20 72 65 73 3d 25 64 22 2c 20 63 6f 64 %s, res=%d", cod
0640: 65 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 e, Tcl_ErrnoMsg(
0650: 63 6f 64 65 29 2c 20 72 65 73 29 3b 0a 0a 20 20 code), res);..
0660: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
0670: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06c0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 69 6f 57 72 69 ---. *. * BioWri
06d0: 74 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 te --. *. *.This
06e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 function is use
06f0: 64 20 74 6f 20 72 65 61 64 20 65 6e 63 72 79 70 d to read encryp
0700: 74 65 64 20 64 61 74 61 20 66 72 6f 6d 20 74 68 ted data from th
0710: 65 20 42 49 4f 20 61 6e 64 20 77 72 69 74 65 20 e BIO and write
0720: 69 74 0a 20 2a 09 69 6e 74 6f 20 74 68 65 20 73 it. *.into the s
0730: 6f 63 6b 65 74 2e 20 54 68 69 73 20 66 75 6e 63 ocket. This func
0740: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61 6c tion will be cal
0750: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 led in response
0760: 74 6f 20 74 68 65 0a 20 2a 09 61 70 70 6c 69 63 to the. *.applic
0770: 61 74 69 6f 6e 20 63 61 6c 6c 69 6e 67 20 74 68 ation calling th
0780: 65 20 42 49 4f 5f 77 72 69 74 65 5f 65 78 28 29 e BIO_write_ex()
0790: 20 6f 72 20 42 49 4f 5f 77 72 69 74 65 28 29 20 or BIO_write()
07a0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a functions.. *. *
07b0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 Results:. *.Ret
07c0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 urns the number
07d0: 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e of bytes written
07e0: 20 74 6f 20 63 68 61 6e 6e 65 6c 2c 20 30 20 66 to channel, 0 f
07f0: 6f 72 20 45 4f 46 2c 20 6f 72 20 2d 31 20 66 6f or EOF, or -1 fo
0800: 72 0a 20 2a 09 65 72 72 6f 72 2e 0a 20 2a 0a 20 r. *.error.. *.
0810: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0820: 20 2a 09 57 72 69 74 65 73 20 42 49 4f 20 64 61 *.Writes BIO da
0830: 74 61 20 74 6f 20 63 68 61 6e 6e 65 6c 2e 0a 20 ta to channel..
0840: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0890: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
08a0: 74 20 42 69 6f 57 72 69 74 65 28 42 49 4f 20 2a t BioWrite(BIO *
08b0: 62 69 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 bio, const char
08c0: 2a 62 75 66 2c 20 69 6e 74 20 62 75 66 4c 65 6e *buf, int bufLen
08d0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 ) {. Tcl_Size
08e0: 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 ret;. int is
08f0: 5f 65 6f 66 2c 20 74 63 6c 45 72 72 6e 6f 3b 0a _eof, tclErrno;.
0900: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
0910: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr = (State *)
0920: 42 49 4f 5f 67 65 74 5f 64 61 74 61 28 62 69 6f BIO_get_data(bio
0930: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e );. Tcl_Chann
0940: 65 6c 20 63 68 61 6e 20 3d 20 54 6c 73 5f 47 65 el chan = Tls_Ge
0950: 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 tParent(statePtr
0960: 2c 20 30 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e , 0);.. dprin
0970: 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 69 tf("[chan=%p] Bi
0980: 6f 57 72 69 74 65 28 62 69 6f 3d 25 70 2c 20 62 oWrite(bio=%p, b
0990: 75 66 3d 25 70 2c 20 6c 65 6e 3d 25 64 29 22 2c uf=%p, len=%d)",
09a0: 20 28 76 6f 69 64 20 2a 29 63 68 61 6e 2c 20 28 (void *)chan, (
09b0: 76 6f 69 64 20 2a 29 20 62 69 6f 2c 20 62 75 66 void *) bio, buf
09c0: 2c 20 62 75 66 4c 65 6e 29 3b 0a 0a 20 20 20 20 , bufLen);..
09d0: 42 49 4f 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f BIO_clear_retry_
09e0: 66 6c 61 67 73 28 62 69 6f 29 3b 0a 20 20 20 20 flags(bio);.
09f0: 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 30 29 3b Tcl_SetErrno(0);
0a00: 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 64 .. /* Write d
0a10: 61 74 61 20 74 6f 20 75 6e 64 65 72 6c 79 69 6e ata to underlyin
0a20: 67 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 g channel */.
0a30: 20 72 65 74 20 3d 20 54 63 6c 5f 57 72 69 74 65 ret = Tcl_Write
0a40: 52 61 77 28 63 68 61 6e 2c 20 62 75 66 2c 20 28 Raw(chan, buf, (
0a50: 54 63 6c 5f 53 69 7a 65 29 20 62 75 66 4c 65 6e Tcl_Size) bufLen
0a60: 29 3b 0a 20 20 20 20 69 73 5f 65 6f 66 20 3d 20 );. is_eof =
0a70: 54 63 6c 5f 45 6f 66 28 63 68 61 6e 29 3b 0a 20 Tcl_Eof(chan);.
0a80: 20 20 20 74 63 6c 45 72 72 6e 6f 20 3d 20 54 63 tclErrno = Tc
0a90: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 l_GetErrno();..
0aa0: 20 20 20 64 70 72 69 6e 74 66 28 22 5b 63 68 61 dprintf("[cha
0ab0: 6e 3d 25 70 5d 20 42 69 6f 57 72 69 74 65 28 25 n=%p] BioWrite(%
0ac0: 64 29 20 2d 3e 20 25 22 20 54 43 4c 5f 53 49 5a d) -> %" TCL_SIZ
0ad0: 45 5f 4d 4f 44 49 46 49 45 52 20 22 64 20 5b 74 E_MODIFIER "d [t
0ae0: 63 6c 45 6f 66 3d 25 64 3b 20 74 63 6c 45 72 72 clEof=%d; tclErr
0af0: 6e 6f 3d 25 64 3a 20 25 73 5d 22 2c 0a 09 28 76 no=%d: %s]",..(v
0b00: 6f 69 64 20 2a 29 20 63 68 61 6e 2c 20 62 75 66 oid *) chan, buf
0b10: 4c 65 6e 2c 20 72 65 74 2c 20 69 73 5f 65 6f 66 Len, ret, is_eof
0b20: 2c 20 74 63 6c 45 72 72 6e 6f 2c 20 54 63 6c 5f , tclErrno, Tcl_
0b30: 45 72 72 6e 6f 4d 73 67 28 74 63 6c 45 72 72 6e ErrnoMsg(tclErrn
0b40: 6f 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 o));.. if (re
0b50: 74 20 3e 20 30 29 20 7b 0a 09 64 70 72 69 6e 74 t > 0) {..dprint
0b60: 66 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 f("Successfully
0b70: 77 72 6f 74 65 20 25 22 20 54 43 4c 5f 53 49 5a wrote %" TCL_SIZ
0b80: 45 5f 4d 4f 44 49 46 49 45 52 20 22 64 20 62 79 E_MODIFIER "d by
0b90: 74 65 73 20 6f 66 20 64 61 74 61 22 2c 20 72 65 tes of data", re
0ba0: 74 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 t);.. } else
0bb0: 69 66 20 28 72 65 74 20 3d 3d 20 30 29 20 7b 0a if (ret == 0) {.
0bc0: 09 69 66 20 28 69 73 5f 65 6f 66 29 20 7b 0a 09 .if (is_eof) {..
0bd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 dprintf("Got
0be0: 20 45 4f 46 20 77 68 69 6c 65 20 77 72 69 74 69 EOF while writi
0bf0: 6e 67 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20 ng, returning a
0c00: 43 6f 6e 6e 65 63 74 69 6f 6e 20 52 65 73 65 74 Connection Reset
0c10: 20 65 72 72 6f 72 20 77 68 69 63 68 20 6d 61 70 error which map
0c20: 73 20 74 6f 20 53 6f 66 74 20 45 4f 46 22 29 3b s to Soft EOF");
0c30: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 ..Tcl_SetErrno(E
0c40: 43 4f 4e 4e 52 45 53 45 54 29 3b 0a 09 20 20 20 CONNRESET);..
0c50: 20 42 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 62 BIO_set_flags(b
0c60: 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 49 4e io, BIO_FLAGS_IN
0c70: 5f 45 4f 46 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 _EOF);...} else
0c80: 7b 0a 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 {..dprintf("Got
0c90: 30 20 66 72 6f 6d 20 54 63 6c 5f 57 72 69 74 65 0 from Tcl_Write
0ca0: 52 61 77 2c 20 61 6e 64 20 45 4f 46 20 69 73 20 Raw, and EOF is
0cb0: 6e 6f 74 20 73 65 74 3b 20 72 65 74 20 3d 20 30 not set; ret = 0
0cc0: 22 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 ");.. BIO_set
0cd0: 5f 72 65 74 72 79 5f 77 72 69 74 65 28 62 69 6f _retry_write(bio
0ce0: 29 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 53 65 );...dprintf("Se
0cf0: 74 74 69 6e 67 20 72 65 74 72 79 20 72 65 61 64 tting retry read
0d00: 20 66 6c 61 67 22 29 3b 0a 09 42 49 4f 5f 73 65 flag");..BIO_se
0d10: 74 5f 72 65 74 72 79 5f 72 65 61 64 28 62 69 6f t_retry_read(bio
0d20: 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 );..}.. } els
0d30: 65 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 57 65 e {..dprintf("We
0d40: 20 67 6f 74 20 73 6f 6d 65 20 6b 69 6e 64 20 6f got some kind o
0d50: 66 20 49 2f 4f 20 65 72 72 6f 72 22 29 3b 0a 0a f I/O error");..
0d60: 09 69 66 20 28 42 49 4f 53 68 6f 75 6c 64 52 65 .if (BIOShouldRe
0d70: 74 72 79 28 74 63 6c 45 72 72 6e 6f 29 29 20 7b try(tclErrno)) {
0d80: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 .. dprintf("T
0d90: 72 79 20 61 67 61 69 6e 20 66 6f 72 3a 20 25 69 ry again for: %i
0da0: 3d 25 73 22 2c 20 74 63 6c 45 72 72 6e 6f 2c 20 =%s", tclErrno,
0db0: 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 74 63 6c Tcl_ErrnoMsg(tcl
0dc0: 45 72 72 6e 6f 29 29 3b 0a 09 20 20 20 20 42 49 Errno));.. BI
0dd0: 4f 5f 73 65 74 5f 72 65 74 72 79 5f 77 72 69 74 O_set_retry_writ
0de0: 65 28 62 69 6f 29 3b 0a 0a 09 7d 20 65 6c 73 65 e(bio);...} else
0df0: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
0e00: 22 55 6e 65 78 70 65 63 74 65 64 20 65 72 72 6f "Unexpected erro
0e10: 72 3a 20 25 69 3d 25 73 22 2c 20 74 63 6c 45 72 r: %i=%s", tclEr
0e20: 72 6e 6f 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 rno, Tcl_ErrnoMs
0e30: 67 28 74 63 6c 45 72 72 6e 6f 29 29 3b 0a 09 7d g(tclErrno));..}
0e40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
0e50: 6e 74 66 28 22 42 69 6f 57 72 69 74 65 20 72 65 ntf("BioWrite re
0e60: 74 75 72 6e 69 6e 67 20 25 22 20 54 43 4c 5f 53 turning %" TCL_S
0e70: 49 5a 45 5f 4d 4f 44 49 46 49 45 52 20 22 64 22 IZE_MODIFIER "d"
0e80: 2c 20 72 65 74 29 3b 0a 20 20 20 20 72 65 74 75 , ret);. retu
0e90: 72 6e 20 28 69 6e 74 29 20 72 65 74 3b 0a 7d 0a rn (int) ret;.}.
0ea0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 69 6f 52 65 61 ---. *. * BioRea
0f00: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 d --. *. *.This
0f10: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 function is used
0f20: 20 74 6f 20 72 65 61 64 20 65 6e 63 72 79 70 74 to read encrypt
0f30: 65 64 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 ed data from the
0f40: 20 73 6f 63 6b 65 74 20 61 6e 64 0a 20 2a 09 77 socket and. *.w
0f50: 72 69 74 65 20 69 74 20 69 6e 74 6f 20 74 68 65 rite it into the
0f60: 20 42 49 4f 2e 20 54 68 69 73 20 66 75 6e 63 74 BIO. This funct
0f70: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c ion will be call
0f80: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 ed in response t
0f90: 6f 20 74 68 65 0a 20 2a 09 61 70 70 6c 69 63 61 o the. *.applica
0fa0: 74 69 6f 6e 20 63 61 6c 6c 69 6e 67 20 74 68 65 tion calling the
0fb0: 20 42 49 4f 5f 72 65 61 64 5f 65 78 28 29 20 6f BIO_read_ex() o
0fc0: 72 20 42 49 4f 5f 72 65 61 64 28 29 20 66 75 6e r BIO_read() fun
0fd0: 63 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 20 52 65 ctions.. *. * Re
0fe0: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e sults:. *.Return
0ff0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
1000: 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 bytes read from
1010: 63 68 61 6e 6e 65 6c 2c 20 30 20 66 6f 72 20 45 channel, 0 for E
1020: 4f 46 2c 20 6f 72 20 2d 31 20 66 6f 72 0a 20 2a OF, or -1 for. *
1030: 09 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 53 69 .error.. *. * Si
1040: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 de effects:. *.R
1050: 65 61 64 73 20 63 68 61 6e 6e 65 6c 20 64 61 74 eads channel dat
1060: 61 20 69 6e 74 6f 20 42 49 4f 2e 0a 20 2a 0a 20 a into BIO.. *.
1070: 2a 20 44 61 74 61 20 69 73 20 72 65 63 65 69 76 * Data is receiv
1080: 65 64 20 69 6e 20 77 68 6f 6c 65 20 62 6c 6f 63 ed in whole bloc
1090: 6b 73 20 6b 6e 6f 77 6e 20 61 73 20 72 65 63 6f ks known as reco
10a0: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 70 65 65 rds from the pee
10b0: 72 2e 20 41 20 77 68 6f 6c 65 0a 20 2a 20 72 65 r. A whole. * re
10c0: 63 6f 72 64 20 69 73 20 70 72 6f 63 65 73 73 65 cord is processe
10d0: 64 20 28 65 2e 67 2e 20 64 65 63 72 79 70 74 65 d (e.g. decrypte
10e0: 64 29 20 69 6e 20 6f 6e 65 20 67 6f 20 61 6e 64 d) in one go and
10f0: 20 69 73 20 62 75 66 66 65 72 65 64 20 62 79 20 is buffered by
1100: 4f 70 65 6e 53 53 4c 0a 20 2a 20 75 6e 74 69 6c OpenSSL. * until
1110: 20 69 74 20 69 73 20 72 65 61 64 20 62 79 20 74 it is read by t
1120: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 76 he application v
1130: 69 61 20 61 20 63 61 6c 6c 20 74 6f 20 53 53 4c ia a call to SSL
1140: 5f 72 65 61 64 2e 20 53 53 4c 5f 70 65 6e 64 69 _read. SSL_pendi
1150: 6e 67 28 29 0a 20 2a 20 72 65 74 75 72 6e 73 20 ng(). * returns
1160: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 the number of by
1170: 74 65 73 20 77 68 69 63 68 20 68 61 76 65 20 62 tes which have b
1180: 65 65 6e 20 70 72 6f 63 65 73 73 65 64 2c 20 62 een processed, b
1190: 75 66 66 65 72 65 64 2c 20 61 6e 64 20 61 72 65 uffered, and are
11a0: 0a 20 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 6e . * available in
11b0: 73 69 64 65 20 73 73 6c 20 66 6f 72 20 69 6d 6d side ssl for imm
11c0: 65 64 69 61 74 65 20 72 65 61 64 2e 20 53 53 4c ediate read. SSL
11d0: 5f 68 61 73 5f 70 65 6e 64 69 6e 67 28 29 20 72 _has_pending() r
11e0: 65 74 75 72 6e 73 20 31 20 69 66 0a 20 2a 20 64 eturns 1 if. * d
11f0: 61 74 61 20 69 73 20 62 75 66 66 65 72 65 64 20 ata is buffered
1200: 28 77 68 65 74 68 65 72 20 70 72 6f 63 65 73 73 (whether process
1210: 65 64 20 6f 72 20 75 6e 70 72 6f 63 65 73 73 65 ed or unprocesse
1220: 64 29 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 d) and 0 otherwi
1230: 73 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d se.. *. *-------
1240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1280: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
1290: 69 63 20 69 6e 74 20 42 69 6f 52 65 61 64 28 42 ic int BioRead(B
12a0: 49 4f 20 2a 62 69 6f 2c 20 63 68 61 72 20 2a 62 IO *bio, char *b
12b0: 75 66 2c 20 69 6e 74 20 62 75 66 4c 65 6e 29 20 uf, int bufLen)
12c0: 7b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 72 {. Tcl_Size r
12d0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 et = 0;. int
12e0: 69 73 5f 65 6f 66 2c 20 74 63 6c 45 72 72 6e 6f is_eof, tclErrno
12f0: 2c 20 69 73 5f 62 6c 6f 63 6b 65 64 3b 0a 20 20 , is_blocked;.
1300: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
1310: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 42 49 r = (State *) BI
1320: 4f 5f 67 65 74 5f 64 61 74 61 28 62 69 6f 29 3b O_get_data(bio);
1330: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
1340: 20 63 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 chan = Tls_GetP
1350: 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 arent(statePtr,
1360: 30 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 0);.. dprintf
1370: 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 69 6f 52 ("[chan=%p] BioR
1380: 65 61 64 28 62 69 6f 3d 25 70 2c 20 62 75 66 3d ead(bio=%p, buf=
1390: 25 70 2c 20 6c 65 6e 3d 25 64 29 22 2c 20 28 76 %p, len=%d)", (v
13a0: 6f 69 64 20 2a 29 20 63 68 61 6e 2c 20 28 76 6f oid *) chan, (vo
13b0: 69 64 20 2a 29 20 62 69 6f 2c 20 62 75 66 2c 20 id *) bio, buf,
13c0: 62 75 66 4c 65 6e 29 3b 0a 0a 20 20 20 20 69 66 bufLen);.. if
13d0: 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 20 7c 7c (buf == NULL ||
13e0: 20 62 75 66 4c 65 6e 20 3c 3d 20 30 29 20 7b 0a bufLen <= 0) {.
13f0: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d .return 0;. }
1400: 0a 0a 20 20 20 20 42 49 4f 5f 63 6c 65 61 72 5f .. BIO_clear_
1410: 72 65 74 72 79 5f 66 6c 61 67 73 28 62 69 6f 29 retry_flags(bio)
1420: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 ;. Tcl_SetErr
1430: 6e 6f 28 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 no(0);.. /* R
1440: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 75 6e ead data from un
1450: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c derlying channel
1460: 20 2a 2f 0a 20 20 20 20 72 65 74 20 3d 20 54 63 */. ret = Tc
1470: 6c 5f 52 65 61 64 52 61 77 28 63 68 61 6e 2c 20 l_ReadRaw(chan,
1480: 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 buf, (Tcl_Size)
1490: 62 75 66 4c 65 6e 29 3b 0a 0a 20 20 20 20 69 73 bufLen);.. is
14a0: 5f 65 6f 66 20 3d 20 54 63 6c 5f 45 6f 66 28 63 _eof = Tcl_Eof(c
14b0: 68 61 6e 29 3b 0a 20 20 20 20 74 63 6c 45 72 72 han);. tclErr
14c0: 6e 6f 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e no = Tcl_GetErrn
14d0: 6f 28 29 3b 0a 20 20 20 20 69 73 5f 62 6c 6f 63 o();. is_bloc
14e0: 6b 65 64 20 3d 20 54 63 6c 5f 49 6e 70 75 74 42 ked = Tcl_InputB
14f0: 6c 6f 63 6b 65 64 28 63 68 61 6e 29 3b 0a 0a 20 locked(chan);..
1500: 20 20 20 64 70 72 69 6e 74 66 28 22 5b 63 68 61 dprintf("[cha
1510: 6e 3d 25 70 5d 20 42 69 6f 52 65 61 64 28 25 64 n=%p] BioRead(%d
1520: 29 20 2d 3e 20 25 22 20 54 43 4c 5f 53 49 5a 45 ) -> %" TCL_SIZE
1530: 5f 4d 4f 44 49 46 49 45 52 20 22 64 20 5b 74 63 _MODIFIER "d [tc
1540: 6c 45 6f 66 3d 25 64 3b 20 62 6c 6f 63 6b 65 64 lEof=%d; blocked
1550: 3d 25 64 3b 20 74 63 6c 45 72 72 6e 6f 3d 25 64 =%d; tclErrno=%d
1560: 3a 20 25 73 5d 22 2c 0a 09 28 76 6f 69 64 20 2a : %s]",..(void *
1570: 29 20 63 68 61 6e 2c 20 62 75 66 4c 65 6e 2c 20 ) chan, bufLen,
1580: 72 65 74 2c 20 69 73 5f 65 6f 66 2c 20 69 73 5f ret, is_eof, is_
1590: 62 6c 6f 63 6b 65 64 2c 20 74 63 6c 45 72 72 6e blocked, tclErrn
15a0: 6f 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 o, Tcl_ErrnoMsg(
15b0: 74 63 6c 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 20 tclErrno));..
15c0: 20 69 66 20 28 72 65 74 20 3e 20 30 29 20 7b 0a if (ret > 0) {.
15d0: 09 64 70 72 69 6e 74 66 28 22 53 75 63 63 65 73 .dprintf("Succes
15e0: 73 66 75 6c 6c 79 20 72 65 61 64 20 25 22 20 54 sfully read %" T
15f0: 43 4c 5f 53 49 5a 45 5f 4d 4f 44 49 46 49 45 52 CL_SIZE_MODIFIER
1600: 20 22 64 20 62 79 74 65 73 20 6f 66 20 64 61 74 "d bytes of dat
1610: 61 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 7d a", ret);.. }
1620: 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3d 3d else if (ret ==
1630: 20 30 29 20 7b 0a 09 69 66 20 28 69 73 5f 65 6f 0) {..if (is_eo
1640: 66 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 f) {.. dprint
1650: 66 28 22 47 6f 74 20 45 4f 46 20 77 68 69 6c 65 f("Got EOF while
1660: 20 72 65 61 64 69 6e 67 2c 20 72 65 74 75 72 6e reading, return
1670: 69 6e 67 20 61 20 43 6f 6e 6e 65 63 74 69 6f 6e ing a Connection
1680: 20 52 65 73 65 74 20 65 72 72 6f 72 20 77 68 69 Reset error whi
1690: 63 68 20 6d 61 70 73 20 74 6f 20 53 6f 66 74 20 ch maps to Soft
16a0: 45 4f 46 22 29 3b 0a 09 20 20 20 54 63 6c 5f 53 EOF");.. Tcl_S
16b0: 65 74 45 72 72 6e 6f 28 45 43 4f 4e 4e 52 45 53 etErrno(ECONNRES
16c0: 45 54 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 ET);.. BIO_se
16d0: 74 5f 66 6c 61 67 73 28 62 69 6f 2c 20 42 49 4f t_flags(bio, BIO
16e0: 5f 46 4c 41 47 53 5f 49 4e 5f 45 4f 46 29 3b 0a _FLAGS_IN_EOF);.
16f0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 69 73 5f ..} else if (is_
1700: 62 6c 6f 63 6b 65 64 29 20 7b 0a 09 20 20 20 20 blocked) {..
1710: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 69 6e 70 dprintf("Got inp
1720: 75 74 20 62 6c 6f 63 6b 65 64 20 66 72 6f 6d 20 ut blocked from
1730: 54 63 6c 5f 52 65 61 64 52 61 77 22 29 3b 0a 09 Tcl_ReadRaw");..
1740: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 65 74 dprintf("Set
1750: 74 69 6e 67 20 72 65 74 72 79 20 72 65 61 64 20 ting retry read
1760: 66 6c 61 67 22 29 3b 0a 09 20 20 20 20 42 49 4f flag");.. BIO
1770: 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 61 64 28 _set_retry_read(
1780: 62 69 6f 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 bio);..}.. }
1790: 65 6c 73 65 20 7b 0a 09 64 70 72 69 6e 74 66 28 else {..dprintf(
17a0: 22 57 65 20 67 6f 74 20 73 6f 6d 65 20 6b 69 6e "We got some kin
17b0: 64 20 6f 66 20 49 2f 4f 20 65 72 72 6f 72 22 29 d of I/O error")
17c0: 3b 0a 0a 09 69 66 20 28 42 49 4f 53 68 6f 75 6c ;...if (BIOShoul
17d0: 64 52 65 74 72 79 28 74 63 6c 45 72 72 6e 6f 29 dRetry(tclErrno)
17e0: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
17f0: 28 22 54 72 79 20 61 67 61 69 6e 20 66 6f 72 3a ("Try again for:
1800: 20 25 69 3d 25 73 22 2c 20 74 63 6c 45 72 72 6e %i=%s", tclErrn
1810: 6f 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 o, Tcl_ErrnoMsg(
1820: 74 63 6c 45 72 72 6e 6f 29 29 3b 0a 09 20 20 20 tclErrno));..
1830: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72 BIO_set_retry_r
1840: 65 61 64 28 62 69 6f 29 3b 0a 0a 09 7d 20 65 6c ead(bio);...} el
1850: 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 se {.. dprint
1860: 66 28 22 55 6e 65 78 70 65 63 74 65 64 20 65 72 f("Unexpected er
1870: 72 6f 72 3a 20 25 69 3d 25 73 22 2c 20 74 63 6c ror: %i=%s", tcl
1880: 45 72 72 6e 6f 2c 20 54 63 6c 5f 45 72 72 6e 6f Errno, Tcl_Errno
1890: 4d 73 67 28 74 63 6c 45 72 72 6e 6f 29 29 3b 0a Msg(tclErrno));.
18a0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 .}. }.. dp
18b0: 72 69 6e 74 66 28 22 42 69 6f 52 65 61 64 20 72 rintf("BioRead r
18c0: 65 74 75 72 6e 69 6e 67 20 25 22 20 54 43 4c 5f eturning %" TCL_
18d0: 53 49 5a 45 5f 4d 4f 44 49 46 49 45 52 20 22 64 SIZE_MODIFIER "d
18e0: 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 72 65 74 ", ret);. ret
18f0: 75 72 6e 20 28 69 6e 74 29 20 72 65 74 3b 0a 7d urn (int) ret;.}
1900: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1950: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 69 6f 50 75 ----. *. * BioPu
1960: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 ts --. *. *.This
1970: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 function is use
1980: 64 20 74 6f 20 72 65 61 64 20 61 20 4e 55 4c 4c d to read a NULL
1990: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 terminated stri
19a0: 6e 67 20 66 72 6f 6d 20 74 68 65 20 42 49 4f 20 ng from the BIO
19b0: 61 6e 64 0a 20 2a 09 77 72 69 74 65 20 69 74 20 and. *.write it
19c0: 74 6f 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 to the channel.
19d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 This function wi
19e0: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 ll be called in
19f0: 72 65 73 70 6f 6e 73 65 20 74 6f 0a 20 2a 09 74 response to. *.t
1a00: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 he application c
1a10: 61 6c 6c 69 6e 67 20 74 68 65 20 42 49 4f 5f 70 alling the BIO_p
1a20: 75 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a uts() function..
1a30: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
1a40: 2a 09 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75 *.Returns the nu
1a50: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 mber of bytes wr
1a60: 69 74 74 65 6e 20 74 6f 20 63 68 61 6e 6e 65 6c itten to channel
1a70: 20 6f 72 20 30 20 66 6f 72 20 65 72 72 6f 72 2e or 0 for error.
1a80: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
1a90: 63 74 73 3a 0a 20 2a 09 57 72 69 74 65 73 20 64 cts:. *.Writes d
1aa0: 61 74 61 20 74 6f 20 63 68 61 6e 6e 65 6c 2e 0a ata to channel..
1ab0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
1ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b00: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
1b10: 6e 74 20 42 69 6f 50 75 74 73 28 42 49 4f 20 2a nt BioPuts(BIO *
1b20: 62 69 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 bio, const char
1b30: 2a 73 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 *str) {. dpri
1b40: 6e 74 66 28 22 42 69 6f 50 75 74 73 28 25 70 29 ntf("BioPuts(%p)
1b50: 20 5c 22 25 73 5c 22 22 2c 20 62 69 6f 2c 20 73 \"%s\"", bio, s
1b60: 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e tr);.. return
1b70: 20 42 69 6f 57 72 69 74 65 28 62 69 6f 2c 20 73 BioWrite(bio, s
1b80: 74 72 2c 20 28 69 6e 74 29 20 73 74 72 6c 65 6e tr, (int) strlen
1b90: 28 73 74 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a (str));.}../*. *
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1bf0: 0a 20 2a 20 42 69 6f 43 74 72 6c 20 2d 2d 0a 20 . * BioCtrl --.
1c00: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 *. *.This functi
1c10: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 on is used to pr
1c20: 6f 63 65 73 73 20 63 6f 6e 74 72 6f 6c 20 6d 65 ocess control me
1c30: 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 42 49 ssages in the BI
1c40: 4f 2e 20 54 68 69 73 0a 20 2a 09 66 75 6e 63 74 O. This. *.funct
1c50: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c ion will be call
1c60: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 ed in response t
1c70: 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f o the applicatio
1c80: 6e 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 20 2a n calling the. *
1c90: 09 42 49 4f 5f 63 74 72 6c 28 29 20 66 75 6e 63 .BIO_ctrl() func
1ca0: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 tion.. *. * Resu
1cb0: 6c 74 73 3a 0a 20 2a 09 46 75 6e 63 74 69 6f 6e lts:. *.Function
1cc0: 20 64 65 70 65 6e 64 65 6e 74 0a 20 2a 0a 20 2a dependent. *. *
1cd0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
1ce0: 2a 09 46 75 6e 63 74 69 6f 6e 20 64 65 70 65 6e *.Function depen
1cf0: 64 65 6e 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d dent. *. *------
1d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
1d50: 74 69 63 20 6c 6f 6e 67 20 42 69 6f 43 74 72 6c tic long BioCtrl
1d60: 28 42 49 4f 20 2a 62 69 6f 2c 20 69 6e 74 20 63 (BIO *bio, int c
1d70: 6d 64 2c 20 6c 6f 6e 67 20 6e 75 6d 2c 20 76 6f md, long num, vo
1d80: 69 64 20 2a 70 74 72 29 20 7b 0a 20 20 20 20 6c id *ptr) {. l
1d90: 6f 6e 67 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 ong ret = 1;.
1da0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
1db0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 42 49 4f = (State *) BIO
1dc0: 5f 67 65 74 5f 64 61 74 61 28 62 69 6f 29 3b 0a _get_data(bio);.
1dd0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
1de0: 63 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 chan = Tls_GetPa
1df0: 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 30 rent(statePtr, 0
1e00: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
1e10: 22 42 69 6f 43 74 72 6c 28 25 70 2c 20 30 78 25 "BioCtrl(%p, 0x%
1e20: 78 2c 20 30 78 25 6c 78 2c 20 25 70 29 22 2c 20 x, 0x%lx, %p)",
1e30: 28 76 6f 69 64 20 2a 29 20 62 69 6f 2c 20 63 6d (void *) bio, cm
1e40: 64 2c 20 6e 75 6d 2c 20 70 74 72 29 3b 0a 0a 20 d, num, ptr);..
1e50: 20 20 20 73 77 69 74 63 68 20 28 63 6d 64 29 20 switch (cmd)
1e60: 7b 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c {..case BIO_CTRL
1e70: 5f 52 45 53 45 54 3a 0a 09 09 2f 2a 20 6f 70 74 _RESET:.../* opt
1e80: 20 2d 20 52 65 73 65 74 73 20 42 49 4f 20 74 6f - Resets BIO to
1e90: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 2e 20 initial state.
1ea0: 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 72 Implements BIO_r
1eb0: 65 73 65 74 2e 20 2a 2f 0a 09 09 64 70 72 69 6e eset. */...dprin
1ec0: 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c tf("Got BIO_CTRL
1ed0: 5f 52 45 53 45 54 22 29 3b 0a 09 09 2f 2a 20 52 _RESET");.../* R
1ee0: 65 74 75 72 6e 20 31 20 66 6f 72 20 73 75 63 63 eturn 1 for succ
1ef0: 65 73 73 20 28 30 20 66 6f 72 20 66 69 6c 65 20 ess (0 for file
1f00: 42 49 4f 73 29 20 61 6e 64 20 2d 31 20 66 6f 72 BIOs) and -1 for
1f10: 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 72 65 failure */...re
1f20: 74 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a t = 0;...break;.
1f30: 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f 45 .case BIO_CTRL_E
1f40: 4f 46 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 52 OF:.../* opt - R
1f50: 65 74 75 72 6e 73 20 77 68 65 74 68 65 72 20 45 eturns whether E
1f60: 4f 46 20 68 61 73 20 62 65 65 6e 20 72 65 61 63 OF has been reac
1f70: 68 65 64 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 hed. Implements
1f80: 42 49 4f 5f 65 6f 66 2e 20 2a 2f 0a 09 09 64 70 BIO_eof. */...dp
1f90: 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 rintf("Got BIO_C
1fa0: 54 52 4c 5f 45 4f 46 22 29 3b 0a 09 09 2f 2a 20 TRL_EOF");.../*
1fb0: 52 65 74 75 72 6e 73 20 31 20 69 66 20 45 4f 46 Returns 1 if EOF
1fc0: 20 68 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 has been reache
1fd0: 64 2c 20 30 20 69 66 20 6e 6f 74 2c 20 6f 72 20 d, 0 if not, or
1fe0: 3c 30 20 66 6f 72 20 66 61 69 6c 75 72 65 20 2a <0 for failure *
1ff0: 2f 0a 09 09 72 65 74 20 3d 20 28 28 63 68 61 6e /...ret = ((chan
2000: 29 20 3f 20 28 54 63 6c 5f 45 6f 66 28 63 68 61 ) ? (Tcl_Eof(cha
2010: 6e 29 20 7c 7c 20 42 49 4f 5f 74 65 73 74 5f 66 n) || BIO_test_f
2020: 6c 61 67 73 28 62 69 6f 2c 20 42 49 4f 5f 46 4c lags(bio, BIO_FL
2030: 41 47 53 5f 49 4e 5f 45 4f 46 29 29 20 3a 20 31 AGS_IN_EOF)) : 1
2040: 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 );...break;..cas
2050: 65 20 42 49 4f 5f 43 54 52 4c 5f 49 4e 46 4f 3a e BIO_CTRL_INFO:
2060: 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 65 78 74 72 .../* opt - extr
2070: 61 20 69 6e 66 6f 20 6f 6e 20 42 49 4f 2e 20 49 a info on BIO. I
2080: 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 67 65 mplements BIO_ge
2090: 74 5f 6d 65 6d 5f 64 61 74 61 20 2a 2f 0a 09 09 t_mem_data */...
20a0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f dprintf("Got BIO
20b0: 5f 43 54 52 4c 5f 49 4e 46 4f 22 29 3b 0a 09 09 _CTRL_INFO");...
20c0: 72 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b ret = 0;...break
20d0: 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c ;..case BIO_CTRL
20e0: 5f 53 45 54 3a 0a 09 09 2f 2a 20 6d 61 6e 20 2d _SET:.../* man -
20f0: 20 73 65 74 20 74 68 65 20 27 49 4f 27 20 70 61 set the 'IO' pa
2100: 72 61 6d 65 74 65 72 20 2a 2f 0a 09 09 64 70 72 rameter */...dpr
2110: 69 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 intf("Got BIO_CT
2120: 52 4c 5f 53 45 54 22 29 3b 0a 09 09 72 65 74 20 RL_SET");...ret
2130: 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 = 0;...break;..c
2140: 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f 47 45 54 ase BIO_CTRL_GET
2150: 3a 0a 09 09 2f 2a 20 6d 61 6e 20 2d 20 67 65 74 :.../* man - get
2160: 20 74 68 65 20 27 49 4f 27 20 70 61 72 61 6d 65 the 'IO' parame
2170: 74 65 72 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 ter */...dprintf
2180: 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 47 ("Got BIO_CTRL_G
2190: 45 54 20 22 29 3b 0a 09 09 72 65 74 20 3d 20 30 ET ");...ret = 0
21a0: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 ;...break;..case
21b0: 20 42 49 4f 5f 43 54 52 4c 5f 50 55 53 48 3a 0a BIO_CTRL_PUSH:.
21c0: 09 09 2f 2a 20 6f 70 74 20 2d 20 69 6e 74 65 72 ../* opt - inter
21d0: 6e 61 6c 2c 20 75 73 65 64 20 74 6f 20 73 69 67 nal, used to sig
21e0: 6e 69 66 79 20 63 68 61 6e 67 65 2e 20 49 6d 70 nify change. Imp
21f0: 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 70 75 73 68 lements BIO_push
2200: 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 47 */...dprintf("G
2210: 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 50 55 53 48 ot BIO_CTRL_PUSH
2220: 22 29 3b 0a 09 09 72 65 74 20 3d 20 30 3b 0a 09 ");...ret = 0;..
2230: 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 .break;..case BI
2240: 4f 5f 43 54 52 4c 5f 50 4f 50 3a 0a 09 09 2f 2a O_CTRL_POP:.../*
2250: 20 6f 70 74 20 2d 20 69 6e 74 65 72 6e 61 6c 2c opt - internal,
2260: 20 75 73 65 64 20 74 6f 20 73 69 67 6e 69 66 79 used to signify
2270: 20 63 68 61 6e 67 65 2e 20 49 6d 70 6c 65 6d 65 change. Impleme
2280: 6e 74 73 20 42 49 4f 5f 70 6f 70 20 2a 2f 0a 09 nts BIO_pop */..
2290: 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 49 .dprintf("Got BI
22a0: 4f 5f 43 54 52 4c 5f 50 4f 50 22 29 3b 0a 09 09 O_CTRL_POP");...
22b0: 72 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b ret = 0;...break
22c0: 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c ;..case BIO_CTRL
22d0: 5f 47 45 54 5f 43 4c 4f 53 45 3a 0a 09 09 2f 2a _GET_CLOSE:.../*
22e0: 20 6d 61 6e 20 2d 20 47 65 74 20 74 68 65 20 63 man - Get the c
22f0: 6c 6f 73 65 20 6f 6e 20 42 49 4f 5f 66 72 65 65 lose on BIO_free
2300: 28 29 20 66 6c 61 67 20 73 65 74 20 62 79 20 42 () flag set by B
2310: 49 4f 5f 43 54 52 4c 5f 53 45 54 5f 43 4c 4f 53 IO_CTRL_SET_CLOS
2320: 45 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 E. Implements BI
2330: 4f 5f 67 65 74 5f 63 6c 6f 73 65 20 2a 2f 0a 09 O_get_close */..
2340: 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 49 .dprintf("Got BI
2350: 4f 5f 43 54 52 4c 5f 43 4c 4f 53 45 22 29 3b 0a O_CTRL_CLOSE");.
2360: 09 09 2f 2a 20 52 65 74 75 72 6e 73 20 42 49 4f ../* Returns BIO
2370: 5f 43 4c 4f 53 45 2c 20 42 49 4f 5f 4e 4f 43 4c _CLOSE, BIO_NOCL
2380: 4f 53 45 2c 20 6f 72 20 3c 30 20 66 6f 72 20 66 OSE, or <0 for f
2390: 61 69 6c 75 72 65 20 2a 2f 0a 09 09 72 65 74 20 ailure */...ret
23a0: 3d 20 42 49 4f 5f 67 65 74 5f 73 68 75 74 64 6f = BIO_get_shutdo
23b0: 77 6e 28 62 69 6f 29 3b 0a 09 09 62 72 65 61 6b wn(bio);...break
23c0: 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c ;..case BIO_CTRL
23d0: 5f 53 45 54 5f 43 4c 4f 53 45 3a 0a 09 09 2f 2a _SET_CLOSE:.../*
23e0: 20 6d 61 6e 20 2d 20 53 65 74 20 74 68 65 20 63 man - Set the c
23f0: 6c 6f 73 65 20 6f 6e 20 42 49 4f 5f 66 72 65 65 lose on BIO_free
2400: 28 29 20 66 6c 61 67 2e 20 49 6d 70 6c 65 6d 65 () flag. Impleme
2410: 6e 74 73 20 42 49 4f 5f 73 65 74 5f 63 6c 6f 73 nts BIO_set_clos
2420: 65 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 e */...dprintf("
2430: 47 6f 74 20 42 49 4f 5f 53 45 54 5f 43 4c 4f 53 Got BIO_SET_CLOS
2440: 45 22 29 3b 0a 09 09 42 49 4f 5f 73 65 74 5f 73 E");...BIO_set_s
2450: 68 75 74 64 6f 77 6e 28 62 69 6f 2c 20 6e 75 6d hutdown(bio, num
2460: 29 3b 0a 09 09 2f 2a 20 52 65 74 75 72 6e 73 20 );.../* Returns
2470: 31 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 1 on success or
2480: 3c 3d 30 20 66 6f 72 20 66 61 69 6c 75 72 65 20 <=0 for failure
2490: 2a 2f 0a 09 09 72 65 74 20 3d 20 31 3b 0a 09 09 */...ret = 1;...
24a0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f break;..case BIO
24b0: 5f 43 54 52 4c 5f 50 45 4e 44 49 4e 47 3a 0a 09 _CTRL_PENDING:..
24c0: 09 2f 2a 20 6f 70 74 20 2d 20 52 65 74 75 72 6e ./* opt - Return
24d0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 number of bytes
24e0: 20 69 6e 20 42 49 4f 20 77 61 69 74 69 6e 67 20 in BIO waiting
24f0: 74 6f 20 62 65 20 72 65 61 64 2e 20 49 6d 70 6c to be read. Impl
2500: 65 6d 65 6e 74 73 20 42 49 4f 5f 70 65 6e 64 69 ements BIO_pendi
2510: 6e 67 2e 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 ng. */...dprintf
2520: 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 50 ("Got BIO_CTRL_P
2530: 45 4e 44 49 4e 47 22 29 3b 0a 09 09 2f 2a 20 52 ENDING");.../* R
2540: 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 eturn the amount
2550: 20 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74 61 of pending data
2560: 20 6f 72 20 30 20 66 6f 72 20 65 72 72 6f 72 20 or 0 for error
2570: 2a 2f 0a 09 09 72 65 74 20 3d 20 28 28 63 68 61 */...ret = ((cha
2580: 6e 29 20 3f 20 54 63 6c 5f 49 6e 70 75 74 42 75 n) ? Tcl_InputBu
2590: 66 66 65 72 65 64 28 63 68 61 6e 29 20 3a 20 30 ffered(chan) : 0
25a0: 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 );...break;..cas
25b0: 65 20 42 49 4f 5f 43 54 52 4c 5f 46 4c 55 53 48 e BIO_CTRL_FLUSH
25c0: 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 46 6c 75 :.../* opt - Flu
25d0: 73 68 20 61 6e 79 20 62 75 66 66 65 72 65 64 20 sh any buffered
25e0: 6f 75 74 70 75 74 2e 20 49 6d 70 6c 65 6d 65 6e output. Implemen
25f0: 74 73 20 42 49 4f 5f 66 6c 75 73 68 2e 20 2a 2f ts BIO_flush. */
2600: 0a 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 ...dprintf("Got
2610: 42 49 4f 5f 43 54 52 4c 5f 46 4c 55 53 48 22 29 BIO_CTRL_FLUSH")
2620: 3b 0a 09 09 2f 2a 20 55 73 65 20 54 63 6c 5f 57 ;.../* Use Tcl_W
2630: 72 69 74 65 52 61 77 20 69 6e 73 74 65 61 64 20 riteRaw instead
2640: 6f 66 20 54 63 6c 5f 46 6c 75 73 68 20 74 6f 20 of Tcl_Flush to
2650: 6f 70 65 72 61 74 65 20 6f 6e 20 72 69 67 68 74 operate on right
2660: 20 63 68 61 6e 20 69 6e 20 73 74 61 63 6b 20 2a chan in stack *
2670: 2f 0a 09 09 2f 2a 20 52 65 74 75 72 6e 73 20 31 /.../* Returns 1
2680: 20 66 6f 72 20 73 75 63 63 65 73 73 2c 20 3c 3d for success, <=
2690: 30 20 66 6f 72 20 65 72 72 6f 72 2f 72 65 74 72 0 for error/retr
26a0: 79 2e 20 2a 2f 0a 09 09 72 65 74 20 3d 20 28 28 y. */...ret = ((
26b0: 63 68 61 6e 29 20 26 26 20 28 54 63 6c 5f 57 72 chan) && (Tcl_Wr
26c0: 69 74 65 52 61 77 28 63 68 61 6e 2c 20 22 22 2c iteRaw(chan, "",
26d0: 20 30 29 20 3e 3d 20 30 29 20 3f 20 31 20 3a 20 0) >= 0) ? 1 :
26e0: 2d 31 29 3b 0a 09 09 2f 2a 72 65 74 20 3d 20 42 -1);.../*ret = B
26f0: 69 6f 57 72 69 74 65 28 62 69 6f 2c 20 4e 55 4c ioWrite(bio, NUL
2700: 4c 2c 20 30 29 3b 2a 2f 0a 09 09 62 72 65 61 6b L, 0);*/...break
2710: 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c ;..case BIO_CTRL
2720: 5f 44 55 50 3a 0a 09 09 2f 2a 20 6d 61 6e 20 2d _DUP:.../* man -
2730: 20 65 78 74 72 61 20 73 74 75 66 66 20 66 6f 72 extra stuff for
2740: 20 27 64 75 70 65 64 27 20 42 49 4f 2e 20 49 6d 'duped' BIO. Im
2750: 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 64 75 70 plements BIO_dup
2760: 5f 73 74 61 74 65 20 2a 2f 0a 09 09 64 70 72 69 _state */...dpri
2770: 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 ntf("Got BIO_CTR
2780: 4c 5f 44 55 50 22 29 3b 0a 09 09 72 65 74 20 3d L_DUP");...ret =
2790: 20 31 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 1;...break;..ca
27a0: 73 65 20 42 49 4f 5f 43 54 52 4c 5f 57 50 45 4e se BIO_CTRL_WPEN
27b0: 44 49 4e 47 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d DING:.../* opt -
27c0: 20 52 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 6f Return number o
27d0: 66 20 62 79 74 65 73 20 69 6e 20 42 49 4f 20 73 f bytes in BIO s
27e0: 74 69 6c 6c 20 74 6f 20 62 65 20 77 72 69 74 74 till to be writt
27f0: 65 6e 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 en. Implements B
2800: 49 4f 5f 77 70 65 6e 64 69 6e 67 2e 20 2a 2f 0a IO_wpending. */.
2810: 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 ..dprintf("Got B
2820: 49 4f 5f 43 54 52 4c 5f 57 50 45 4e 44 49 4e 47 IO_CTRL_WPENDING
2830: 22 29 3b 0a 09 09 2f 2a 20 52 65 74 75 72 6e 20 ");.../* Return
2840: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 70 65 the amount of pe
2850: 6e 64 69 6e 67 20 64 61 74 61 20 6f 72 20 30 20 nding data or 0
2860: 66 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 09 09 72 for error */...r
2870: 65 74 20 3d 20 28 28 63 68 61 6e 29 20 3f 20 54 et = ((chan) ? T
2880: 63 6c 5f 4f 75 74 70 75 74 42 75 66 66 65 72 65 cl_OutputBuffere
2890: 64 28 63 68 61 6e 29 20 3a 20 30 29 3b 0a 09 09 d(chan) : 0);...
28a0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f break;..case BIO
28b0: 5f 43 54 52 4c 5f 53 45 54 5f 43 41 4c 4c 42 41 _CTRL_SET_CALLBA
28c0: 43 4b 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 53 CK:.../* opt - S
28d0: 65 74 73 20 61 6e 20 69 6e 66 6f 72 6d 61 74 69 ets an informati
28e0: 6f 6e 61 6c 20 63 61 6c 6c 62 61 63 6b 2e 20 49 onal callback. I
28f0: 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 73 65 mplements BIO_se
2900: 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 20 t_info_callback
2910: 2a 2f 0a 09 09 72 65 74 20 3d 20 30 3b 0a 09 09 */...ret = 0;...
2920: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f break;..case BIO
2930: 5f 43 54 52 4c 5f 47 45 54 5f 43 41 4c 4c 42 41 _CTRL_GET_CALLBA
2940: 43 4b 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 47 CK:.../* opt - G
2950: 65 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 et and return th
2960: 65 20 69 6e 66 6f 20 63 61 6c 6c 62 61 63 6b 2e e info callback.
2970: 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f Implements BIO_
2980: 67 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 get_info_callbac
2990: 6b 20 2a 2f 0a 09 09 72 65 74 20 3d 20 30 3b 0a k */...ret = 0;.
29a0: 09 09 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 ..break;...case
29b0: 42 49 4f 5f 43 5f 46 49 4c 45 5f 53 45 45 4b 3a BIO_C_FILE_SEEK:
29c0: 0a 09 09 2f 2a 20 4e 6f 74 20 75 73 65 64 20 66 .../* Not used f
29d0: 6f 72 20 73 6f 63 6b 65 74 73 2e 20 54 63 6c 5f or sockets. Tcl_
29e0: 53 65 65 6b 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 Seek only works
29f0: 6f 6e 20 74 6f 70 20 63 68 61 6e 2e 20 49 6d 70 on top chan. Imp
2a00: 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 73 65 65 6b lements BIO_seek
2a10: 28 29 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 () */...dprintf(
2a20: 22 47 6f 74 20 42 49 4f 5f 43 5f 46 49 4c 45 5f "Got BIO_C_FILE_
2a30: 53 45 45 4b 22 29 3b 0a 09 09 72 65 74 20 3d 20 SEEK");...ret =
2a40: 30 3b 20 2f 2a 20 52 65 74 75 72 6e 20 30 20 73 0; /* Return 0 s
2a50: 75 63 63 65 73 73 20 61 6e 64 20 2d 31 20 66 6f uccess and -1 fo
2a60: 72 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 62 r failure */...b
2a70: 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f 5f reak;..case BIO_
2a80: 43 5f 46 49 4c 45 5f 54 45 4c 4c 3a 0a 09 09 2f C_FILE_TELL:.../
2a90: 2a 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 73 * Not used for s
2aa0: 6f 63 6b 65 74 73 2e 20 54 63 6c 5f 54 65 6c 6c ockets. Tcl_Tell
2ab0: 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 74 only works on t
2ac0: 6f 70 20 63 68 61 6e 2e 20 49 6d 70 6c 65 6d 65 op chan. Impleme
2ad0: 6e 74 73 20 42 49 4f 5f 74 65 6c 6c 28 29 20 2a nts BIO_tell() *
2ae0: 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 /...dprintf("Got
2af0: 20 42 49 4f 5f 43 5f 46 49 4c 45 5f 54 45 4c 4c BIO_C_FILE_TELL
2b00: 22 29 3b 0a 09 09 72 65 74 20 3d 20 30 3b 20 2f ");...ret = 0; /
2b10: 2a 20 52 65 74 75 72 6e 20 30 20 73 75 63 63 65 * Return 0 succe
2b20: 73 73 20 61 6e 64 20 2d 31 20 66 6f 72 20 66 61 ss and -1 for fa
2b30: 69 6c 75 72 65 20 2a 2f 0a 09 09 62 72 65 61 6b ilure */...break
2b40: 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 5f 53 45 ;..case BIO_C_SE
2b50: 54 5f 46 44 3a 0a 09 09 2f 2a 20 49 6d 70 6c 65 T_FD:.../* Imple
2b60: 6d 65 6e 74 73 20 42 49 4f 5f 73 65 74 5f 66 64 ments BIO_set_fd
2b70: 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 55 */...dprintf("U
2b80: 6e 73 75 70 70 6f 72 74 65 64 20 63 61 6c 6c 3a nsupported call:
2b90: 20 42 49 4f 5f 43 5f 53 45 54 5f 46 44 22 29 3b BIO_C_SET_FD");
2ba0: 0a 09 09 72 65 74 20 3d 20 2d 31 3b 0a 09 09 62 ...ret = -1;...b
2bb0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f 5f reak;..case BIO_
2bc0: 43 5f 47 45 54 5f 46 44 3a 0a 09 09 2f 2a 20 49 C_GET_FD:.../* I
2bd0: 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 67 65 mplements BIO_ge
2be0: 74 5f 66 64 28 29 20 2a 2f 0a 09 09 64 70 72 69 t_fd() */...dpri
2bf0: 6e 74 66 28 22 55 6e 73 75 70 70 6f 72 74 65 64 ntf("Unsupported
2c00: 20 63 61 6c 6c 3a 20 42 49 4f 5f 43 5f 47 45 54 call: BIO_C_GET
2c10: 5f 46 44 22 29 3b 0a 09 09 72 65 74 20 3d 20 2d _FD");...ret = -
2c20: 31 3b 0a 09 09 62 72 65 61 6b 3b 0a 0a 23 69 66 1;...break;..#if
2c30: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e OPENSSL_VERSION
2c40: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30 30 _NUMBER >= 0x300
2c50: 30 30 30 30 30 4c 20 26 26 20 64 65 66 69 6e 65 00000L && define
2c60: 64 28 42 49 4f 5f 43 54 52 4c 5f 47 45 54 5f 4b d(BIO_CTRL_GET_K
2c70: 54 4c 53 5f 53 45 4e 44 29 0a 09 63 61 73 65 20 TLS_SEND)..case
2c80: 42 49 4f 5f 43 54 52 4c 5f 47 45 54 5f 4b 54 4c BIO_CTRL_GET_KTL
2c90: 53 5f 53 45 4e 44 3a 0a 09 09 2f 2a 20 49 6d 70 S_SEND:.../* Imp
2ca0: 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 67 65 74 5f lements BIO_get_
2cb0: 6b 74 6c 73 5f 73 65 6e 64 20 2a 2f 0a 09 09 64 ktls_send */...d
2cc0: 70 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f printf("Got BIO_
2cd0: 43 54 52 4c 5f 47 45 54 5f 4b 54 4c 53 5f 53 45 CTRL_GET_KTLS_SE
2ce0: 4e 44 22 29 3b 0a 09 09 2f 2a 20 52 65 74 75 72 ND");.../* Retur
2cf0: 6e 73 20 31 20 69 66 20 74 68 65 20 42 49 4f 20 ns 1 if the BIO
2d00: 69 73 20 75 73 69 6e 67 20 74 68 65 20 4b 65 72 is using the Ker
2d10: 6e 65 6c 20 54 4c 53 20 64 61 74 61 2d 70 61 74 nel TLS data-pat
2d20: 68 20 66 6f 72 20 73 65 6e 64 69 6e 67 2c 20 30 h for sending, 0
2d30: 20 69 66 20 6e 6f 74 20 2a 2f 0a 09 09 72 65 74 if not */...ret
2d40: 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a 23 = 0;...break;.#
2d50: 65 6e 64 69 66 0a 23 69 66 20 4f 50 45 4e 53 53 endif.#if OPENSS
2d60: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
2d70: 20 3e 3d 20 30 78 33 30 30 30 30 30 30 30 4c 20 >= 0x30000000L
2d80: 26 26 20 64 65 66 69 6e 65 64 28 42 49 4f 5f 43 && defined(BIO_C
2d90: 54 52 4c 5f 47 45 54 5f 4b 54 4c 53 5f 52 45 43 TRL_GET_KTLS_REC
2da0: 56 29 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 V)..case BIO_CTR
2db0: 4c 5f 47 45 54 5f 4b 54 4c 53 5f 52 45 43 56 3a L_GET_KTLS_RECV:
2dc0: 0a 09 09 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 73 .../* Implements
2dd0: 20 42 49 4f 5f 67 65 74 5f 6b 74 6c 73 5f 72 65 BIO_get_ktls_re
2de0: 63 76 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 cv */...dprintf(
2df0: 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 47 45 "Got BIO_CTRL_GE
2e00: 54 5f 4b 54 4c 53 5f 52 45 43 56 22 29 3b 0a 09 T_KTLS_RECV");..
2e10: 09 2f 2a 20 52 65 74 75 72 6e 73 20 31 20 69 66 ./* Returns 1 if
2e20: 20 74 68 65 20 42 49 4f 20 69 73 20 75 73 69 6e the BIO is usin
2e30: 67 20 74 68 65 20 4b 65 72 6e 65 6c 20 54 4c 53 g the Kernel TLS
2e40: 20 64 61 74 61 2d 70 61 74 68 20 66 6f 72 20 72 data-path for r
2e50: 65 63 65 69 76 69 6e 67 2c 20 30 20 69 66 20 6e eceiving, 0 if n
2e60: 6f 74 20 2a 2f 0a 09 09 72 65 74 20 3d 20 30 3b ot */...ret = 0;
2e70: 0a 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 ...break;.#endif
2e80: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 09 64 70 72 ..default:...dpr
2e90: 69 6e 74 66 28 22 47 6f 74 20 75 6e 6b 6e 6f 77 intf("Got unknow
2ea0: 6e 20 63 6f 6e 74 72 6f 6c 20 63 6f 6d 6d 61 6e n control comman
2eb0: 64 20 28 25 69 29 22 2c 20 63 6d 64 29 3b 0a 09 d (%i)", cmd);..
2ec0: 09 72 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 61 .ret = 0;...brea
2ed0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 70 72 k;. }. dpr
2ee0: 69 6e 74 66 28 22 42 69 6f 43 74 72 6c 20 72 65 intf("BioCtrl re
2ef0: 74 75 72 6e 20 76 61 6c 75 65 20 25 6c 69 22 2c turn value %li",
2f00: 20 72 65 74 29 3b 0a 20 20 20 20 72 65 74 75 72 ret);. retur
2f10: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d n ret;.}../*. *-
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
2f70: 20 2a 20 42 69 6f 4e 65 77 20 2d 2d 0a 20 2a 0a * BioNew --. *.
2f80: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e *.This function
2f90: 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 is used to crea
2fa0: 74 65 20 61 20 6e 65 77 20 69 6e 73 74 61 6e 63 te a new instanc
2fb0: 65 20 6f 66 20 74 68 65 20 42 49 4f 2e 20 54 68 e of the BIO. Th
2fc0: 69 73 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 20 77 is. *.function w
2fd0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 69 6e ill be called in
2fe0: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 response to the
2ff0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c application cal
3000: 6c 69 6e 67 20 74 68 65 0a 20 2a 09 42 49 4f 5f ling the. *.BIO_
3010: 6e 65 77 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a new() function..
3020: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
3030: 2a 09 52 65 74 75 72 6e 73 20 62 6f 6f 6c 65 61 *.Returns boolea
3040: 6e 20 73 75 63 63 65 73 73 20 72 65 73 75 6c 74 n success result
3050: 20 28 31 3d 73 75 63 63 65 73 73 2c 20 30 3d 66 (1=success, 0=f
3060: 61 69 6c 75 72 65 29 0a 20 2a 0a 20 2a 20 53 69 ailure). *. * Si
3070: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 de effects:. *.I
3080: 6e 69 74 69 61 6c 69 7a 65 73 20 42 49 4f 20 73 nitializes BIO s
3090: 74 72 75 63 74 75 72 65 2e 0a 20 2a 0a 20 2a 2d tructure.. *. *-
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
30f0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 42 69 6f ..static int Bio
3100: 4e 65 77 28 42 49 4f 20 2a 62 69 6f 29 20 7b 0a New(BIO *bio) {.
3110: 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 69 6f dprintf("Bio
3120: 4e 65 77 28 25 70 29 20 63 61 6c 6c 65 64 22 2c New(%p) called",
3130: 20 62 69 6f 29 3b 0a 0a 20 20 20 20 69 66 20 28 bio);.. if (
3140: 62 69 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 bio == NULL) {..
3150: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a return 0;. }.
3160: 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 64 61 74 . BIO_set_dat
3170: 61 28 62 69 6f 2c 20 4e 55 4c 4c 29 3b 0a 20 20 a(bio, NULL);.
3180: 20 20 42 49 4f 5f 73 65 74 5f 69 6e 69 74 28 62 BIO_set_init(b
3190: 69 6f 2c 20 30 29 3b 0a 20 20 20 20 42 49 4f 5f io, 0);. BIO_
31a0: 63 6c 65 61 72 5f 66 6c 61 67 73 28 62 69 6f 2c clear_flags(bio,
31b0: 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e -1);. return
31c0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 1;.}../*. *----
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
3220: 42 69 6f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a BioFree --. *. *
3230: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 .This function i
3240: 73 20 75 73 65 64 20 74 6f 20 64 65 73 74 72 6f s used to destro
3250: 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 y an instance of
3260: 20 61 20 42 49 4f 2e 20 54 68 69 73 20 66 75 6e a BIO. This fun
3270: 63 74 69 6f 6e 0a 20 2a 09 77 69 6c 6c 20 62 65 ction. *.will be
3280: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f called in respo
3290: 6e 73 65 20 74 6f 20 74 68 65 20 61 70 70 6c 69 nse to the appli
32a0: 63 61 74 69 6f 6e 20 63 61 6c 6c 69 6e 67 20 74 cation calling t
32b0: 68 65 20 42 49 4f 5f 66 72 65 65 28 29 0a 20 2a he BIO_free(). *
32c0: 09 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a .function.. *. *
32d0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 Results:. *.Ret
32e0: 75 72 6e 73 20 62 6f 6f 6c 65 61 6e 20 73 75 63 urns boolean suc
32f0: 63 65 73 73 20 72 65 73 75 6c 74 0a 20 2a 0a 20 cess result. *.
3300: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3310: 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 42 *.Initializes B
3320: 49 4f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 2a IO structure.. *
3330: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3380: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
3390: 20 42 69 6f 46 72 65 65 28 42 49 4f 20 2a 62 69 BioFree(BIO *bi
33a0: 6f 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 o) {. dprintf
33b0: 28 22 42 69 6f 46 72 65 65 28 25 70 29 20 63 61 ("BioFree(%p) ca
33c0: 6c 6c 65 64 22 2c 20 62 69 6f 29 3b 0a 0a 20 20 lled", bio);..
33d0: 20 20 69 66 20 28 62 69 6f 20 3d 3d 20 4e 55 4c if (bio == NUL
33e0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a L) {..return 0;.
33f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c }.. /* Cl
3400: 65 61 72 20 66 6c 61 67 73 20 69 66 20 73 65 74 ear flags if set
3410: 20 74 6f 20 42 49 4f 5f 43 4c 4f 53 45 20 28 63 to BIO_CLOSE (c
3420: 6c 6f 73 65 20 49 2f 4f 20 73 74 72 65 61 6d 20 lose I/O stream
3430: 77 68 65 6e 20 74 68 65 20 42 49 4f 20 69 73 20 when the BIO is
3440: 66 72 65 65 64 29 20 2a 2f 0a 20 20 20 20 69 66 freed) */. if
3450: 20 28 42 49 4f 5f 67 65 74 5f 73 68 75 74 64 6f (BIO_get_shutdo
3460: 77 6e 28 62 69 6f 29 29 20 7b 0a 09 42 49 4f 5f wn(bio)) {..BIO_
3470: 73 65 74 5f 64 61 74 61 28 62 69 6f 2c 20 4e 55 set_data(bio, NU
3480: 4c 4c 29 3b 0a 09 42 49 4f 5f 73 65 74 5f 69 6e LL);..BIO_set_in
3490: 69 74 28 62 69 6f 2c 20 30 29 3b 0a 09 42 49 4f it(bio, 0);..BIO
34a0: 5f 63 6c 65 61 72 5f 66 6c 61 67 73 28 62 69 6f _clear_flags(bio
34b0: 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 , -1);. }.
34c0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a return 1;.}../*
34d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3520: 0a 20 2a 0a 20 2a 20 42 49 4f 5f 6e 65 77 5f 74 . *. * BIO_new_t
3530: 63 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 cl --. *. *.This
3540: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 function is use
3550: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 d to initialize
3560: 74 68 65 20 42 49 4f 20 6d 65 74 68 6f 64 20 68 the BIO method h
3570: 61 6e 64 6c 65 72 73 2e 0a 20 2a 0a 20 2a 20 52 andlers.. *. * R
3580: 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 esults:. *.Retur
3590: 6e 73 20 70 6f 69 6e 74 65 72 20 74 6f 20 42 49 ns pointer to BI
35a0: 4f 20 6f 72 20 4e 55 4c 4c 20 66 6f 72 20 66 61 O or NULL for fa
35b0: 69 6c 75 72 65 0a 20 2a 0a 20 2a 20 53 69 64 65 ilure. *. * Side
35c0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 6e 69 effects:. *.Ini
35d0: 74 69 61 6c 69 7a 65 73 20 42 49 4f 20 4d 65 74 tializes BIO Met
35e0: 68 6f 64 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d hods.. *. *-----
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 42 49 --------. */..BI
3640: 4f 20 2a 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 53 O *BIO_new_tcl(S
3650: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
3660: 69 6e 74 20 66 6c 61 67 73 29 20 7b 0a 20 20 20 int flags) {.
3670: 20 42 49 4f 20 2a 62 69 6f 3b 0a 23 69 66 64 65 BIO *bio;.#ifde
3680: 66 20 54 43 4c 54 4c 53 5f 53 53 4c 5f 55 53 45 f TCLTLS_SSL_USE
3690: 5f 46 41 53 54 50 41 54 48 0a 20 20 20 20 54 63 _FASTPATH. Tc
36a0: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 l_Channel parent
36b0: 43 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 63 6f 6e Channel;. con
36c0: 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 st Tcl_ChannelTy
36d0: 70 65 20 2a 70 61 72 65 6e 74 43 68 61 6e 6e 65 pe *parentChanne
36e0: 6c 54 79 70 65 3b 0a 20 20 20 20 0a 20 20 20 20 lType;. .
36f0: 69 6e 74 20 70 61 72 65 6e 74 43 68 61 6e 6e 65 int parentChanne
3700: 6c 46 64 49 6e 2c 20 70 61 72 65 6e 74 43 68 61 lFdIn, parentCha
3710: 6e 6e 65 6c 46 64 4f 75 74 2c 20 70 61 72 65 6e nnelFdOut, paren
3720: 74 43 68 61 6e 6e 65 6c 46 64 3b 0a 20 20 20 20 tChannelFd;.
3730: 69 6e 74 20 76 61 6c 69 64 50 61 72 65 6e 74 43 int validParentC
3740: 68 61 6e 6e 65 6c 46 64 3b 0a 23 65 6e 64 69 66 hannelFd;.#endif
3750: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 .. dprintf("B
3760: 49 4f 5f 6e 65 77 5f 74 63 6c 28 29 20 63 61 6c IO_new_tcl() cal
3770: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 led");.. /* C
3780: 72 65 61 74 65 20 63 75 73 74 6f 6d 20 42 49 4f reate custom BIO
3790: 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 20 20 69 method */. i
37a0: 66 20 28 42 69 6f 4d 65 74 68 6f 64 73 20 3d 3d f (BioMethods ==
37b0: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 42 49 4f NULL) {../* BIO
37c0: 5f 54 59 50 45 5f 42 49 4f 20 3d 20 28 31 39 7c _TYPE_BIO = (19|
37d0: 42 49 4f 5f 54 59 50 45 5f 53 4f 55 52 43 45 5f BIO_TYPE_SOURCE_
37e0: 53 49 4e 4b 29 20 2d 2d 20 68 61 6c 66 20 61 20 SINK) -- half a
37f0: 42 49 4f 20 70 61 69 72 20 2a 2f 0a 09 2f 2a 20 BIO pair */../*
3800: 42 49 4f 5f 54 59 50 45 5f 43 4f 4e 4e 45 43 54 BIO_TYPE_CONNECT
3810: 20 3d 20 28 31 32 7c 42 49 4f 5f 54 59 50 45 5f = (12|BIO_TYPE_
3820: 53 4f 55 52 43 45 5f 53 49 4e 4b 7c 42 49 4f 5f SOURCE_SINK|BIO_
3830: 54 59 50 45 5f 44 45 53 43 52 49 50 54 4f 52 29 TYPE_DESCRIPTOR)
3840: 20 2a 2f 0a 09 2f 2a 20 42 49 4f 5f 54 59 50 45 */../* BIO_TYPE
3850: 5f 41 43 43 45 50 54 20 20 3d 20 28 31 33 7c 42 _ACCEPT = (13|B
3860: 49 4f 5f 54 59 50 45 5f 53 4f 55 52 43 45 5f 53 IO_TYPE_SOURCE_S
3870: 49 4e 4b 7c 42 49 4f 5f 54 59 50 45 5f 44 45 53 INK|BIO_TYPE_DES
3880: 43 52 49 50 54 4f 52 29 20 2a 2f 0a 09 42 69 6f CRIPTOR) */..Bio
3890: 4d 65 74 68 6f 64 73 20 3d 20 42 49 4f 5f 6d 65 Methods = BIO_me
38a0: 74 68 5f 6e 65 77 28 42 49 4f 5f 54 59 50 45 5f th_new(BIO_TYPE_
38b0: 42 49 4f 2c 20 22 74 63 6c 22 29 3b 0a 09 69 66 BIO, "tcl");..if
38c0: 20 28 42 69 6f 4d 65 74 68 6f 64 73 20 3d 3d 20 (BioMethods ==
38d0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 64 70 72 NULL) {.. dpr
38e0: 69 6e 74 66 28 22 4d 65 6d 6f 72 79 20 61 6c 6c intf("Memory all
38f0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 29 3b ocation error");
3900: 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ... return NU
3910: 4c 4c 3b 0a 09 7d 0a 09 2f 2a 20 4e 6f 74 20 75 LL;..}../* Not u
3920: 73 65 64 20 42 49 4f 5f 6d 65 74 68 5f 73 65 74 sed BIO_meth_set
3930: 5f 77 72 69 74 65 5f 65 78 20 2a 2f 0a 09 42 49 _write_ex */..BI
3940: 4f 5f 6d 65 74 68 5f 73 65 74 5f 77 72 69 74 65 O_meth_set_write
3950: 28 42 69 6f 4d 65 74 68 6f 64 73 2c 20 42 69 6f (BioMethods, Bio
3960: 57 72 69 74 65 29 3b 0a 09 2f 2a 20 4e 6f 74 20 Write);../* Not
3970: 75 73 65 64 20 42 49 4f 5f 6d 65 74 68 5f 73 65 used BIO_meth_se
3980: 74 5f 72 65 61 64 5f 65 78 20 2a 2f 0a 09 42 49 t_read_ex */..BI
3990: 4f 5f 6d 65 74 68 5f 73 65 74 5f 72 65 61 64 28 O_meth_set_read(
39a0: 42 69 6f 4d 65 74 68 6f 64 73 2c 20 42 69 6f 52 BioMethods, BioR
39b0: 65 61 64 29 3b 0a 09 42 49 4f 5f 6d 65 74 68 5f ead);..BIO_meth_
39c0: 73 65 74 5f 70 75 74 73 28 42 69 6f 4d 65 74 68 set_puts(BioMeth
39d0: 6f 64 73 2c 20 42 69 6f 50 75 74 73 29 3b 0a 09 ods, BioPuts);..
39e0: 42 49 4f 5f 6d 65 74 68 5f 73 65 74 5f 63 74 72 BIO_meth_set_ctr
39f0: 6c 28 42 69 6f 4d 65 74 68 6f 64 73 2c 20 42 69 l(BioMethods, Bi
3a00: 6f 43 74 72 6c 29 3b 0a 09 42 49 4f 5f 6d 65 74 oCtrl);..BIO_met
3a10: 68 5f 73 65 74 5f 63 72 65 61 74 65 28 42 69 6f h_set_create(Bio
3a20: 4d 65 74 68 6f 64 73 2c 20 42 69 6f 4e 65 77 29 Methods, BioNew)
3a30: 3b 0a 09 42 49 4f 5f 6d 65 74 68 5f 73 65 74 5f ;..BIO_meth_set_
3a40: 64 65 73 74 72 6f 79 28 42 69 6f 4d 65 74 68 6f destroy(BioMetho
3a50: 64 73 2c 20 42 69 6f 46 72 65 65 29 3b 0a 20 20 ds, BioFree);.
3a60: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 }.. if (sta
3a70: 74 65 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b tePtr == NULL) {
3a80: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 ..dprintf("Asked
3a90: 20 74 6f 20 73 65 74 75 70 20 61 20 4e 55 4c 4c to setup a NULL
3aa0: 20 73 74 61 74 65 2c 20 6a 75 73 74 20 63 72 65 state, just cre
3ab0: 61 74 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 ating the initia
3ac0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 l configuration"
3ad0: 29 3b 0a 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c );...return NULL
3ae0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 ;. }..#ifdef
3af0: 54 43 4c 54 4c 53 5f 53 53 4c 5f 55 53 45 5f 46 TCLTLS_SSL_USE_F
3b00: 41 53 54 50 41 54 48 0a 20 20 20 20 2f 2a 0a 20 ASTPATH. /*.
3b10: 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 68 61 * If the cha
3b20: 6e 6e 65 6c 20 63 61 6e 20 62 65 20 6d 61 70 70 nnel can be mapp
3b30: 65 64 20 62 61 63 6b 20 74 6f 20 61 20 66 69 6c ed back to a fil
3b40: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6a 75 e descriptor, ju
3b50: 73 74 20 75 73 65 20 74 68 65 20 66 69 6c 65 20 st use the file
3b60: 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 descriptor.
3b70: 2a 20 77 69 74 68 20 74 68 65 20 53 53 4c 20 6c * with the SSL l
3b80: 69 62 72 61 72 79 20 73 69 6e 63 65 20 69 74 20 ibrary since it
3b90: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 62 65 20 6f will likely be o
3ba0: 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 74 68 69 ptimized for thi
3bb0: 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 s.. */. p
3bc0: 61 72 65 6e 74 43 68 61 6e 6e 65 6c 20 3d 20 54 arentChannel = T
3bd0: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 ls_GetParent(sta
3be0: 74 65 50 74 72 2c 20 30 29 3b 0a 20 20 20 20 70 tePtr, 0);. p
3bf0: 61 72 65 6e 74 43 68 61 6e 6e 65 6c 54 79 70 65 arentChannelType
3c00: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
3c10: 6c 54 79 70 65 28 70 61 72 65 6e 74 43 68 61 6e lType(parentChan
3c20: 6e 65 6c 29 3b 0a 0a 20 20 20 20 76 61 6c 69 64 nel);.. valid
3c30: 50 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 20 ParentChannelFd
3c40: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 73 74 72 = 0;. if (str
3c50: 63 6d 70 28 70 61 72 65 6e 74 43 68 61 6e 6e 65 cmp(parentChanne
3c60: 6c 54 79 70 65 2d 3e 74 79 70 65 4e 61 6d 65 2c lType->typeName,
3c70: 20 22 74 63 70 22 29 20 3d 3d 20 30 29 20 7b 0a "tcp") == 0) {.
3c80: 09 76 6f 69 64 20 2a 70 61 72 65 6e 74 43 68 61 .void *parentCha
3c90: 6e 6e 65 6c 46 64 49 6e 5f 70 2c 20 2a 70 61 72 nnelFdIn_p, *par
3ca0: 65 6e 74 43 68 61 6e 6e 65 6c 46 64 4f 75 74 5f entChannelFdOut_
3cb0: 70 3b 0a 09 69 6e 74 20 74 63 6c 47 65 74 43 68 p;..int tclGetCh
3cc0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 52 65 74 3b 0a annelHandleRet;.
3cd0: 0a 09 74 63 6c 47 65 74 43 68 61 6e 6e 65 6c 48 ..tclGetChannelH
3ce0: 61 6e 64 6c 65 52 65 74 20 3d 20 54 63 6c 5f 47 andleRet = Tcl_G
3cf0: 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 etChannelHandle(
3d00: 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 2c 20 54 parentChannel, T
3d10: 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 28 43 6c CL_READABLE, (Cl
3d20: 69 65 6e 74 44 61 74 61 29 20 26 70 61 72 65 6e ientData) &paren
3d30: 74 43 68 61 6e 6e 65 6c 46 64 49 6e 5f 70 29 3b tChannelFdIn_p);
3d40: 0a 09 69 66 20 28 74 63 6c 47 65 74 43 68 61 6e ..if (tclGetChan
3d50: 6e 65 6c 48 61 6e 64 6c 65 52 65 74 20 3d 3d 20 nelHandleRet ==
3d60: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 74 TCL_OK) {.. t
3d70: 63 6c 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 clGetChannelHand
3d80: 6c 65 52 65 74 20 3d 20 54 63 6c 5f 47 65 74 43 leRet = Tcl_GetC
3d90: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 61 72 hannelHandle(par
3da0: 65 6e 74 43 68 61 6e 6e 65 6c 2c 20 54 43 4c 5f entChannel, TCL_
3db0: 57 52 49 54 41 42 4c 45 2c 20 28 43 6c 69 65 6e WRITABLE, (Clien
3dc0: 74 44 61 74 61 29 20 26 70 61 72 65 6e 74 43 68 tData) &parentCh
3dd0: 61 6e 6e 65 6c 46 64 4f 75 74 5f 70 29 3b 0a 09 annelFdOut_p);..
3de0: 20 20 20 20 69 66 20 28 74 63 6c 47 65 74 43 68 if (tclGetCh
3df0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 52 65 74 20 3d annelHandleRet =
3e00: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 70 61 = TCL_OK) {...pa
3e10: 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 49 6e 20 rentChannelFdIn
3e20: 3d 20 50 54 52 32 49 4e 54 28 70 61 72 65 6e 74 = PTR2INT(parent
3e30: 43 68 61 6e 6e 65 6c 46 64 49 6e 5f 70 29 3b 0a ChannelFdIn_p);.
3e40: 09 09 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 ..parentChannelF
3e50: 64 4f 75 74 20 3d 20 50 54 52 32 49 4e 54 28 70 dOut = PTR2INT(p
3e60: 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 4f 75 arentChannelFdOu
3e70: 74 5f 70 29 3b 0a 09 09 69 66 20 28 70 61 72 65 t_p);...if (pare
3e80: 6e 74 43 68 61 6e 6e 65 6c 46 64 49 6e 20 3d 3d ntChannelFdIn ==
3e90: 20 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 parentChannelFd
3ea0: 4f 75 74 29 20 7b 0a 09 09 20 20 20 20 70 61 72 Out) {... par
3eb0: 65 6e 74 43 68 61 6e 6e 65 6c 46 64 20 3d 20 70 entChannelFd = p
3ec0: 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 49 6e arentChannelFdIn
3ed0: 3b 0a 09 09 20 20 20 20 76 61 6c 69 64 50 61 72 ;... validPar
3ee0: 65 6e 74 43 68 61 6e 6e 65 6c 46 64 20 3d 20 31 entChannelFd = 1
3ef0: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a ;...}.. }..}.
3f00: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 76 }.. if (v
3f10: 61 6c 69 64 50 61 72 65 6e 74 43 68 61 6e 6e 65 alidParentChanne
3f20: 6c 46 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 lFd) {..dprintf(
3f30: 22 57 65 20 66 6f 75 6e 64 20 61 20 73 68 6f 72 "We found a shor
3f40: 74 63 75 74 2c 20 74 68 69 73 20 63 68 61 6e 6e tcut, this chann
3f50: 65 6c 20 69 73 20 62 61 63 6b 65 64 20 62 79 20 el is backed by
3f60: 61 20 73 6f 63 6b 65 74 3a 20 25 69 22 2c 20 70 a socket: %i", p
3f70: 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 49 6e arentChannelFdIn
3f80: 29 3b 0a 09 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 );..bio = BIO_ne
3f90: 77 5f 73 6f 63 6b 65 74 28 70 61 72 65 6e 74 43 w_socket(parentC
3fa0: 68 61 6e 6e 65 6c 46 64 2c 20 66 6c 61 67 73 29 hannelFd, flags)
3fb0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 ;..statePtr->fla
3fc0: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 46 41 gs |= TLS_TCL_FA
3fd0: 53 54 50 41 54 48 3b 0a 09 42 49 4f 5f 73 65 74 STPATH;..BIO_set
3fe0: 5f 64 61 74 61 28 62 69 6f 2c 20 73 74 61 74 65 _data(bio, state
3ff0: 50 74 72 29 3b 0a 09 42 49 4f 5f 73 65 74 5f 73 Ptr);..BIO_set_s
4000: 68 75 74 64 6f 77 6e 28 62 69 6f 2c 20 66 6c 61 hutdown(bio, fla
4010: 67 73 29 3b 0a 09 42 49 4f 5f 73 65 74 5f 69 6e gs);..BIO_set_in
4020: 69 74 28 62 69 6f 2c 20 31 29 3b 0a 09 72 65 74 it(bio, 1);..ret
4030: 75 72 6e 20 62 69 6f 3b 0a 20 20 20 20 7d 0a 23 urn bio;. }.#
4040: 65 6e 64 69 66 0a 0a 20 20 20 20 64 70 72 69 6e endif.. dprin
4050: 74 66 28 22 46 61 6c 6c 69 6e 67 20 62 61 63 6b tf("Falling back
4060: 20 74 6f 20 54 63 6c 20 49 2f 4f 20 66 6f 72 20 to Tcl I/O for
4070: 74 68 69 73 20 63 68 61 6e 6e 65 6c 22 29 3b 0a this channel");.
4080: 0a 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e . bio = BIO_n
4090: 65 77 28 42 69 6f 4d 65 74 68 6f 64 73 29 3b 0a ew(BioMethods);.
40a0: 20 20 20 20 42 49 4f 5f 73 65 74 5f 64 61 74 61 BIO_set_data
40b0: 28 62 69 6f 2c 20 73 74 61 74 65 50 74 72 29 3b (bio, statePtr);
40c0: 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 68 75 . BIO_set_shu
40d0: 74 64 6f 77 6e 28 62 69 6f 2c 20 66 6c 61 67 73 tdown(bio, flags
40e0: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 69 );. BIO_set_i
40f0: 6e 69 74 28 62 69 6f 2c 20 31 29 3b 20 2f 2a 20 nit(bio, 1); /*
4100: 45 6e 61 62 6c 65 20 72 65 61 64 20 26 20 77 72 Enable read & wr
4110: 69 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 ite */. retur
4120: 6e 20 62 69 6f 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d n bio;.}../*. *-
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
4180: 20 2a 20 42 49 4f 5f 63 6c 65 61 6e 75 70 20 2d * BIO_cleanup -
4190: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e -. *. *.This fun
41a0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f ction is used to
41b0: 20 64 65 73 74 72 6f 79 20 61 20 42 49 4f 5f 4d destroy a BIO_M
41c0: 45 54 48 4f 44 20 73 74 72 75 63 74 75 72 65 20 ETHOD structure
41d0: 61 6e 64 20 66 72 65 65 20 75 70 20 61 6e 79 0a and free up any.
41e0: 20 2a 09 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 *.memory associ
41f0: 61 74 65 64 20 77 69 74 68 20 69 74 2e 0a 20 2a ated with it.. *
4200: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
4210: 53 74 61 6e 64 61 72 64 20 54 43 4c 20 72 65 73 Standard TCL res
4220: 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ult. *. * Side e
4230: 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 73 74 72 ffects:. *.Destr
4240: 6f 79 73 20 42 49 4f 20 4d 65 74 68 6f 64 73 2e oys BIO Methods.
4250: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42a0: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 20 42 49 4f ---. */..int BIO
42b0: 5f 63 6c 65 61 6e 75 70 20 28 29 20 7b 0a 20 20 _cleanup () {.
42c0: 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 63 dprintf("BIO_c
42d0: 6c 65 61 6e 75 70 28 29 20 63 61 6c 6c 65 64 22 leanup() called"
42e0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 42 69 6f 4d );.. if (BioM
42f0: 65 74 68 6f 64 73 20 21 3d 20 4e 55 4c 4c 29 20 ethods != NULL)
4300: 7b 0a 09 42 49 4f 5f 6d 65 74 68 5f 66 72 65 65 {..BIO_meth_free
4310: 28 42 69 6f 4d 65 74 68 6f 64 73 29 3b 0a 09 42 (BioMethods);..B
4320: 69 6f 4d 65 74 68 6f 64 73 20 3d 20 4e 55 4c 4c ioMethods = NULL
4330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
4340: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a rn TCL_OK;.}.