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 0a 20 20 7c 20 20 20 20 20 App |. |
0220: 20 7c 54 63 6c 5f 52 65 61 64 52 61 77 20 20 2d |Tcl_ReadRaw -
0230: 2d 3e 20 20 42 69 6f 52 65 61 64 7c 20 20 20 20 -> BioRead|
0240: 20 7c 42 49 4f 5f 52 65 61 64 20 20 2d 2d 3e 20 |BIO_Read -->
0250: 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 20 2d 2d TlsInputProc --
0260: 3e 20 20 52 65 61 64 7c 20 20 20 20 20 20 7c 0a > Read| |.
0270: 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20 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 2b 2d 2d 2d 2d 2d 2b 20 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 2b +
02c0: 2d 2d 2d 2d 2d 2d 2b 0a 2a 2f 0a 0a 23 69 6e 63 ------+.*/..#inc
02d0: 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a lude "tlsInt.h".
02e0: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 #include <openss
02f0: 6c 2f 62 69 6f 2e 68 3e 0a 0a 2f 2a 20 44 65 66 l/bio.h>../* Def
0300: 69 6e 65 20 42 49 4f 20 6d 65 74 68 6f 64 73 20 ine BIO methods
0310: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 61 structure */.sta
0320: 74 69 63 20 42 49 4f 5f 4d 45 54 48 4f 44 20 2a tic BIO_METHOD *
0330: 42 69 6f 4d 65 74 68 6f 64 73 20 3d 20 4e 55 4c BioMethods = NUL
0340: 4c 3b 0a 0a 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d L;..../*. *-----
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 0a 20 2a 0a 20 2a 20 42 --------. *. * B
03a0: 49 4f 53 68 6f 75 6c 64 52 65 74 72 79 20 2d 2d IOShouldRetry --
03b0: 0a 20 2a 0a 20 2a 09 44 65 74 65 72 6d 69 6e 65 . *. *.Determine
03c0: 20 69 66 20 73 68 6f 75 6c 64 20 72 65 74 72 79 if should retry
03d0: 20 6f 70 65 72 61 74 69 6f 6e 20 62 61 73 65 64 operation based
03e0: 20 6f 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 on error code.
03f0: 53 61 6d 65 0a 20 2a 09 63 6f 6e 64 69 74 69 6f Same. *.conditio
0400: 6e 73 20 61 73 20 42 49 4f 5f 73 6f 63 6b 5f 73 ns as BIO_sock_s
0410: 68 6f 75 6c 64 5f 72 65 74 72 79 20 66 75 6e 63 hould_retry func
0420: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 tion.. *. * Resu
0430: 6c 74 73 3a 0a 20 2a 09 31 20 3d 20 72 65 74 72 lts:. *.1 = retr
0440: 79 2c 20 30 20 3d 20 6e 6f 20 72 65 74 72 79 0a y, 0 = no retry.
0450: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
0460: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 ts:. *.None. *.
0470: 2a 2d 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 0a 20 --------------.
04c0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 42 */..static int B
04d0: 49 4f 53 68 6f 75 6c 64 52 65 74 72 79 28 69 6e IOShouldRetry(in
04e0: 74 20 63 6f 64 65 29 20 7b 0a 20 20 20 20 69 6e t code) {. in
04f0: 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 64 t res = 0;. d
0500: 70 72 69 6e 74 66 28 22 42 49 4f 53 68 6f 75 6c printf("BIOShoul
0510: 64 52 65 74 72 79 20 25 64 3d 25 73 22 2c 20 63 dRetry %d=%s", c
0520: 6f 64 65 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 ode, Tcl_ErrnoMs
0530: 67 28 63 6f 64 65 29 29 3b 0a 0a 20 20 20 20 69 g(code));.. i
0540: 66 20 28 63 6f 64 65 20 3d 3d 20 45 41 47 41 49 f (code == EAGAI
0550: 4e 20 7c 7c 20 63 6f 64 65 20 3d 3d 20 45 57 4f N || code == EWO
0560: 55 4c 44 42 4c 4f 43 4b 20 7c 7c 20 63 6f 64 65 ULDBLOCK || code
0570: 20 3d 3d 20 45 4e 4f 54 43 4f 4e 4e 20 7c 7c 20 == ENOTCONN ||
0580: 63 6f 64 65 20 3d 3d 20 45 50 52 4f 54 4f 20 7c code == EPROTO |
0590: 7c 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a |.#ifdef _WIN32.
05a0: 09 63 6f 64 65 20 3d 3d 20 57 53 41 45 57 4f 55 .code == WSAEWOU
05b0: 4c 44 42 4c 4f 43 4b 20 7c 7c 0a 23 65 6e 64 69 LDBLOCK ||.#endi
05c0: 66 0a 09 63 6f 64 65 20 3d 3d 20 45 49 4e 54 52 f..code == EINTR
05d0: 20 7c 7c 20 63 6f 64 65 20 3d 3d 20 45 49 4e 50 || code == EINP
05e0: 52 4f 47 52 45 53 53 20 7c 7c 20 63 6f 64 65 20 ROGRESS || code
05f0: 3d 3d 20 45 41 4c 52 45 41 44 59 29 20 7b 0a 09 == EALREADY) {..
0600: 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a res = 1;. }..
0610: 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f dprintf("BIO
0620: 53 68 6f 75 6c 64 52 65 74 72 79 20 25 64 3d 25 ShouldRetry %d=%
0630: 73 2c 20 72 65 73 3d 25 64 22 2c 20 63 6f 64 65 s, res=%d", code
0640: 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 63 , Tcl_ErrnoMsg(c
0650: 6f 64 65 29 2c 20 72 65 73 29 3b 0a 0a 20 20 20 ode), res);..
0660: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a return res;.}..
0670: 2f 2a 0a 20 2a 2d 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 0a 20 2a 0a 20 2a 20 42 69 6f 57 72 69 74 --. *. * BioWrit
06d0: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 e --. *. *.This
06e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 function is used
06f0: 20 74 6f 20 72 65 61 64 20 65 6e 63 72 79 70 74 to read encrypt
0700: 65 64 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 ed data from the
0710: 20 42 49 4f 20 61 6e 64 20 77 72 69 74 65 20 69 BIO and write i
0720: 74 0a 20 2a 09 69 6e 74 6f 20 74 68 65 20 73 6f t. *.into the so
0730: 63 6b 65 74 2e 20 54 68 69 73 20 66 75 6e 63 74 cket. This funct
0740: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c ion will be call
0750: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 ed in response t
0760: 6f 20 74 68 65 0a 20 2a 09 61 70 70 6c 69 63 61 o the. *.applica
0770: 74 69 6f 6e 20 63 61 6c 6c 69 6e 67 20 74 68 65 tion calling the
0780: 20 42 49 4f 5f 77 72 69 74 65 5f 65 78 28 29 20 BIO_write_ex()
0790: 6f 72 20 42 49 4f 5f 77 72 69 74 65 28 29 20 66 or BIO_write() f
07a0: 75 6e 63 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 20 unctions.. *. *
07b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
07c0: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f rns the number o
07d0: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 f bytes written
07e0: 74 6f 20 63 68 61 6e 6e 65 6c 2c 20 30 20 66 6f to channel, 0 fo
07f0: 72 20 45 4f 46 2c 20 6f 72 20 2d 31 20 66 6f 72 r EOF, or -1 for
0800: 0a 20 2a 09 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a . *.error.. *. *
0810: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
0820: 2a 09 57 72 69 74 65 73 20 42 49 4f 20 64 61 74 *.Writes BIO dat
0830: 61 20 74 6f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a a to channel.. *
0840: 0a 20 2a 2d 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: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
08a0: 20 42 69 6f 57 72 69 74 65 28 42 49 4f 20 2a 62 BioWrite(BIO *b
08b0: 69 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a io, const char *
08c0: 62 75 66 2c 20 69 6e 74 20 62 75 66 4c 65 6e 29 buf, int bufLen)
08d0: 20 7b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 {. Tcl_Size
08e0: 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 5f ret;. int is_
08f0: 65 6f 66 2c 20 74 63 6c 45 72 72 6e 6f 3b 0a 20 eof, tclErrno;.
0900: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
0910: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 42 tr = (State *) B
0920: 49 4f 5f 67 65 74 5f 64 61 74 61 28 62 69 6f 29 IO_get_data(bio)
0930: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 ;. Tcl_Channe
0940: 6c 20 63 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 l chan = Tls_Get
0950: 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c Parent(statePtr,
0960: 20 30 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 0);.. dprint
0970: 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 69 6f f("[chan=%p] Bio
0980: 57 72 69 74 65 28 62 69 6f 3d 25 70 2c 20 62 75 Write(bio=%p, bu
0990: 66 3d 25 70 2c 20 6c 65 6e 3d 25 64 29 22 2c 20 f=%p, len=%d)",
09a0: 28 76 6f 69 64 20 2a 29 63 68 61 6e 2c 20 28 76 (void *)chan, (v
09b0: 6f 69 64 20 2a 29 20 62 69 6f 2c 20 62 75 66 2c oid *) bio, buf,
09c0: 20 62 75 66 4c 65 6e 29 3b 0a 0a 20 20 20 20 42 bufLen);.. B
09d0: 49 4f 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f 66 IO_clear_retry_f
09e0: 6c 61 67 73 28 62 69 6f 29 3b 0a 20 20 20 20 54 lags(bio);. T
09f0: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 30 29 3b 0a cl_SetErrno(0);.
0a00: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 64 61 . /* Write da
0a10: 74 61 20 74 6f 20 75 6e 64 65 72 6c 79 69 6e 67 ta to underlying
0a20: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
0a30: 72 65 74 20 3d 20 54 63 6c 5f 57 72 69 74 65 52 ret = Tcl_WriteR
0a40: 61 77 28 63 68 61 6e 2c 20 62 75 66 2c 20 28 54 aw(chan, buf, (T
0a50: 63 6c 5f 53 69 7a 65 29 20 62 75 66 4c 65 6e 29 cl_Size) bufLen)
0a60: 3b 0a 20 20 20 20 69 73 5f 65 6f 66 20 3d 20 54 ;. is_eof = T
0a70: 63 6c 5f 45 6f 66 28 63 68 61 6e 29 3b 0a 20 20 cl_Eof(chan);.
0a80: 20 20 74 63 6c 45 72 72 6e 6f 20 3d 20 54 63 6c tclErrno = Tcl
0a90: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20 _GetErrno();..
0aa0: 20 20 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e dprintf("[chan
0ab0: 3d 25 70 5d 20 42 69 6f 57 72 69 74 65 28 25 64 =%p] BioWrite(%d
0ac0: 29 20 2d 3e 20 25 22 20 54 43 4c 5f 53 49 5a 45 ) -> %" TCL_SIZE
0ad0: 5f 4d 4f 44 49 46 49 45 52 20 22 64 20 5b 74 63 _MODIFIER "d [tc
0ae0: 6c 45 6f 66 3d 25 64 3b 20 74 63 6c 45 72 72 6e lEof=%d; tclErrn
0af0: 6f 3d 25 64 3a 20 25 73 5d 22 2c 0a 09 28 76 6f o=%d: %s]",..(vo
0b00: 69 64 20 2a 29 20 63 68 61 6e 2c 20 62 75 66 4c id *) chan, bufL
0b10: 65 6e 2c 20 72 65 74 2c 20 69 73 5f 65 6f 66 2c en, ret, is_eof,
0b20: 20 74 63 6c 45 72 72 6e 6f 2c 20 54 63 6c 5f 45 tclErrno, Tcl_E
0b30: 72 72 6e 6f 4d 73 67 28 74 63 6c 45 72 72 6e 6f rrnoMsg(tclErrno
0b40: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 ));.. if (ret
0b50: 20 3e 20 30 29 20 7b 0a 09 64 70 72 69 6e 74 66 > 0) {..dprintf
0b60: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 77 ("Successfully w
0b70: 72 6f 74 65 20 25 22 20 54 43 4c 5f 53 49 5a 45 rote %" TCL_SIZE
0b80: 5f 4d 4f 44 49 46 49 45 52 20 22 64 20 62 79 74 _MODIFIER "d byt
0b90: 65 73 20 6f 66 20 64 61 74 61 22 2c 20 72 65 74 es of data", ret
0ba0: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 );.. } else i
0bb0: 66 20 28 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09 f (ret == 0) {..
0bc0: 69 66 20 28 69 73 5f 65 6f 66 29 20 7b 0a 09 20 if (is_eof) {..
0bd0: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
0be0: 45 4f 46 20 77 68 69 6c 65 20 77 72 69 74 69 6e EOF while writin
0bf0: 67 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20 43 g, returning a C
0c00: 6f 6e 6e 65 63 74 69 6f 6e 20 52 65 73 65 74 20 onnection Reset
0c10: 65 72 72 6f 72 20 77 68 69 63 68 20 6d 61 70 73 error which maps
0c20: 20 74 6f 20 53 6f 66 74 20 45 4f 46 22 29 3b 0a to Soft EOF");.
0c30: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 43 .Tcl_SetErrno(EC
0c40: 4f 4e 4e 52 45 53 45 54 29 3b 0a 09 20 20 20 20 ONNRESET);..
0c50: 42 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 62 69 BIO_set_flags(bi
0c60: 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 49 4e 5f o, BIO_FLAGS_IN_
0c70: 45 4f 46 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b EOF);...} else {
0c80: 0a 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 30 ..dprintf("Got 0
0c90: 20 66 72 6f 6d 20 54 63 6c 5f 57 72 69 74 65 52 from Tcl_WriteR
0ca0: 61 77 2c 20 61 6e 64 20 45 4f 46 20 69 73 20 6e aw, and EOF is n
0cb0: 6f 74 20 73 65 74 3b 20 72 65 74 20 3d 20 30 22 ot set; ret = 0"
0cc0: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f );.. BIO_set_
0cd0: 72 65 74 72 79 5f 77 72 69 74 65 28 62 69 6f 29 retry_write(bio)
0ce0: 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 53 65 74 ;...dprintf("Set
0cf0: 74 69 6e 67 20 72 65 74 72 79 20 72 65 61 64 20 ting retry read
0d00: 66 6c 61 67 22 29 3b 0a 09 42 49 4f 5f 73 65 74 flag");..BIO_set
0d10: 5f 72 65 74 72 79 5f 72 65 61 64 28 62 69 6f 29 _retry_read(bio)
0d20: 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 ;..}.. } else
0d30: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 57 65 20 {..dprintf("We
0d40: 67 6f 74 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 got some kind of
0d50: 20 49 2f 4f 20 65 72 72 6f 72 22 29 3b 0a 0a 09 I/O error");...
0d60: 69 66 20 28 42 49 4f 53 68 6f 75 6c 64 52 65 74 if (BIOShouldRet
0d70: 72 79 28 74 63 6c 45 72 72 6e 6f 29 29 20 7b 0a ry(tclErrno)) {.
0d80: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 72 . dprintf("Tr
0d90: 79 20 61 67 61 69 6e 20 66 6f 72 3a 20 25 69 3d y again for: %i=
0da0: 25 73 22 2c 20 74 63 6c 45 72 72 6e 6f 2c 20 54 %s", tclErrno, T
0db0: 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 74 63 6c 45 cl_ErrnoMsg(tclE
0dc0: 72 72 6e 6f 29 29 3b 0a 09 20 20 20 20 42 49 4f rrno));.. BIO
0dd0: 5f 73 65 74 5f 72 65 74 72 79 5f 77 72 69 74 65 _set_retry_write
0de0: 28 62 69 6f 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 (bio);...} else
0df0: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
0e00: 55 6e 65 78 70 65 63 74 65 64 20 65 72 72 6f 72 Unexpected error
0e10: 3a 20 25 69 3d 25 73 22 2c 20 74 63 6c 45 72 72 : %i=%s", tclErr
0e20: 6e 6f 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 no, Tcl_ErrnoMsg
0e30: 28 74 63 6c 45 72 72 6e 6f 29 29 3b 0a 09 7d 0a (tclErrno));..}.
0e40: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
0e50: 74 66 28 22 42 69 6f 57 72 69 74 65 20 72 65 74 tf("BioWrite ret
0e60: 75 72 6e 69 6e 67 20 25 22 20 54 43 4c 5f 53 49 urning %" TCL_SI
0e70: 5a 45 5f 4d 4f 44 49 46 49 45 52 20 22 64 22 2c ZE_MODIFIER "d",
0e80: 20 72 65 74 29 3b 0a 20 20 20 20 72 65 74 75 72 ret);. retur
0e90: 6e 20 28 69 6e 74 29 20 72 65 74 3b 0a 7d 0a 0a n (int) ret;.}..
0ea0: 2f 2a 0a 20 2a 2d 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 0a 20 2a 0a 20 2a 20 42 69 6f 52 65 61 64 --. *. * BioRead
0f00: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 --. *. *.This f
0f10: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 unction is used
0f20: 74 6f 20 72 65 61 64 20 65 6e 63 72 79 70 74 65 to read encrypte
0f30: 64 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 d data from the
0f40: 73 6f 63 6b 65 74 20 61 6e 64 0a 20 2a 09 77 72 socket and. *.wr
0f50: 69 74 65 20 69 74 20 69 6e 74 6f 20 74 68 65 20 ite it into the
0f60: 42 49 4f 2e 20 54 68 69 73 20 66 75 6e 63 74 69 BIO. This functi
0f70: 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 on will be calle
0f80: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f d in response to
0f90: 20 74 68 65 0a 20 2a 09 61 70 70 6c 69 63 61 74 the. *.applicat
0fa0: 69 6f 6e 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 ion calling the
0fb0: 42 49 4f 5f 72 65 61 64 5f 65 78 28 29 20 6f 72 BIO_read_ex() or
0fc0: 20 42 49 4f 5f 72 65 61 64 28 29 20 66 75 6e 63 BIO_read() func
0fd0: 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 tions.. *. * Res
0fe0: 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 ults:. *.Returns
0ff0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
1000: 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 63 ytes read from c
1010: 68 61 6e 6e 65 6c 2c 20 30 20 66 6f 72 20 45 4f hannel, 0 for EO
1020: 46 2c 20 6f 72 20 2d 31 20 66 6f 72 0a 20 2a 09 F, or -1 for. *.
1030: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 error.. *. * Sid
1040: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 e effects:. *.Re
1050: 61 64 73 20 63 68 61 6e 6e 65 6c 20 64 61 74 61 ads channel data
1060: 20 69 6e 74 6f 20 42 49 4f 2e 0a 20 2a 0a 20 2a into BIO.. *. *
1070: 20 44 61 74 61 20 69 73 20 72 65 63 65 69 76 65 Data is receive
1080: 64 20 69 6e 20 77 68 6f 6c 65 20 62 6c 6f 63 6b d in whole block
1090: 73 20 6b 6e 6f 77 6e 20 61 73 20 72 65 63 6f 72 s known as recor
10a0: 64 73 20 66 72 6f 6d 20 74 68 65 20 70 65 65 72 ds from the peer
10b0: 2e 20 41 20 77 68 6f 6c 65 0a 20 2a 20 72 65 63 . A whole. * rec
10c0: 6f 72 64 20 69 73 20 70 72 6f 63 65 73 73 65 64 ord is processed
10d0: 20 28 65 2e 67 2e 20 64 65 63 72 79 70 74 65 64 (e.g. decrypted
10e0: 29 20 69 6e 20 6f 6e 65 20 67 6f 20 61 6e 64 20 ) in one go and
10f0: 69 73 20 62 75 66 66 65 72 65 64 20 62 79 20 4f is buffered by O
1100: 70 65 6e 53 53 4c 0a 20 2a 20 75 6e 74 69 6c 20 penSSL. * until
1110: 69 74 20 69 73 20 72 65 61 64 20 62 79 20 74 68 it is read by th
1120: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 76 69 e application vi
1130: 61 20 61 20 63 61 6c 6c 20 74 6f 20 53 53 4c 5f a a call to SSL_
1140: 72 65 61 64 2e 20 53 53 4c 5f 70 65 6e 64 69 6e read. SSL_pendin
1150: 67 28 29 0a 20 2a 20 72 65 74 75 72 6e 73 20 74 g(). * returns t
1160: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
1170: 65 73 20 77 68 69 63 68 20 68 61 76 65 20 62 65 es which have be
1180: 65 6e 20 70 72 6f 63 65 73 73 65 64 2c 20 62 75 en processed, bu
1190: 66 66 65 72 65 64 2c 20 61 6e 64 20 61 72 65 0a ffered, and are.
11a0: 20 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 73 * available ins
11b0: 69 64 65 20 73 73 6c 20 66 6f 72 20 69 6d 6d 65 ide ssl for imme
11c0: 64 69 61 74 65 20 72 65 61 64 2e 20 53 53 4c 5f diate read. SSL_
11d0: 68 61 73 5f 70 65 6e 64 69 6e 67 28 29 20 72 65 has_pending() re
11e0: 74 75 72 6e 73 20 31 20 69 66 0a 20 2a 20 64 61 turns 1 if. * da
11f0: 74 61 20 69 73 20 62 75 66 66 65 72 65 64 20 28 ta is buffered (
1200: 77 68 65 74 68 65 72 20 70 72 6f 63 65 73 73 65 whether processe
1210: 64 20 6f 72 20 75 6e 70 72 6f 63 65 73 73 65 64 d or unprocessed
1220: 29 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 ) and 0 otherwis
1230: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
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 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
1290: 63 20 69 6e 74 20 42 69 6f 52 65 61 64 28 42 49 c int BioRead(BI
12a0: 4f 20 2a 62 69 6f 2c 20 63 68 61 72 20 2a 62 75 O *bio, char *bu
12b0: 66 2c 20 69 6e 74 20 62 75 66 4c 65 6e 29 20 7b f, int bufLen) {
12c0: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 72 65 . Tcl_Size re
12d0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 t = 0;. int i
12e0: 73 5f 65 6f 66 2c 20 74 63 6c 45 72 72 6e 6f 2c s_eof, tclErrno,
12f0: 20 69 73 5f 62 6c 6f 63 6b 65 64 3b 0a 20 20 20 is_blocked;.
1300: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
1310: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 42 49 4f = (State *) BIO
1320: 5f 67 65 74 5f 64 61 74 61 28 62 69 6f 29 3b 0a _get_data(bio);.
1330: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
1340: 63 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 chan = Tls_GetPa
1350: 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 30 rent(statePtr, 0
1360: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
1370: 22 5b 63 68 61 6e 3d 25 70 5d 20 42 69 6f 52 65 "[chan=%p] BioRe
1380: 61 64 28 62 69 6f 3d 25 70 2c 20 62 75 66 3d 25 ad(bio=%p, buf=%
1390: 70 2c 20 6c 65 6e 3d 25 64 29 22 2c 20 28 76 6f p, len=%d)", (vo
13a0: 69 64 20 2a 29 20 63 68 61 6e 2c 20 28 76 6f 69 id *) chan, (voi
13b0: 64 20 2a 29 20 62 69 6f 2c 20 62 75 66 2c 20 62 d *) bio, buf, b
13c0: 75 66 4c 65 6e 29 3b 0a 0a 20 20 20 20 69 66 20 ufLen);.. if
13d0: 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 (buf == NULL ||
13e0: 62 75 66 4c 65 6e 20 3c 3d 20 30 29 20 7b 0a 09 bufLen <= 0) {..
13f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a return 0;. }.
1400: 0a 20 20 20 20 42 49 4f 5f 63 6c 65 61 72 5f 72 . BIO_clear_r
1410: 65 74 72 79 5f 66 6c 61 67 73 28 62 69 6f 29 3b etry_flags(bio);
1420: 0a 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e . Tcl_SetErrn
1430: 6f 28 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 o(0);.. /* Re
1440: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 75 6e 64 ad data from und
1450: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 erlying channel
1460: 2a 2f 0a 20 20 20 20 72 65 74 20 3d 20 54 63 6c */. ret = Tcl
1470: 5f 52 65 61 64 52 61 77 28 63 68 61 6e 2c 20 62 _ReadRaw(chan, b
1480: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 62 uf, (Tcl_Size) b
1490: 75 66 4c 65 6e 29 3b 0a 0a 20 20 20 20 69 73 5f ufLen);.. is_
14a0: 65 6f 66 20 3d 20 54 63 6c 5f 45 6f 66 28 63 68 eof = Tcl_Eof(ch
14b0: 61 6e 29 3b 0a 20 20 20 20 74 63 6c 45 72 72 6e an);. tclErrn
14c0: 6f 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f o = Tcl_GetErrno
14d0: 28 29 3b 0a 20 20 20 20 69 73 5f 62 6c 6f 63 6b ();. is_block
14e0: 65 64 20 3d 20 54 63 6c 5f 49 6e 70 75 74 42 6c ed = Tcl_InputBl
14f0: 6f 63 6b 65 64 28 63 68 61 6e 29 3b 0a 0a 20 20 ocked(chan);..
1500: 20 20 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e dprintf("[chan
1510: 3d 25 70 5d 20 42 69 6f 52 65 61 64 28 25 64 29 =%p] BioRead(%d)
1520: 20 2d 3e 20 25 22 20 54 43 4c 5f 53 49 5a 45 5f -> %" TCL_SIZE_
1530: 4d 4f 44 49 46 49 45 52 20 22 64 20 5b 74 63 6c MODIFIER "d [tcl
1540: 45 6f 66 3d 25 64 3b 20 62 6c 6f 63 6b 65 64 3d Eof=%d; blocked=
1550: 25 64 3b 20 74 63 6c 45 72 72 6e 6f 3d 25 64 3a %d; tclErrno=%d:
1560: 20 25 73 5d 22 2c 0a 09 28 76 6f 69 64 20 2a 29 %s]",..(void *)
1570: 20 63 68 61 6e 2c 20 62 75 66 4c 65 6e 2c 20 72 chan, bufLen, r
1580: 65 74 2c 20 69 73 5f 65 6f 66 2c 20 69 73 5f 62 et, is_eof, is_b
1590: 6c 6f 63 6b 65 64 2c 20 74 63 6c 45 72 72 6e 6f locked, tclErrno
15a0: 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 74 , Tcl_ErrnoMsg(t
15b0: 63 6c 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 20 20 clErrno));..
15c0: 69 66 20 28 72 65 74 20 3e 20 30 29 20 7b 0a 09 if (ret > 0) {..
15d0: 64 70 72 69 6e 74 66 28 22 53 75 63 63 65 73 73 dprintf("Success
15e0: 66 75 6c 6c 79 20 72 65 61 64 20 25 22 20 54 43 fully read %" TC
15f0: 4c 5f 53 49 5a 45 5f 4d 4f 44 49 46 49 45 52 20 L_SIZE_MODIFIER
1600: 22 64 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 "d bytes of data
1610: 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 7d 20 ", ret);.. }
1620: 65 6c 73 65 20 69 66 20 28 72 65 74 20 3d 3d 20 else if (ret ==
1630: 30 29 20 7b 0a 09 69 66 20 28 69 73 5f 65 6f 66 0) {..if (is_eof
1640: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
1650: 28 22 47 6f 74 20 45 4f 46 20 77 68 69 6c 65 20 ("Got EOF while
1660: 72 65 61 64 69 6e 67 2c 20 72 65 74 75 72 6e 69 reading, returni
1670: 6e 67 20 61 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 ng a Connection
1680: 52 65 73 65 74 20 65 72 72 6f 72 20 77 68 69 63 Reset error whic
1690: 68 20 6d 61 70 73 20 74 6f 20 53 6f 66 74 20 45 h maps to Soft E
16a0: 4f 46 22 29 3b 0a 09 20 20 20 54 63 6c 5f 53 65 OF");.. Tcl_Se
16b0: 74 45 72 72 6e 6f 28 45 43 4f 4e 4e 52 45 53 45 tErrno(ECONNRESE
16c0: 54 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 T);.. BIO_set
16d0: 5f 66 6c 61 67 73 28 62 69 6f 2c 20 42 49 4f 5f _flags(bio, BIO_
16e0: 46 4c 41 47 53 5f 49 4e 5f 45 4f 46 29 3b 0a 0a FLAGS_IN_EOF);..
16f0: 09 7d 20 65 6c 73 65 20 69 66 20 28 69 73 5f 62 .} else if (is_b
1700: 6c 6f 63 6b 65 64 29 20 7b 0a 09 20 20 20 20 64 locked) {.. d
1710: 70 72 69 6e 74 66 28 22 47 6f 74 20 69 6e 70 75 printf("Got inpu
1720: 74 20 62 6c 6f 63 6b 65 64 20 66 72 6f 6d 20 54 t blocked from T
1730: 63 6c 5f 52 65 61 64 52 61 77 22 29 3b 0a 09 20 cl_ReadRaw");..
1740: 20 20 20 64 70 72 69 6e 74 66 28 22 53 65 74 74 dprintf("Sett
1750: 69 6e 67 20 72 65 74 72 79 20 72 65 61 64 20 66 ing retry read f
1760: 6c 61 67 22 29 3b 0a 09 20 20 20 20 42 49 4f 5f lag");.. BIO_
1770: 73 65 74 5f 72 65 74 72 79 5f 72 65 61 64 28 62 set_retry_read(b
1780: 69 6f 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 io);..}.. } e
1790: 6c 73 65 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 lse {..dprintf("
17a0: 57 65 20 67 6f 74 20 73 6f 6d 65 20 6b 69 6e 64 We got some kind
17b0: 20 6f 66 20 49 2f 4f 20 65 72 72 6f 72 22 29 3b of I/O error");
17c0: 0a 0a 09 69 66 20 28 42 49 4f 53 68 6f 75 6c 64 ...if (BIOShould
17d0: 52 65 74 72 79 28 74 63 6c 45 72 72 6e 6f 29 29 Retry(tclErrno))
17e0: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
17f0: 22 54 72 79 20 61 67 61 69 6e 20 66 6f 72 3a 20 "Try again for:
1800: 25 69 3d 25 73 22 2c 20 74 63 6c 45 72 72 6e 6f %i=%s", tclErrno
1810: 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 74 , Tcl_ErrnoMsg(t
1820: 63 6c 45 72 72 6e 6f 29 29 3b 0a 09 20 20 20 20 clErrno));..
1830: 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 BIO_set_retry_re
1840: 61 64 28 62 69 6f 29 3b 0a 0a 09 7d 20 65 6c 73 ad(bio);...} els
1850: 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 e {.. dprintf
1860: 28 22 55 6e 65 78 70 65 63 74 65 64 20 65 72 72 ("Unexpected err
1870: 6f 72 3a 20 25 69 3d 25 73 22 2c 20 74 63 6c 45 or: %i=%s", tclE
1880: 72 72 6e 6f 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d rrno, Tcl_ErrnoM
1890: 73 67 28 74 63 6c 45 72 72 6e 6f 29 29 3b 0a 09 sg(tclErrno));..
18a0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 }. }.. dpr
18b0: 69 6e 74 66 28 22 42 69 6f 52 65 61 64 20 72 65 intf("BioRead re
18c0: 74 75 72 6e 69 6e 67 20 25 22 20 54 43 4c 5f 53 turning %" TCL_S
18d0: 49 5a 45 5f 4d 4f 44 49 46 49 45 52 20 22 64 22 IZE_MODIFIER "d"
18e0: 2c 20 72 65 74 29 3b 0a 20 20 20 20 72 65 74 75 , ret);. retu
18f0: 72 6e 20 28 69 6e 74 29 20 72 65 74 3b 0a 7d 0a rn (int) ret;.}.
1900: 0a 2f 2a 0a 20 2a 2d 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 0a 20 2a 0a 20 2a 20 42 69 6f 50 75 74 ---. *. * BioPut
1960: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 s --. *. *.This
1970: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 function is used
1980: 20 74 6f 20 72 65 61 64 20 61 20 4e 55 4c 4c 20 to read a NULL
1990: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e terminated strin
19a0: 67 20 66 72 6f 6d 20 74 68 65 20 42 49 4f 20 61 g from the BIO a
19b0: 6e 64 0a 20 2a 09 77 72 69 74 65 20 69 74 20 74 nd. *.write it t
19c0: 6f 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 54 o the channel. T
19d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c his function wil
19e0: 6c 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 72 l be called in r
19f0: 65 73 70 6f 6e 73 65 20 74 6f 0a 20 2a 09 74 68 esponse to. *.th
1a00: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 e application ca
1a10: 6c 6c 69 6e 67 20 74 68 65 20 42 49 4f 5f 70 75 lling the BIO_pu
1a20: 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 ts() function..
1a30: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
1a40: 09 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d .Returns the num
1a50: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 ber of bytes wri
1a60: 74 74 65 6e 20 74 6f 20 63 68 61 6e 6e 65 6c 20 tten to channel
1a70: 6f 72 20 30 20 66 6f 72 20 65 72 72 6f 72 2e 0a or 0 for error..
1a80: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1a90: 74 73 3a 0a 20 2a 09 57 72 69 74 65 73 20 64 61 ts:. *.Writes da
1aa0: 74 61 20 74 6f 20 63 68 61 6e 6e 65 6c 2e 0a 20 ta to channel..
1ab0: 2a 0a 20 2a 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
1b10: 74 20 42 69 6f 50 75 74 73 28 42 49 4f 20 2a 62 t BioPuts(BIO *b
1b20: 69 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a io, const char *
1b30: 73 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e str) {. dprin
1b40: 74 66 28 22 42 69 6f 50 75 74 73 28 25 70 29 20 tf("BioPuts(%p)
1b50: 5c 22 25 73 5c 22 22 2c 20 62 69 6f 2c 20 73 74 \"%s\"", bio, st
1b60: 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 r);.. return
1b70: 42 69 6f 57 72 69 74 65 28 62 69 6f 2c 20 73 74 BioWrite(bio, st
1b80: 72 2c 20 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 r, (int) strlen(
1b90: 73 74 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 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 0a 20 2a 0a ------------. *.
1bf0: 20 2a 20 42 69 6f 43 74 72 6c 20 2d 2d 0a 20 2a * BioCtrl --. *
1c00: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f . *.This functio
1c10: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f n is used to pro
1c20: 63 65 73 73 20 63 6f 6e 74 72 6f 6c 20 6d 65 73 cess control mes
1c30: 73 61 67 65 73 20 69 6e 20 74 68 65 20 42 49 4f sages in the BIO
1c40: 2e 20 54 68 69 73 0a 20 2a 09 66 75 6e 63 74 69 . This. *.functi
1c50: 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 on will be calle
1c60: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f d in response to
1c70: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e the application
1c80: 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 20 2a 09 calling the. *.
1c90: 42 49 4f 5f 63 74 72 6c 28 29 20 66 75 6e 63 74 BIO_ctrl() funct
1ca0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
1cb0: 74 73 3a 0a 20 2a 09 46 75 6e 63 74 69 6f 6e 20 ts:. *.Function
1cc0: 64 65 70 65 6e 64 65 6e 74 0a 20 2a 0a 20 2a 20 dependent. *. *
1cd0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
1ce0: 09 46 75 6e 63 74 69 6f 6e 20 64 65 70 65 6e 64 .Function depend
1cf0: 65 6e 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ent. *. *-------
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 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
1d50: 69 63 20 6c 6f 6e 67 20 42 69 6f 43 74 72 6c 28 ic long BioCtrl(
1d60: 42 49 4f 20 2a 62 69 6f 2c 20 69 6e 74 20 63 6d BIO *bio, int cm
1d70: 64 2c 20 6c 6f 6e 67 20 6e 75 6d 2c 20 76 6f 69 d, long num, voi
1d80: 64 20 2a 70 74 72 29 20 7b 0a 20 20 20 20 6c 6f d *ptr) {. lo
1d90: 6e 67 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 ng ret = 1;.
1da0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
1db0: 3d 20 28 53 74 61 74 65 20 2a 29 20 42 49 4f 5f = (State *) BIO_
1dc0: 67 65 74 5f 64 61 74 61 28 62 69 6f 29 3b 0a 20 get_data(bio);.
1dd0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
1de0: 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 han = Tls_GetPar
1df0: 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 30 29 ent(statePtr, 0)
1e00: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
1e10: 42 69 6f 43 74 72 6c 28 25 70 2c 20 30 78 25 78 BioCtrl(%p, 0x%x
1e20: 2c 20 30 78 25 6c 78 2c 20 25 70 29 22 2c 20 28 , 0x%lx, %p)", (
1e30: 76 6f 69 64 20 2a 29 20 62 69 6f 2c 20 63 6d 64 void *) bio, cmd
1e40: 2c 20 6e 75 6d 2c 20 70 74 72 29 3b 0a 0a 20 20 , num, ptr);..
1e50: 20 20 73 77 69 74 63 68 20 28 63 6d 64 29 20 7b switch (cmd) {
1e60: 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f ..case BIO_CTRL_
1e70: 52 45 53 45 54 3a 0a 09 09 2f 2a 20 6f 70 74 20 RESET:.../* opt
1e80: 2d 20 52 65 73 65 74 73 20 42 49 4f 20 74 6f 20 - Resets BIO to
1e90: 69 6e 69 74 69 61 6c 20 73 74 61 74 65 2e 20 49 initial state. I
1ea0: 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 72 65 mplements BIO_re
1eb0: 73 65 74 2e 20 2a 2f 0a 09 09 64 70 72 69 6e 74 set. */...dprint
1ec0: 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f f("Got BIO_CTRL_
1ed0: 52 45 53 45 54 22 29 3b 0a 09 09 2f 2a 20 52 65 RESET");.../* Re
1ee0: 74 75 72 6e 20 31 20 66 6f 72 20 73 75 63 63 65 turn 1 for succe
1ef0: 73 73 20 28 30 20 66 6f 72 20 66 69 6c 65 20 42 ss (0 for file B
1f00: 49 4f 73 29 20 61 6e 64 20 2d 31 20 66 6f 72 20 IOs) and -1 for
1f10: 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 72 65 74 failure */...ret
1f20: 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 = 0;...break;..
1f30: 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f 45 4f case BIO_CTRL_EO
1f40: 46 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 52 65 F:.../* opt - Re
1f50: 74 75 72 6e 73 20 77 68 65 74 68 65 72 20 45 4f turns whether EO
1f60: 46 20 68 61 73 20 62 65 65 6e 20 72 65 61 63 68 F has been reach
1f70: 65 64 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 ed. Implements B
1f80: 49 4f 5f 65 6f 66 2e 20 2a 2f 0a 09 09 64 70 72 IO_eof. */...dpr
1f90: 69 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 intf("Got BIO_CT
1fa0: 52 4c 5f 45 4f 46 22 29 3b 0a 09 09 2f 2a 20 52 RL_EOF");.../* R
1fb0: 65 74 75 72 6e 73 20 31 20 69 66 20 45 4f 46 20 eturns 1 if EOF
1fc0: 68 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 64 has been reached
1fd0: 2c 20 30 20 69 66 20 6e 6f 74 2c 20 6f 72 20 3c , 0 if not, or <
1fe0: 30 20 66 6f 72 20 66 61 69 6c 75 72 65 20 2a 2f 0 for failure */
1ff0: 0a 09 09 72 65 74 20 3d 20 28 28 63 68 61 6e 29 ...ret = ((chan)
2000: 20 3f 20 28 54 63 6c 5f 45 6f 66 28 63 68 61 6e ? (Tcl_Eof(chan
2010: 29 20 7c 7c 20 42 49 4f 5f 74 65 73 74 5f 66 6c ) || BIO_test_fl
2020: 61 67 73 28 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 ags(bio, BIO_FLA
2030: 47 53 5f 49 4e 5f 45 4f 46 29 29 20 3a 20 31 29 GS_IN_EOF)) : 1)
2040: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 ;...break;..case
2050: 20 42 49 4f 5f 43 54 52 4c 5f 49 4e 46 4f 3a 0a BIO_CTRL_INFO:.
2060: 09 09 2f 2a 20 6f 70 74 20 2d 20 65 78 74 72 61 ../* opt - extra
2070: 20 69 6e 66 6f 20 6f 6e 20 42 49 4f 2e 20 49 6d info on BIO. Im
2080: 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 67 65 74 plements BIO_get
2090: 5f 6d 65 6d 5f 64 61 74 61 20 2a 2f 0a 09 09 64 _mem_data */...d
20a0: 70 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f printf("Got BIO_
20b0: 43 54 52 4c 5f 49 4e 46 4f 22 29 3b 0a 09 09 72 CTRL_INFO");...r
20c0: 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b et = 0;...break;
20d0: 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f ..case BIO_CTRL_
20e0: 53 45 54 3a 0a 09 09 2f 2a 20 6d 61 6e 20 2d 20 SET:.../* man -
20f0: 73 65 74 20 74 68 65 20 27 49 4f 27 20 70 61 72 set the 'IO' par
2100: 61 6d 65 74 65 72 20 2a 2f 0a 09 09 64 70 72 69 ameter */...dpri
2110: 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 ntf("Got BIO_CTR
2120: 4c 5f 53 45 54 22 29 3b 0a 09 09 72 65 74 20 3d L_SET");...ret =
2130: 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 0;...break;..ca
2140: 73 65 20 42 49 4f 5f 43 54 52 4c 5f 47 45 54 3a se BIO_CTRL_GET:
2150: 0a 09 09 2f 2a 20 6d 61 6e 20 2d 20 67 65 74 20 .../* man - get
2160: 74 68 65 20 27 49 4f 27 20 70 61 72 61 6d 65 74 the 'IO' paramet
2170: 65 72 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 er */...dprintf(
2180: 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 47 45 "Got BIO_CTRL_GE
2190: 54 20 22 29 3b 0a 09 09 72 65 74 20 3d 20 30 3b T ");...ret = 0;
21a0: 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 ...break;..case
21b0: 42 49 4f 5f 43 54 52 4c 5f 50 55 53 48 3a 0a 09 BIO_CTRL_PUSH:..
21c0: 09 2f 2a 20 6f 70 74 20 2d 20 69 6e 74 65 72 6e ./* opt - intern
21d0: 61 6c 2c 20 75 73 65 64 20 74 6f 20 73 69 67 6e al, used to sign
21e0: 69 66 79 20 63 68 61 6e 67 65 2e 20 49 6d 70 6c ify change. Impl
21f0: 65 6d 65 6e 74 73 20 42 49 4f 5f 70 75 73 68 20 ements BIO_push
2200: 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 47 6f */...dprintf("Go
2210: 74 20 42 49 4f 5f 43 54 52 4c 5f 50 55 53 48 22 t BIO_CTRL_PUSH"
2220: 29 3b 0a 09 09 72 65 74 20 3d 20 30 3b 0a 09 09 );...ret = 0;...
2230: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f break;..case BIO
2240: 5f 43 54 52 4c 5f 50 4f 50 3a 0a 09 09 2f 2a 20 _CTRL_POP:.../*
2250: 6f 70 74 20 2d 20 69 6e 74 65 72 6e 61 6c 2c 20 opt - internal,
2260: 75 73 65 64 20 74 6f 20 73 69 67 6e 69 66 79 20 used to signify
2270: 63 68 61 6e 67 65 2e 20 49 6d 70 6c 65 6d 65 6e change. Implemen
2280: 74 73 20 42 49 4f 5f 70 6f 70 20 2a 2f 0a 09 09 ts BIO_pop */...
2290: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f dprintf("Got BIO
22a0: 5f 43 54 52 4c 5f 50 4f 50 22 29 3b 0a 09 09 72 _CTRL_POP");...r
22b0: 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b et = 0;...break;
22c0: 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f ..case BIO_CTRL_
22d0: 47 45 54 5f 43 4c 4f 53 45 3a 0a 09 09 2f 2a 20 GET_CLOSE:.../*
22e0: 6d 61 6e 20 2d 20 47 65 74 20 74 68 65 20 63 6c man - Get the cl
22f0: 6f 73 65 20 6f 6e 20 42 49 4f 5f 66 72 65 65 28 ose on BIO_free(
2300: 29 20 66 6c 61 67 20 73 65 74 20 62 79 20 42 49 ) flag set by BI
2310: 4f 5f 43 54 52 4c 5f 53 45 54 5f 43 4c 4f 53 45 O_CTRL_SET_CLOSE
2320: 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f . Implements BIO
2330: 5f 67 65 74 5f 63 6c 6f 73 65 20 2a 2f 0a 09 09 _get_close */...
2340: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f dprintf("Got BIO
2350: 5f 43 54 52 4c 5f 43 4c 4f 53 45 22 29 3b 0a 09 _CTRL_CLOSE");..
2360: 09 2f 2a 20 52 65 74 75 72 6e 73 20 42 49 4f 5f ./* Returns BIO_
2370: 43 4c 4f 53 45 2c 20 42 49 4f 5f 4e 4f 43 4c 4f CLOSE, BIO_NOCLO
2380: 53 45 2c 20 6f 72 20 3c 30 20 66 6f 72 20 66 61 SE, or <0 for fa
2390: 69 6c 75 72 65 20 2a 2f 0a 09 09 72 65 74 20 3d ilure */...ret =
23a0: 20 42 49 4f 5f 67 65 74 5f 73 68 75 74 64 6f 77 BIO_get_shutdow
23b0: 6e 28 62 69 6f 29 3b 0a 09 09 62 72 65 61 6b 3b n(bio);...break;
23c0: 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f ..case BIO_CTRL_
23d0: 53 45 54 5f 43 4c 4f 53 45 3a 0a 09 09 2f 2a 20 SET_CLOSE:.../*
23e0: 6d 61 6e 20 2d 20 53 65 74 20 74 68 65 20 63 6c man - Set the cl
23f0: 6f 73 65 20 6f 6e 20 42 49 4f 5f 66 72 65 65 28 ose on BIO_free(
2400: 29 20 66 6c 61 67 2e 20 49 6d 70 6c 65 6d 65 6e ) flag. Implemen
2410: 74 73 20 42 49 4f 5f 73 65 74 5f 63 6c 6f 73 65 ts BIO_set_close
2420: 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 47 */...dprintf("G
2430: 6f 74 20 42 49 4f 5f 53 45 54 5f 43 4c 4f 53 45 ot BIO_SET_CLOSE
2440: 22 29 3b 0a 09 09 42 49 4f 5f 73 65 74 5f 73 68 ");...BIO_set_sh
2450: 75 74 64 6f 77 6e 28 62 69 6f 2c 20 6e 75 6d 29 utdown(bio, num)
2460: 3b 0a 09 09 2f 2a 20 52 65 74 75 72 6e 73 20 31 ;.../* Returns 1
2470: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 3c on success or <
2480: 3d 30 20 66 6f 72 20 66 61 69 6c 75 72 65 20 2a =0 for failure *
2490: 2f 0a 09 09 72 65 74 20 3d 20 31 3b 0a 09 09 62 /...ret = 1;...b
24a0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f 5f reak;..case BIO_
24b0: 43 54 52 4c 5f 50 45 4e 44 49 4e 47 3a 0a 09 09 CTRL_PENDING:...
24c0: 2f 2a 20 6f 70 74 20 2d 20 52 65 74 75 72 6e 20 /* opt - Return
24d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 number of bytes
24e0: 69 6e 20 42 49 4f 20 77 61 69 74 69 6e 67 20 74 in BIO waiting t
24f0: 6f 20 62 65 20 72 65 61 64 2e 20 49 6d 70 6c 65 o be read. Imple
2500: 6d 65 6e 74 73 20 42 49 4f 5f 70 65 6e 64 69 6e ments BIO_pendin
2510: 67 2e 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 g. */...dprintf(
2520: 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 50 45 "Got BIO_CTRL_PE
2530: 4e 44 49 4e 47 22 29 3b 0a 09 09 2f 2a 20 52 65 NDING");.../* Re
2540: 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 turn the amount
2550: 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 of pending data
2560: 6f 72 20 30 20 66 6f 72 20 65 72 72 6f 72 20 2a or 0 for error *
2570: 2f 0a 09 09 72 65 74 20 3d 20 28 28 63 68 61 6e /...ret = ((chan
2580: 29 20 3f 20 54 63 6c 5f 49 6e 70 75 74 42 75 66 ) ? Tcl_InputBuf
2590: 66 65 72 65 64 28 63 68 61 6e 29 20 3a 20 30 29 fered(chan) : 0)
25a0: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 ;...break;..case
25b0: 20 42 49 4f 5f 43 54 52 4c 5f 46 4c 55 53 48 3a BIO_CTRL_FLUSH:
25c0: 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 46 6c 75 73 .../* opt - Flus
25d0: 68 20 61 6e 79 20 62 75 66 66 65 72 65 64 20 6f h any buffered o
25e0: 75 74 70 75 74 2e 20 49 6d 70 6c 65 6d 65 6e 74 utput. Implement
25f0: 73 20 42 49 4f 5f 66 6c 75 73 68 2e 20 2a 2f 0a s BIO_flush. */.
2600: 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 ..dprintf("Got B
2610: 49 4f 5f 43 54 52 4c 5f 46 4c 55 53 48 22 29 3b IO_CTRL_FLUSH");
2620: 0a 09 09 2f 2a 20 55 73 65 20 54 63 6c 5f 57 72 .../* Use Tcl_Wr
2630: 69 74 65 52 61 77 20 69 6e 73 74 65 61 64 20 6f iteRaw instead o
2640: 66 20 54 63 6c 5f 46 6c 75 73 68 20 74 6f 20 6f f Tcl_Flush to o
2650: 70 65 72 61 74 65 20 6f 6e 20 72 69 67 68 74 20 perate on right
2660: 63 68 61 6e 20 69 6e 20 73 74 61 63 6b 20 2a 2f chan in stack */
2670: 0a 09 09 2f 2a 20 52 65 74 75 72 6e 73 20 31 20 .../* Returns 1
2680: 66 6f 72 20 73 75 63 63 65 73 73 2c 20 3c 3d 30 for success, <=0
2690: 20 66 6f 72 20 65 72 72 6f 72 2f 72 65 74 72 79 for error/retry
26a0: 2e 20 2a 2f 0a 09 09 72 65 74 20 3d 20 28 28 63 . */...ret = ((c
26b0: 68 61 6e 29 20 26 26 20 28 54 63 6c 5f 57 72 69 han) && (Tcl_Wri
26c0: 74 65 52 61 77 28 63 68 61 6e 2c 20 22 22 2c 20 teRaw(chan, "",
26d0: 30 29 20 3e 3d 20 30 29 20 3f 20 31 20 3a 20 2d 0) >= 0) ? 1 : -
26e0: 31 29 3b 0a 09 09 2f 2a 72 65 74 20 3d 20 42 69 1);.../*ret = Bi
26f0: 6f 57 72 69 74 65 28 62 69 6f 2c 20 4e 55 4c 4c oWrite(bio, NULL
2700: 2c 20 30 29 3b 2a 2f 0a 09 09 62 72 65 61 6b 3b , 0);*/...break;
2710: 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f ..case BIO_CTRL_
2720: 44 55 50 3a 0a 09 09 2f 2a 20 6d 61 6e 20 2d 20 DUP:.../* man -
2730: 65 78 74 72 61 20 73 74 75 66 66 20 66 6f 72 20 extra stuff for
2740: 27 64 75 70 65 64 27 20 42 49 4f 2e 20 49 6d 70 'duped' BIO. Imp
2750: 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 64 75 70 5f lements BIO_dup_
2760: 73 74 61 74 65 20 2a 2f 0a 09 09 64 70 72 69 6e state */...dprin
2770: 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c tf("Got BIO_CTRL
2780: 5f 44 55 50 22 29 3b 0a 09 09 72 65 74 20 3d 20 _DUP");...ret =
2790: 31 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 1;...break;..cas
27a0: 65 20 42 49 4f 5f 43 54 52 4c 5f 57 50 45 4e 44 e BIO_CTRL_WPEND
27b0: 49 4e 47 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 ING:.../* opt -
27c0: 52 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 6f 66 Return number of
27d0: 20 62 79 74 65 73 20 69 6e 20 42 49 4f 20 73 74 bytes in BIO st
27e0: 69 6c 6c 20 74 6f 20 62 65 20 77 72 69 74 74 65 ill to be writte
27f0: 6e 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 n. Implements BI
2800: 4f 5f 77 70 65 6e 64 69 6e 67 2e 20 2a 2f 0a 09 O_wpending. */..
2810: 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 49 .dprintf("Got BI
2820: 4f 5f 43 54 52 4c 5f 57 50 45 4e 44 49 4e 47 22 O_CTRL_WPENDING"
2830: 29 3b 0a 09 09 2f 2a 20 52 65 74 75 72 6e 20 74 );.../* Return t
2840: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 70 65 6e he amount of pen
2850: 64 69 6e 67 20 64 61 74 61 20 6f 72 20 30 20 66 ding data or 0 f
2860: 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 09 09 72 65 or error */...re
2870: 74 20 3d 20 28 28 63 68 61 6e 29 20 3f 20 54 63 t = ((chan) ? Tc
2880: 6c 5f 4f 75 74 70 75 74 42 75 66 66 65 72 65 64 l_OutputBuffered
2890: 28 63 68 61 6e 29 20 3a 20 30 29 3b 0a 09 09 62 (chan) : 0);...b
28a0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f 5f reak;..case BIO_
28b0: 43 54 52 4c 5f 53 45 54 5f 43 41 4c 4c 42 41 43 CTRL_SET_CALLBAC
28c0: 4b 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 53 65 K:.../* opt - Se
28d0: 74 73 20 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f ts an informatio
28e0: 6e 61 6c 20 63 61 6c 6c 62 61 63 6b 2e 20 49 6d nal callback. Im
28f0: 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 73 65 74 plements BIO_set
2900: 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 20 2a _info_callback *
2910: 2f 0a 09 09 72 65 74 20 3d 20 30 3b 0a 09 09 62 /...ret = 0;...b
2920: 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f 5f reak;..case BIO_
2930: 43 54 52 4c 5f 47 45 54 5f 43 41 4c 4c 42 41 43 CTRL_GET_CALLBAC
2940: 4b 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 47 65 K:.../* opt - Ge
2950: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 t and return the
2960: 20 69 6e 66 6f 20 63 61 6c 6c 62 61 63 6b 2e 20 info callback.
2970: 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 67 Implements BIO_g
2980: 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b et_info_callback
2990: 20 2a 2f 0a 09 09 72 65 74 20 3d 20 30 3b 0a 09 */...ret = 0;..
29a0: 09 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 42 .break;...case B
29b0: 49 4f 5f 43 5f 46 49 4c 45 5f 53 45 45 4b 3a 0a IO_C_FILE_SEEK:.
29c0: 09 09 2f 2a 20 4e 6f 74 20 75 73 65 64 20 66 6f ../* Not used fo
29d0: 72 20 73 6f 63 6b 65 74 73 2e 20 54 63 6c 5f 53 r sockets. Tcl_S
29e0: 65 65 6b 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f eek only works o
29f0: 6e 20 74 6f 70 20 63 68 61 6e 2e 20 49 6d 70 6c n top chan. Impl
2a00: 65 6d 65 6e 74 73 20 42 49 4f 5f 73 65 65 6b 28 ements BIO_seek(
2a10: 29 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 ) */...dprintf("
2a20: 47 6f 74 20 42 49 4f 5f 43 5f 46 49 4c 45 5f 53 Got BIO_C_FILE_S
2a30: 45 45 4b 22 29 3b 0a 09 09 72 65 74 20 3d 20 30 EEK");...ret = 0
2a40: 3b 20 2f 2a 20 52 65 74 75 72 6e 20 30 20 73 75 ; /* Return 0 su
2a50: 63 63 65 73 73 20 61 6e 64 20 2d 31 20 66 6f 72 ccess and -1 for
2a60: 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 62 72 failure */...br
2a70: 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 eak;..case BIO_C
2a80: 5f 46 49 4c 45 5f 54 45 4c 4c 3a 0a 09 09 2f 2a _FILE_TELL:.../*
2a90: 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 73 6f Not used for so
2aa0: 63 6b 65 74 73 2e 20 54 63 6c 5f 54 65 6c 6c 20 ckets. Tcl_Tell
2ab0: 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 74 6f only works on to
2ac0: 70 20 63 68 61 6e 2e 20 49 6d 70 6c 65 6d 65 6e p chan. Implemen
2ad0: 74 73 20 42 49 4f 5f 74 65 6c 6c 28 29 20 2a 2f ts BIO_tell() */
2ae0: 0a 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 ...dprintf("Got
2af0: 42 49 4f 5f 43 5f 46 49 4c 45 5f 54 45 4c 4c 22 BIO_C_FILE_TELL"
2b00: 29 3b 0a 09 09 72 65 74 20 3d 20 30 3b 20 2f 2a );...ret = 0; /*
2b10: 20 52 65 74 75 72 6e 20 30 20 73 75 63 63 65 73 Return 0 succes
2b20: 73 20 61 6e 64 20 2d 31 20 66 6f 72 20 66 61 69 s and -1 for fai
2b30: 6c 75 72 65 20 2a 2f 0a 09 09 62 72 65 61 6b 3b lure */...break;
2b40: 0a 09 63 61 73 65 20 42 49 4f 5f 43 5f 53 45 54 ..case BIO_C_SET
2b50: 5f 46 44 3a 0a 09 09 2f 2a 20 49 6d 70 6c 65 6d _FD:.../* Implem
2b60: 65 6e 74 73 20 42 49 4f 5f 73 65 74 5f 66 64 20 ents BIO_set_fd
2b70: 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 55 6e */...dprintf("Un
2b80: 73 75 70 70 6f 72 74 65 64 20 63 61 6c 6c 3a 20 supported call:
2b90: 42 49 4f 5f 43 5f 53 45 54 5f 46 44 22 29 3b 0a BIO_C_SET_FD");.
2ba0: 09 09 72 65 74 20 3d 20 2d 31 3b 0a 09 09 62 72 ..ret = -1;...br
2bb0: 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 eak;..case BIO_C
2bc0: 5f 47 45 54 5f 46 44 3a 0a 09 09 2f 2a 20 49 6d _GET_FD:.../* Im
2bd0: 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 67 65 74 plements BIO_get
2be0: 5f 66 64 28 29 20 2a 2f 0a 09 09 64 70 72 69 6e _fd() */...dprin
2bf0: 74 66 28 22 55 6e 73 75 70 70 6f 72 74 65 64 20 tf("Unsupported
2c00: 63 61 6c 6c 3a 20 42 49 4f 5f 43 5f 47 45 54 5f call: BIO_C_GET_
2c10: 46 44 22 29 3b 0a 09 09 72 65 74 20 3d 20 2d 31 FD");...ret = -1
2c20: 3b 0a 09 09 62 72 65 61 6b 3b 0a 0a 23 69 66 20 ;...break;..#if
2c30: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
2c40: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30 30 30 NUMBER >= 0x3000
2c50: 30 30 30 30 4c 20 26 26 20 64 65 66 69 6e 65 64 0000L && defined
2c60: 28 42 49 4f 5f 43 54 52 4c 5f 47 45 54 5f 4b 54 (BIO_CTRL_GET_KT
2c70: 4c 53 5f 53 45 4e 44 29 0a 09 63 61 73 65 20 42 LS_SEND)..case B
2c80: 49 4f 5f 43 54 52 4c 5f 47 45 54 5f 4b 54 4c 53 IO_CTRL_GET_KTLS
2c90: 5f 53 45 4e 44 3a 0a 09 09 2f 2a 20 49 6d 70 6c _SEND:.../* Impl
2ca0: 65 6d 65 6e 74 73 20 42 49 4f 5f 67 65 74 5f 6b ements BIO_get_k
2cb0: 74 6c 73 5f 73 65 6e 64 20 2a 2f 0a 09 09 64 70 tls_send */...dp
2cc0: 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 rintf("Got BIO_C
2cd0: 54 52 4c 5f 47 45 54 5f 4b 54 4c 53 5f 53 45 4e TRL_GET_KTLS_SEN
2ce0: 44 22 29 3b 0a 09 09 2f 2a 20 52 65 74 75 72 6e D");.../* Return
2cf0: 73 20 31 20 69 66 20 74 68 65 20 42 49 4f 20 69 s 1 if the BIO i
2d00: 73 20 75 73 69 6e 67 20 74 68 65 20 4b 65 72 6e s using the Kern
2d10: 65 6c 20 54 4c 53 20 64 61 74 61 2d 70 61 74 68 el TLS data-path
2d20: 20 66 6f 72 20 73 65 6e 64 69 6e 67 2c 20 30 20 for sending, 0
2d30: 69 66 20 6e 6f 74 20 2a 2f 0a 09 09 72 65 74 20 if not */...ret
2d40: 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a 23 65 = 0;...break;.#e
2d50: 6e 64 69 66 0a 23 69 66 20 4f 50 45 4e 53 53 4c ndif.#if OPENSSL
2d60: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
2d70: 3e 3d 20 30 78 33 30 30 30 30 30 30 30 4c 20 26 >= 0x30000000L &
2d80: 26 20 64 65 66 69 6e 65 64 28 42 49 4f 5f 43 54 & defined(BIO_CT
2d90: 52 4c 5f 47 45 54 5f 4b 54 4c 53 5f 52 45 43 56 RL_GET_KTLS_RECV
2da0: 29 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c )..case BIO_CTRL
2db0: 5f 47 45 54 5f 4b 54 4c 53 5f 52 45 43 56 3a 0a _GET_KTLS_RECV:.
2dc0: 09 09 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 73 20 ../* Implements
2dd0: 42 49 4f 5f 67 65 74 5f 6b 74 6c 73 5f 72 65 63 BIO_get_ktls_rec
2de0: 76 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 v */...dprintf("
2df0: 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 47 45 54 Got BIO_CTRL_GET
2e00: 5f 4b 54 4c 53 5f 52 45 43 56 22 29 3b 0a 09 09 _KTLS_RECV");...
2e10: 2f 2a 20 52 65 74 75 72 6e 73 20 31 20 69 66 20 /* Returns 1 if
2e20: 74 68 65 20 42 49 4f 20 69 73 20 75 73 69 6e 67 the BIO is using
2e30: 20 74 68 65 20 4b 65 72 6e 65 6c 20 54 4c 53 20 the Kernel TLS
2e40: 64 61 74 61 2d 70 61 74 68 20 66 6f 72 20 72 65 data-path for re
2e50: 63 65 69 76 69 6e 67 2c 20 30 20 69 66 20 6e 6f ceiving, 0 if no
2e60: 74 20 2a 2f 0a 09 09 72 65 74 20 3d 20 30 3b 0a t */...ret = 0;.
2e70: 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
2e80: 09 64 65 66 61 75 6c 74 3a 0a 09 09 64 70 72 69 .default:...dpri
2e90: 6e 74 66 28 22 47 6f 74 20 75 6e 6b 6e 6f 77 6e ntf("Got unknown
2ea0: 20 63 6f 6e 74 72 6f 6c 20 63 6f 6d 6d 61 6e 64 control command
2eb0: 20 28 25 69 29 22 2c 20 63 6d 64 29 3b 0a 09 09 (%i)", cmd);...
2ec0: 72 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b ret = 0;...break
2ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 70 72 69 ;. }. dpri
2ee0: 6e 74 66 28 22 42 69 6f 43 74 72 6c 20 72 65 74 ntf("BioCtrl ret
2ef0: 75 72 6e 20 76 61 6c 75 65 20 25 6c 69 22 2c 20 urn value %li",
2f00: 72 65 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ret);. return
2f10: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 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 0a 20 2a 0a 20 -----------. *.
2f70: 2a 20 42 69 6f 4e 65 77 20 2d 2d 0a 20 2a 0a 20 * BioNew --. *.
2f80: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
2f90: 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 is used to creat
2fa0: 65 20 61 20 6e 65 77 20 69 6e 73 74 61 6e 63 65 e a new instance
2fb0: 20 6f 66 20 74 68 65 20 42 49 4f 2e 20 54 68 69 of the BIO. Thi
2fc0: 73 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 20 77 69 s. *.function wi
2fd0: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 ll be called in
2fe0: 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 response to the
2ff0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c application call
3000: 69 6e 67 20 74 68 65 0a 20 2a 09 42 49 4f 5f 6e ing the. *.BIO_n
3010: 65 77 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 ew() function..
3020: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
3030: 09 52 65 74 75 72 6e 73 20 62 6f 6f 6c 65 61 6e .Returns boolean
3040: 20 73 75 63 63 65 73 73 20 72 65 73 75 6c 74 20 success result
3050: 28 31 3d 73 75 63 63 65 73 73 2c 20 30 3d 66 61 (1=success, 0=fa
3060: 69 6c 75 72 65 29 0a 20 2a 0a 20 2a 20 53 69 64 ilure). *. * Sid
3070: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 6e e effects:. *.In
3080: 69 74 69 61 6c 69 7a 65 73 20 42 49 4f 20 73 74 itializes BIO st
3090: 72 75 63 74 75 72 65 2e 0a 20 2a 0a 20 2a 2d 2d ructure.. *. *--
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 0a 20 2a 2f 0a -----------. */.
30f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 42 69 6f 4e .static int BioN
3100: 65 77 28 42 49 4f 20 2a 62 69 6f 29 20 7b 0a 20 ew(BIO *bio) {.
3110: 20 20 20 64 70 72 69 6e 74 66 28 22 42 69 6f 4e dprintf("BioN
3120: 65 77 28 25 70 29 20 63 61 6c 6c 65 64 22 2c 20 ew(%p) called",
3130: 62 69 6f 29 3b 0a 0a 20 20 20 20 69 66 20 28 62 bio);.. if (b
3140: 69 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 io == NULL) {..r
3150: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a eturn 0;. }..
3160: 20 20 20 20 42 49 4f 5f 73 65 74 5f 64 61 74 61 BIO_set_data
3170: 28 62 69 6f 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 (bio, NULL);.
3180: 20 42 49 4f 5f 73 65 74 5f 69 6e 69 74 28 62 69 BIO_set_init(bi
3190: 6f 2c 20 30 29 3b 0a 20 20 20 20 42 49 4f 5f 63 o, 0);. BIO_c
31a0: 6c 65 61 72 5f 66 6c 61 67 73 28 62 69 6f 2c 20 lear_flags(bio,
31b0: 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 -1);. return
31c0: 31 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 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 0a 20 2a 0a 20 2a 20 42 --------. *. * B
3220: 69 6f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 ioFree --. *. *.
3230: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
3240: 20 75 73 65 64 20 74 6f 20 64 65 73 74 72 6f 79 used to destroy
3250: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 an instance of
3260: 61 20 42 49 4f 2e 20 54 68 69 73 20 66 75 6e 63 a BIO. This func
3270: 74 69 6f 6e 0a 20 2a 09 77 69 6c 6c 20 62 65 20 tion. *.will be
3280: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e called in respon
3290: 73 65 20 74 6f 20 74 68 65 20 61 70 70 6c 69 63 se to the applic
32a0: 61 74 69 6f 6e 20 63 61 6c 6c 69 6e 67 20 74 68 ation calling th
32b0: 65 20 42 49 4f 5f 66 72 65 65 28 29 0a 20 2a 09 e BIO_free(). *.
32c0: 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 function.. *. *
32d0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
32e0: 72 6e 73 20 62 6f 6f 6c 65 61 6e 20 73 75 63 63 rns boolean succ
32f0: 65 73 73 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a ess result. *. *
3300: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
3310: 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 42 49 *.Initializes BI
3320: 4f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 2a 0a O structure.. *.
3330: 20 2a 2d 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 0a ---------------.
3380: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 */..static int
3390: 42 69 6f 46 72 65 65 28 42 49 4f 20 2a 62 69 6f BioFree(BIO *bio
33a0: 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ) {. dprintf(
33b0: 22 42 69 6f 46 72 65 65 28 25 70 29 20 63 61 6c "BioFree(%p) cal
33c0: 6c 65 64 22 2c 20 62 69 6f 29 3b 0a 0a 20 20 20 led", bio);..
33d0: 20 69 66 20 28 62 69 6f 20 3d 3d 20 4e 55 4c 4c if (bio == NULL
33e0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 ) {..return 0;.
33f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 }.. /* Cle
3400: 61 72 20 66 6c 61 67 73 20 69 66 20 73 65 74 20 ar flags if set
3410: 74 6f 20 42 49 4f 5f 43 4c 4f 53 45 20 28 63 6c to BIO_CLOSE (cl
3420: 6f 73 65 20 49 2f 4f 20 73 74 72 65 61 6d 20 77 ose I/O stream w
3430: 68 65 6e 20 74 68 65 20 42 49 4f 20 69 73 20 66 hen the BIO is f
3440: 72 65 65 64 29 20 2a 2f 0a 20 20 20 20 69 66 20 reed) */. if
3450: 28 42 49 4f 5f 67 65 74 5f 73 68 75 74 64 6f 77 (BIO_get_shutdow
3460: 6e 28 62 69 6f 29 29 20 7b 0a 09 42 49 4f 5f 73 n(bio)) {..BIO_s
3470: 65 74 5f 64 61 74 61 28 62 69 6f 2c 20 4e 55 4c et_data(bio, NUL
3480: 4c 29 3b 0a 09 42 49 4f 5f 73 65 74 5f 69 6e 69 L);..BIO_set_ini
3490: 74 28 62 69 6f 2c 20 30 29 3b 0a 09 42 49 4f 5f t(bio, 0);..BIO_
34a0: 63 6c 65 61 72 5f 66 6c 61 67 73 28 62 69 6f 2c clear_flags(bio,
34b0: 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 -1);. }.
34c0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a return 1;.}../*.
34d0: 20 2a 2d 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 0a ---------------.
3520: 20 2a 0a 20 2a 20 42 49 4f 5f 6e 65 77 5f 74 63 *. * BIO_new_tc
3530: 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 l --. *. *.This
3540: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 function is used
3550: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 to initialize t
3560: 68 65 20 42 49 4f 20 6d 65 74 68 6f 64 20 68 61 he BIO method ha
3570: 6e 64 6c 65 72 73 2e 0a 20 2a 0a 20 2a 20 52 65 ndlers.. *. * Re
3580: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e sults:. *.Return
3590: 73 20 70 6f 69 6e 74 65 72 20 74 6f 20 42 49 4f s pointer to BIO
35a0: 20 6f 72 20 4e 55 4c 4c 20 66 6f 72 20 66 61 69 or NULL for fai
35b0: 6c 75 72 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 lure. *. * Side
35c0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 6e 69 74 effects:. *.Init
35d0: 69 61 6c 69 7a 65 73 20 42 49 4f 20 4d 65 74 68 ializes BIO Meth
35e0: 6f 64 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ods.. *. *------
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 0a 20 2a 2f 0a 0a 42 49 4f -------. */..BIO
3640: 20 2a 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 53 74 *BIO_new_tcl(St
3650: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 ate *statePtr, i
3660: 6e 74 20 66 6c 61 67 73 29 20 7b 0a 20 20 20 20 nt flags) {.
3670: 42 49 4f 20 2a 62 69 6f 3b 0a 23 69 66 64 65 66 BIO *bio;.#ifdef
3680: 20 54 43 4c 54 4c 53 5f 53 53 4c 5f 55 53 45 5f TCLTLS_SSL_USE_
3690: 46 41 53 54 50 41 54 48 0a 20 20 20 20 54 63 6c FASTPATH. Tcl
36a0: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 43 _Channel parentC
36b0: 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 63 6f 6e 73 hannel;. cons
36c0: 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 t Tcl_ChannelTyp
36d0: 65 20 2a 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c e *parentChannel
36e0: 54 79 70 65 3b 0a 0a 20 20 20 20 69 6e 74 20 70 Type;.. int p
36f0: 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 49 6e arentChannelFdIn
3700: 2c 20 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 , parentChannelF
3710: 64 4f 75 74 2c 20 70 61 72 65 6e 74 43 68 61 6e dOut, parentChan
3720: 6e 65 6c 46 64 3b 0a 20 20 20 20 69 6e 74 20 76 nelFd;. int v
3730: 61 6c 69 64 50 61 72 65 6e 74 43 68 61 6e 6e 65 alidParentChanne
3740: 6c 46 64 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 lFd;.#endif..
3750: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 6e 65 dprintf("BIO_ne
3760: 77 5f 74 63 6c 28 29 20 63 61 6c 6c 65 64 22 29 w_tcl() called")
3770: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 ;.. /* Create
3780: 20 63 75 73 74 6f 6d 20 42 49 4f 20 6d 65 74 68 custom BIO meth
3790: 6f 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 42 69 od */. if (Bi
37a0: 6f 4d 65 74 68 6f 64 73 20 3d 3d 20 4e 55 4c 4c oMethods == NULL
37b0: 29 20 7b 0a 09 2f 2a 20 42 49 4f 5f 54 59 50 45 ) {../* BIO_TYPE
37c0: 5f 42 49 4f 20 3d 20 28 31 39 7c 42 49 4f 5f 54 _BIO = (19|BIO_T
37d0: 59 50 45 5f 53 4f 55 52 43 45 5f 53 49 4e 4b 29 YPE_SOURCE_SINK)
37e0: 20 2d 2d 20 68 61 6c 66 20 61 20 42 49 4f 20 70 -- half a BIO p
37f0: 61 69 72 20 2a 2f 0a 09 2f 2a 20 42 49 4f 5f 54 air */../* BIO_T
3800: 59 50 45 5f 43 4f 4e 4e 45 43 54 20 3d 20 28 31 YPE_CONNECT = (1
3810: 32 7c 42 49 4f 5f 54 59 50 45 5f 53 4f 55 52 43 2|BIO_TYPE_SOURC
3820: 45 5f 53 49 4e 4b 7c 42 49 4f 5f 54 59 50 45 5f E_SINK|BIO_TYPE_
3830: 44 45 53 43 52 49 50 54 4f 52 29 20 2a 2f 0a 09 DESCRIPTOR) */..
3840: 2f 2a 20 42 49 4f 5f 54 59 50 45 5f 41 43 43 45 /* BIO_TYPE_ACCE
3850: 50 54 20 20 3d 20 28 31 33 7c 42 49 4f 5f 54 59 PT = (13|BIO_TY
3860: 50 45 5f 53 4f 55 52 43 45 5f 53 49 4e 4b 7c 42 PE_SOURCE_SINK|B
3870: 49 4f 5f 54 59 50 45 5f 44 45 53 43 52 49 50 54 IO_TYPE_DESCRIPT
3880: 4f 52 29 20 2a 2f 0a 09 42 69 6f 4d 65 74 68 6f OR) */..BioMetho
3890: 64 73 20 3d 20 42 49 4f 5f 6d 65 74 68 5f 6e 65 ds = BIO_meth_ne
38a0: 77 28 42 49 4f 5f 54 59 50 45 5f 42 49 4f 2c 20 w(BIO_TYPE_BIO,
38b0: 22 74 63 6c 22 29 3b 0a 09 69 66 20 28 42 69 6f "tcl");..if (Bio
38c0: 4d 65 74 68 6f 64 73 20 3d 3d 20 4e 55 4c 4c 29 Methods == NULL)
38d0: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
38e0: 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 "Memory allocati
38f0: 6f 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 20 20 on error");...
3900: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 return NULL;..
3910: 7d 0a 09 2f 2a 20 4e 6f 74 20 75 73 65 64 20 42 }../* Not used B
3920: 49 4f 5f 6d 65 74 68 5f 73 65 74 5f 77 72 69 74 IO_meth_set_writ
3930: 65 5f 65 78 20 2a 2f 0a 09 42 49 4f 5f 6d 65 74 e_ex */..BIO_met
3940: 68 5f 73 65 74 5f 77 72 69 74 65 28 42 69 6f 4d h_set_write(BioM
3950: 65 74 68 6f 64 73 2c 20 42 69 6f 57 72 69 74 65 ethods, BioWrite
3960: 29 3b 0a 09 2f 2a 20 4e 6f 74 20 75 73 65 64 20 );../* Not used
3970: 42 49 4f 5f 6d 65 74 68 5f 73 65 74 5f 72 65 61 BIO_meth_set_rea
3980: 64 5f 65 78 20 2a 2f 0a 09 42 49 4f 5f 6d 65 74 d_ex */..BIO_met
3990: 68 5f 73 65 74 5f 72 65 61 64 28 42 69 6f 4d 65 h_set_read(BioMe
39a0: 74 68 6f 64 73 2c 20 42 69 6f 52 65 61 64 29 3b thods, BioRead);
39b0: 0a 09 42 49 4f 5f 6d 65 74 68 5f 73 65 74 5f 70 ..BIO_meth_set_p
39c0: 75 74 73 28 42 69 6f 4d 65 74 68 6f 64 73 2c 20 uts(BioMethods,
39d0: 42 69 6f 50 75 74 73 29 3b 0a 09 42 49 4f 5f 6d BioPuts);..BIO_m
39e0: 65 74 68 5f 73 65 74 5f 63 74 72 6c 28 42 69 6f eth_set_ctrl(Bio
39f0: 4d 65 74 68 6f 64 73 2c 20 42 69 6f 43 74 72 6c Methods, BioCtrl
3a00: 29 3b 0a 09 42 49 4f 5f 6d 65 74 68 5f 73 65 74 );..BIO_meth_set
3a10: 5f 63 72 65 61 74 65 28 42 69 6f 4d 65 74 68 6f _create(BioMetho
3a20: 64 73 2c 20 42 69 6f 4e 65 77 29 3b 0a 09 42 49 ds, BioNew);..BI
3a30: 4f 5f 6d 65 74 68 5f 73 65 74 5f 64 65 73 74 72 O_meth_set_destr
3a40: 6f 79 28 42 69 6f 4d 65 74 68 6f 64 73 2c 20 42 oy(BioMethods, B
3a50: 69 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 0a ioFree);. }..
3a60: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
3a70: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 64 70 72 == NULL) {..dpr
3a80: 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 73 intf("Asked to s
3a90: 65 74 75 70 20 61 20 4e 55 4c 4c 20 73 74 61 74 etup a NULL stat
3aa0: 65 2c 20 6a 75 73 74 20 63 72 65 61 74 69 6e 67 e, just creating
3ab0: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 63 6f 6e the initial con
3ac0: 66 69 67 75 72 61 74 69 6f 6e 22 29 3b 0a 0a 09 figuration");...
3ad0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
3ae0: 20 7d 0a 0a 23 69 66 64 65 66 20 54 43 4c 54 4c }..#ifdef TCLTL
3af0: 53 5f 53 53 4c 5f 55 53 45 5f 46 41 53 54 50 41 S_SSL_USE_FASTPA
3b00: 54 48 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a TH. /*. *
3b10: 20 49 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 If the channel
3b20: 63 61 6e 20 62 65 20 6d 61 70 70 65 64 20 62 61 can be mapped ba
3b30: 63 6b 20 74 6f 20 61 20 66 69 6c 65 20 64 65 73 ck to a file des
3b40: 63 72 69 70 74 6f 72 2c 20 6a 75 73 74 20 75 73 criptor, just us
3b50: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 e the file descr
3b60: 69 70 74 6f 72 0a 20 20 20 20 20 2a 20 77 69 74 iptor. * wit
3b70: 68 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 h the SSL librar
3b80: 79 20 73 69 6e 63 65 20 69 74 20 77 69 6c 6c 20 y since it will
3b90: 6c 69 6b 65 6c 79 20 62 65 20 6f 70 74 69 6d 69 likely be optimi
3ba0: 7a 65 64 20 66 6f 72 20 74 68 69 73 2e 0a 20 20 zed for this..
3bb0: 20 20 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 */. parent
3bc0: 43 68 61 6e 6e 65 6c 20 3d 20 54 6c 73 5f 47 65 Channel = Tls_Ge
3bd0: 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 tParent(statePtr
3be0: 2c 20 30 29 3b 0a 20 20 20 20 70 61 72 65 6e 74 , 0);. parent
3bf0: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 54 63 ChannelType = Tc
3c00: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
3c10: 28 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 29 3b (parentChannel);
3c20: 0a 0a 20 20 20 20 76 61 6c 69 64 50 61 72 65 6e .. validParen
3c30: 74 43 68 61 6e 6e 65 6c 46 64 20 3d 20 30 3b 0a tChannelFd = 0;.
3c40: 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 70 if (strcmp(p
3c50: 61 72 65 6e 74 43 68 61 6e 6e 65 6c 54 79 70 65 arentChannelType
3c60: 2d 3e 74 79 70 65 4e 61 6d 65 2c 20 22 74 63 70 ->typeName, "tcp
3c70: 22 29 20 3d 3d 20 30 29 20 7b 0a 09 76 6f 69 64 ") == 0) {..void
3c80: 20 2a 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 *parentChannelF
3c90: 64 49 6e 5f 70 2c 20 2a 70 61 72 65 6e 74 43 68 dIn_p, *parentCh
3ca0: 61 6e 6e 65 6c 46 64 4f 75 74 5f 70 3b 0a 09 69 annelFdOut_p;..i
3cb0: 6e 74 20 74 63 6c 47 65 74 43 68 61 6e 6e 65 6c nt tclGetChannel
3cc0: 48 61 6e 64 6c 65 52 65 74 3b 0a 0a 09 74 63 6c HandleRet;...tcl
3cd0: 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 GetChannelHandle
3ce0: 52 65 74 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 Ret = Tcl_GetCha
3cf0: 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 61 72 65 6e nnelHandle(paren
3d00: 74 43 68 61 6e 6e 65 6c 2c 20 54 43 4c 5f 52 45 tChannel, TCL_RE
3d10: 41 44 41 42 4c 45 2c 20 28 43 6c 69 65 6e 74 44 ADABLE, (ClientD
3d20: 61 74 61 29 20 26 70 61 72 65 6e 74 43 68 61 6e ata) &parentChan
3d30: 6e 65 6c 46 64 49 6e 5f 70 29 3b 0a 09 69 66 20 nelFdIn_p);..if
3d40: 28 74 63 6c 47 65 74 43 68 61 6e 6e 65 6c 48 61 (tclGetChannelHa
3d50: 6e 64 6c 65 52 65 74 20 3d 3d 20 54 43 4c 5f 4f ndleRet == TCL_O
3d60: 4b 29 20 7b 0a 09 20 20 20 20 74 63 6c 47 65 74 K) {.. tclGet
3d70: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 52 65 74 ChannelHandleRet
3d80: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
3d90: 6c 48 61 6e 64 6c 65 28 70 61 72 65 6e 74 43 68 lHandle(parentCh
3da0: 61 6e 6e 65 6c 2c 20 54 43 4c 5f 57 52 49 54 41 annel, TCL_WRITA
3db0: 42 4c 45 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 BLE, (ClientData
3dc0: 29 20 26 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c ) &parentChannel
3dd0: 46 64 4f 75 74 5f 70 29 3b 0a 09 20 20 20 20 69 FdOut_p);.. i
3de0: 66 20 28 74 63 6c 47 65 74 43 68 61 6e 6e 65 6c f (tclGetChannel
3df0: 48 61 6e 64 6c 65 52 65 74 20 3d 3d 20 54 43 4c HandleRet == TCL
3e00: 5f 4f 4b 29 20 7b 0a 09 09 70 61 72 65 6e 74 43 _OK) {...parentC
3e10: 68 61 6e 6e 65 6c 46 64 49 6e 20 3d 20 50 54 52 hannelFdIn = PTR
3e20: 32 49 4e 54 28 70 61 72 65 6e 74 43 68 61 6e 6e 2INT(parentChann
3e30: 65 6c 46 64 49 6e 5f 70 29 3b 0a 09 09 70 61 72 elFdIn_p);...par
3e40: 65 6e 74 43 68 61 6e 6e 65 6c 46 64 4f 75 74 20 entChannelFdOut
3e50: 3d 20 50 54 52 32 49 4e 54 28 70 61 72 65 6e 74 = PTR2INT(parent
3e60: 43 68 61 6e 6e 65 6c 46 64 4f 75 74 5f 70 29 3b ChannelFdOut_p);
3e70: 0a 09 09 69 66 20 28 70 61 72 65 6e 74 43 68 61 ...if (parentCha
3e80: 6e 6e 65 6c 46 64 49 6e 20 3d 3d 20 70 61 72 65 nnelFdIn == pare
3e90: 6e 74 43 68 61 6e 6e 65 6c 46 64 4f 75 74 29 20 ntChannelFdOut)
3ea0: 7b 0a 09 09 20 20 20 20 70 61 72 65 6e 74 43 68 {... parentCh
3eb0: 61 6e 6e 65 6c 46 64 20 3d 20 70 61 72 65 6e 74 annelFd = parent
3ec0: 43 68 61 6e 6e 65 6c 46 64 49 6e 3b 0a 09 09 20 ChannelFdIn;...
3ed0: 20 20 20 76 61 6c 69 64 50 61 72 65 6e 74 43 68 validParentCh
3ee0: 61 6e 6e 65 6c 46 64 20 3d 20 31 3b 0a 09 09 7d annelFd = 1;...}
3ef0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d .. }..}. }
3f00: 0a 0a 20 20 20 20 69 66 20 28 76 61 6c 69 64 50 .. if (validP
3f10: 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 29 20 arentChannelFd)
3f20: 7b 0a 09 64 70 72 69 6e 74 66 28 22 57 65 20 66 {..dprintf("We f
3f30: 6f 75 6e 64 20 61 20 73 68 6f 72 74 63 75 74 2c ound a shortcut,
3f40: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 20 69 73 this channel is
3f50: 20 62 61 63 6b 65 64 20 62 79 20 61 20 73 6f 63 backed by a soc
3f60: 6b 65 74 3a 20 25 69 22 2c 20 70 61 72 65 6e 74 ket: %i", parent
3f70: 43 68 61 6e 6e 65 6c 46 64 49 6e 29 3b 0a 09 62 ChannelFdIn);..b
3f80: 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 73 6f 63 io = BIO_new_soc
3f90: 6b 65 74 28 70 61 72 65 6e 74 43 68 61 6e 6e 65 ket(parentChanne
3fa0: 6c 46 64 2c 20 66 6c 61 67 73 29 3b 0a 09 73 74 lFd, flags);..st
3fb0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
3fc0: 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 TLS_TCL_FASTPAT
3fd0: 48 3b 0a 09 42 49 4f 5f 73 65 74 5f 64 61 74 61 H;..BIO_set_data
3fe0: 28 62 69 6f 2c 20 73 74 61 74 65 50 74 72 29 3b (bio, statePtr);
3ff0: 0a 09 42 49 4f 5f 73 65 74 5f 73 68 75 74 64 6f ..BIO_set_shutdo
4000: 77 6e 28 62 69 6f 2c 20 66 6c 61 67 73 29 3b 0a wn(bio, flags);.
4010: 09 42 49 4f 5f 73 65 74 5f 69 6e 69 74 28 62 69 .BIO_set_init(bi
4020: 6f 2c 20 31 29 3b 0a 09 72 65 74 75 72 6e 20 62 o, 1);..return b
4030: 69 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 io;. }.#endif
4040: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 46 .. dprintf("F
4050: 61 6c 6c 69 6e 67 20 62 61 63 6b 20 74 6f 20 54 alling back to T
4060: 63 6c 20 49 2f 4f 20 66 6f 72 20 74 68 69 73 20 cl I/O for this
4070: 63 68 61 6e 6e 65 6c 22 29 3b 0a 0a 20 20 20 20 channel");..
4080: 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 69 bio = BIO_new(Bi
4090: 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 42 oMethods);. B
40a0: 49 4f 5f 73 65 74 5f 64 61 74 61 28 62 69 6f 2c IO_set_data(bio,
40b0: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
40c0: 42 49 4f 5f 73 65 74 5f 73 68 75 74 64 6f 77 6e BIO_set_shutdown
40d0: 28 62 69 6f 2c 20 66 6c 61 67 73 29 3b 0a 20 20 (bio, flags);.
40e0: 20 20 42 49 4f 5f 73 65 74 5f 69 6e 69 74 28 62 BIO_set_init(b
40f0: 69 6f 2c 20 31 29 3b 20 2f 2a 20 45 6e 61 62 6c io, 1); /* Enabl
4100: 65 20 72 65 61 64 20 26 20 77 72 69 74 65 20 2a e read & write *
4110: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62 69 6f /. return bio
4120: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
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 0a 20 2a 0a 20 2a 20 42 49 -------. *. * BI
4180: 4f 5f 63 6c 65 61 6e 75 70 20 2d 2d 0a 20 2a 0a O_cleanup --. *.
4190: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e *.This function
41a0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 73 74 is used to dest
41b0: 72 6f 79 20 61 20 42 49 4f 5f 4d 45 54 48 4f 44 roy a BIO_METHOD
41c0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 structure and f
41d0: 72 65 65 20 75 70 20 61 6e 79 0a 20 2a 09 6d 65 ree up any. *.me
41e0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 mory associated
41f0: 77 69 74 68 20 69 74 2e 0a 20 2a 0a 20 2a 20 52 with it.. *. * R
4200: 65 73 75 6c 74 73 3a 0a 20 2a 09 53 74 61 6e 64 esults:. *.Stand
4210: 61 72 64 20 54 43 4c 20 72 65 73 75 6c 74 0a 20 ard TCL result.
4220: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
4230: 73 3a 0a 20 2a 09 44 65 73 74 72 6f 79 73 20 42 s:. *.Destroys B
4240: 49 4f 20 4d 65 74 68 6f 64 73 2e 0a 20 2a 0a 20 IO Methods.. *.
4250: 2a 2d 2d 2d 2d 2d 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 0a 20 --------------.
42a0: 2a 2f 0a 0a 69 6e 74 20 42 49 4f 5f 63 6c 65 61 */..int BIO_clea
42b0: 6e 75 70 20 28 29 20 7b 0a 20 20 20 20 64 70 72 nup () {. dpr
42c0: 69 6e 74 66 28 22 42 49 4f 5f 63 6c 65 61 6e 75 intf("BIO_cleanu
42d0: 70 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 0a 20 p() called");..
42e0: 20 20 20 69 66 20 28 42 69 6f 4d 65 74 68 6f 64 if (BioMethod
42f0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 42 49 s != NULL) {..BI
4300: 4f 5f 6d 65 74 68 5f 66 72 65 65 28 42 69 6f 4d O_meth_free(BioM
4310: 65 74 68 6f 64 73 29 3b 0a 09 42 69 6f 4d 65 74 ethods);..BioMet
4320: 68 6f 64 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 hods = NULL;.
4330: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
4340: 4c 5f 4f 4b 3b 0a 7d 0a L_OK;.}.