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 20 66 75 6e 63 74 69 6f 6e 73 0a 20 hese functions.
0050: 2a 20 64 69 72 65 63 74 6c 79 20 69 6e 74 65 72 * directly inter
0060: 66 61 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 face between the
0070: 20 54 43 4c 20 49 4f 20 63 68 61 6e 6e 65 6c 20 TCL IO channel
0080: 61 6e 64 20 42 49 4f 20 62 75 66 66 65 72 73 2e and BIO buffers.
0090: 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 . *. * Copyright
00a0: 20 28 43 29 20 31 39 39 37 2d 32 30 30 30 20 4d (C) 1997-2000 M
00b0: 61 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 att Newman <matt
00c0: 40 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 @novadigm.com>.
00d0: 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 * Copyright (C)
00e0: 32 30 32 34 20 42 72 69 61 6e 20 4f 27 48 61 67 2024 Brian O'Hag
00f0: 61 6e 0a 20 2a 0a 20 2a 2f 0a 0a 2f 2a 0a 09 09 an. *. */../*...
0100: 09 09 4e 6f 72 6d 61 6c 0a 09 09 74 6c 73 42 49 ..Normal...tlsBI
0110: 4f 2e 63 09 09 09 09 74 6c 73 49 4f 2e 63 0a 20 O.c....tlsIO.c.
0120: 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 20 +------+
0130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0140: 2b 2d 2d 2d 2b 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 20
0160: 20 20 20 20 20 20 2b 2d 2d 2d 2b 0a 20 7c 20 20 +---+. |
0170: 20 20 20 20 7c 54 63 6c 5f 57 72 69 74 65 52 61 |Tcl_WriteRa
0180: 77 3c 2d 2d 42 69 6f 4f 75 74 70 75 74 7c 53 53 w<--BioOutput|SS
0190: 4c 7c 42 49 4f 5f 77 72 69 74 65 3c 2d 2d 54 6c L|BIO_write<--Tl
01a0: 73 4f 75 74 70 75 74 50 72 6f 63 3c 2d 2d 57 72 sOutputProc<--Wr
01b0: 69 74 65 7c 20 20 20 7c 0a 20 7c 73 6f 63 6b 65 ite| |. |socke
01c0: 74 7c 20 20 20 20 20 20 3c 65 6e 63 72 79 70 74 t| <encrypt
01d0: 65 64 3e 20 20 20 20 20 20 20 7c 42 49 4f 7c 20 ed> |BIO|
01e0: 20 20 20 20 20 20 20 20 20 20 20 3c 75 6e 65 6e <unen
01f0: 63 72 79 70 74 65 64 3e 20 20 20 20 20 20 20 20 crypted>
0200: 7c 41 70 70 7c 0a 20 7c 20 20 20 20 20 20 7c 54 |App|. | |T
0210: 63 6c 5f 52 65 61 64 52 61 77 20 2d 2d 3e 20 42 cl_ReadRaw --> B
0220: 69 6f 49 6e 70 75 74 7c 20 20 20 7c 42 49 4f 5f ioInput| |BIO_
0230: 52 65 61 64 20 2d 2d 3e 54 6c 73 49 6e 70 75 74 Read -->TlsInput
0240: 50 72 6f 63 20 2d 2d 3e 20 52 65 61 64 7c 20 20 Proc --> Read|
0250: 20 7c 0a 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 |. +------+
0260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0270: 20 20 20 20 2b 2d 2d 2d 2b 20 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 20 20 20 20 20 20 20 2b 2d 2d 2d 2b 0a +---+.
02a0: 0a 0a 09 09 09 09 46 61 73 74 20 50 61 74 68 0a ......Fast Path.
02b0: 09 09 09 09 09 74 6c 73 49 4f 2e 63 0a 20 20 2b .....tlsIO.c. +
02c0: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 ------+
02d0: 20 20 20 20 2b 2d 2d 2d 2d 2d 2b 20 20 20 20 20 +-----+
02e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0300: 2b 2d 2d 2d 2d 2d 2b 0a 20 20 7c 20 20 20 20 20 +-----+. |
0310: 20 7c 3c 2d 2d 20 77 72 69 74 65 20 3c 2d 2d 7c |<-- write <--|
0320: 20 53 53 4c 20 7c 42 49 4f 5f 77 72 69 74 65 20 SSL |BIO_write
0330: 3c 2d 2d 20 54 6c 73 4f 75 74 70 75 74 50 72 6f <-- TlsOutputPro
0340: 63 20 3c 2d 2d 20 57 72 69 74 65 7c 20 20 20 20 c <-- Write|
0350: 20 7c 0a 20 20 7c 73 6f 63 6b 65 74 7c 20 3c 65 |. |socket| <e
0360: 6e 63 72 79 70 74 65 64 3e 20 7c 20 42 49 4f 20 ncrypted> | BIO
0370: 7c 20 20 20 20 20 20 20 20 20 20 20 20 3c 75 6e | <un
0380: 65 6e 63 72 79 70 74 65 64 3e 20 20 20 20 20 20 encrypted>
0390: 20 20 20 20 20 20 7c 20 41 70 70 20 7c 0a 20 20 | App |.
03a0: 7c 20 20 20 20 20 20 7c 3c 2d 2d 20 20 72 65 61 | |<-- rea
03b0: 64 20 3c 2d 2d 7c 20 20 20 20 20 7c 42 49 4f 5f d <--| |BIO_
03c0: 52 65 61 64 20 20 2d 2d 3e 20 54 6c 73 49 6e 70 Read --> TlsInp
03d0: 75 74 50 72 6f 63 20 20 2d 2d 3e 20 20 52 65 61 utProc --> Rea
03e0: 64 7c 20 20 20 20 20 7c 0a 20 20 2b 2d 2d 2d 2d d| |. +----
03f0: 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 --+
0400: 2b 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 +-----+
0410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0420: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d +---
0430: 2d 2d 2b 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 --+.*/..#include
0440: 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 "tlsInt.h".#inc
0450: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 62 69 lude <openssl/bi
0460: 6f 2e 68 3e 0a 0a 2f 2a 20 44 65 66 69 6e 65 20 o.h>../* Define
0470: 42 49 4f 20 6d 65 74 68 6f 64 73 20 73 74 72 75 BIO methods stru
0480: 63 74 75 72 65 20 2a 2f 0a 73 74 61 74 69 63 20 cture */.static
0490: 42 49 4f 5f 4d 45 54 48 4f 44 20 2a 42 69 6f 4d BIO_METHOD *BioM
04a0: 65 74 68 6f 64 73 20 3d 20 4e 55 4c 4c 3b 0a 0a ethods = NULL;..
04b0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0500: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 49 4f 53 68 ----. *. * BIOSh
0510: 6f 75 6c 64 52 65 74 72 79 20 2d 2d 0a 20 2a 0a ouldRetry --. *.
0520: 20 2a 09 44 65 74 65 72 6d 69 6e 65 20 69 66 20 *.Determine if
0530: 73 68 6f 75 6c 64 20 72 65 74 72 79 20 6f 70 65 should retry ope
0540: 72 61 74 69 6f 6e 20 62 61 73 65 64 20 6f 6e 20 ration based on
0550: 65 72 72 6f 72 20 63 6f 64 65 2e 20 53 61 6d 65 error code. Same
0560: 0a 20 2a 09 63 6f 6e 64 69 74 69 6f 6e 73 20 61 . *.conditions a
0570: 73 20 42 49 4f 5f 73 6f 63 6b 5f 73 68 6f 75 6c s BIO_sock_shoul
0580: 64 5f 72 65 74 72 79 20 66 75 6e 63 74 69 6f 6e d_retry function
0590: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
05a0: 0a 20 2a 09 31 20 3d 20 72 65 74 72 79 2c 20 30 . *.1 = retry, 0
05b0: 20 3d 20 6e 6f 20 72 65 74 72 79 0a 20 2a 0a 20 = no retry. *.
05c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
05d0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.None. *. *---
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
0630: 73 74 61 74 69 63 20 69 6e 74 20 42 49 4f 53 68 static int BIOSh
0640: 6f 75 6c 64 52 65 74 72 79 28 69 6e 74 20 63 6f ouldRetry(int co
0650: 64 65 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 65 de) {. int re
0660: 73 20 3d 20 30 3b 0a 20 20 20 20 64 70 72 69 6e s = 0;. dprin
0670: 74 66 28 22 42 49 4f 53 68 6f 75 6c 64 52 65 74 tf("BIOShouldRet
0680: 72 79 20 25 64 3d 25 73 22 2c 20 63 6f 64 65 2c ry %d=%s", code,
0690: 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 63 6f Tcl_ErrnoMsg(co
06a0: 64 65 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 63 de));.. if (c
06b0: 6f 64 65 20 3d 3d 20 45 41 47 41 49 4e 20 7c 7c ode == EAGAIN ||
06c0: 20 63 6f 64 65 20 3d 3d 20 45 57 4f 55 4c 44 42 code == EWOULDB
06d0: 4c 4f 43 4b 20 7c 7c 20 63 6f 64 65 20 3d 3d 20 LOCK || code ==
06e0: 45 4e 4f 54 43 4f 4e 4e 20 7c 7c 20 63 6f 64 65 ENOTCONN || code
06f0: 20 3d 3d 20 45 50 52 4f 54 4f 20 7c 7c 0a 23 69 == EPROTO ||.#i
0700: 66 64 65 66 20 5f 57 49 4e 33 32 0a 09 63 6f 64 fdef _WIN32..cod
0710: 65 20 3d 3d 20 57 53 41 45 57 4f 55 4c 44 42 4c e == WSAEWOULDBL
0720: 4f 43 4b 20 7c 7c 0a 23 65 6e 64 69 66 0a 09 63 OCK ||.#endif..c
0730: 6f 64 65 20 3d 3d 20 45 49 4e 54 52 20 7c 7c 20 ode == EINTR ||
0740: 63 6f 64 65 20 3d 3d 20 45 49 4e 50 52 4f 47 52 code == EINPROGR
0750: 45 53 53 20 7c 7c 20 63 6f 64 65 20 3d 3d 20 45 ESS || code == E
0760: 41 4c 52 45 41 44 59 29 20 7b 0a 09 72 65 73 20 ALREADY) {..res
0770: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 = 1;. }..
0780: 64 70 72 69 6e 74 66 28 22 42 49 4f 53 68 6f 75 dprintf("BIOShou
0790: 6c 64 52 65 74 72 79 20 25 64 3d 25 73 2c 20 72 ldRetry %d=%s, r
07a0: 65 73 3d 25 64 22 2c 20 63 6f 64 65 2c 20 54 63 es=%d", code, Tc
07b0: 6c 5f 45 72 72 6e 6f 4d 73 67 28 63 6f 64 65 29 l_ErrnoMsg(code)
07c0: 2c 20 72 65 73 29 3b 0a 0a 20 20 20 20 72 65 74 , res);.. ret
07d0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 urn res;.}../*.
07e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0830: 2a 0a 20 2a 20 42 69 6f 4f 75 74 70 75 74 20 2d *. * BioOutput -
0840: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e -. *. *.This fun
0850: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f ction is used to
0860: 20 72 65 61 64 20 65 6e 63 72 79 70 74 65 64 20 read encrypted
0870: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 42 49 data from the BI
0880: 4f 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 20 O and write it.
0890: 2a 09 69 6e 74 6f 20 74 68 65 20 73 6f 63 6b 65 *.into the socke
08a0: 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e t. This function
08b0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 will be called
08c0: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 in response to t
08d0: 68 65 0a 20 2a 09 61 70 70 6c 69 63 61 74 69 6f he. *.applicatio
08e0: 6e 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 42 49 n calling the BI
08f0: 4f 5f 77 72 69 74 65 5f 65 78 28 29 20 6f 72 20 O_write_ex() or
0900: 42 49 4f 5f 77 72 69 74 65 28 29 20 66 75 6e 63 BIO_write() func
0910: 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 tions.. *. * Res
0920: 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 ults:. *.Returns
0930: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
0940: 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 ytes written to
0950: 63 68 61 6e 6e 65 6c 2c 20 30 20 66 6f 72 20 45 channel, 0 for E
0960: 4f 46 2c 20 6f 72 20 2d 31 20 66 6f 72 0a 20 2a OF, or -1 for. *
0970: 09 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 53 69 .error.. *. * Si
0980: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 de effects:. *.W
0990: 72 69 74 65 73 20 42 49 4f 20 64 61 74 61 20 74 rites BIO data t
09a0: 6f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a o channel.. *. *
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
0a00: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 42 69 /..static int Bi
0a10: 6f 4f 75 74 70 75 74 28 42 49 4f 20 2a 62 69 6f oOutput(BIO *bio
0a20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 75 , const char *bu
0a30: 66 2c 20 69 6e 74 20 62 75 66 4c 65 6e 29 20 7b f, int bufLen) {
0a40: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 72 65 . Tcl_Size re
0a50: 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 5f 65 6f t;. int is_eo
0a60: 66 2c 20 74 63 6c 45 72 72 6e 6f 3b 0a 20 20 20 f, tclErrno;.
0a70: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
0a80: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 42 49 4f = (State *) BIO
0a90: 5f 67 65 74 5f 64 61 74 61 28 62 69 6f 29 3b 0a _get_data(bio);.
0aa0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
0ab0: 63 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 chan = Tls_GetPa
0ac0: 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 30 rent(statePtr, 0
0ad0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
0ae0: 22 5b 63 68 61 6e 3d 25 70 5d 20 42 69 6f 4f 75 "[chan=%p] BioOu
0af0: 74 70 75 74 28 62 69 6f 3d 25 70 2c 20 62 75 66 tput(bio=%p, buf
0b00: 3d 25 70 2c 20 6c 65 6e 3d 25 64 29 22 2c 20 28 =%p, len=%d)", (
0b10: 76 6f 69 64 20 2a 29 63 68 61 6e 2c 0a 09 28 76 void *)chan,..(v
0b20: 6f 69 64 20 2a 29 20 62 69 6f 2c 20 62 75 66 2c oid *) bio, buf,
0b30: 20 62 75 66 4c 65 6e 29 3b 0a 0a 20 20 20 20 42 bufLen);.. B
0b40: 49 4f 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f 66 IO_clear_retry_f
0b50: 6c 61 67 73 28 62 69 6f 29 3b 0a 20 20 20 20 54 lags(bio);. T
0b60: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 30 29 3b 0a cl_SetErrno(0);.
0b70: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 64 61 . /* Write da
0b80: 74 61 20 74 6f 20 75 6e 64 65 72 6c 79 69 6e 67 ta to underlying
0b90: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
0ba0: 72 65 74 20 3d 20 54 63 6c 5f 57 72 69 74 65 52 ret = Tcl_WriteR
0bb0: 61 77 28 63 68 61 6e 2c 20 62 75 66 2c 20 28 54 aw(chan, buf, (T
0bc0: 63 6c 5f 53 69 7a 65 29 20 62 75 66 4c 65 6e 29 cl_Size) bufLen)
0bd0: 3b 0a 20 20 20 20 69 73 5f 65 6f 66 20 3d 20 54 ;. is_eof = T
0be0: 63 6c 5f 45 6f 66 28 63 68 61 6e 29 3b 0a 20 20 cl_Eof(chan);.
0bf0: 20 20 74 63 6c 45 72 72 6e 6f 20 3d 20 54 63 6c tclErrno = Tcl
0c00: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20 _GetErrno();..
0c10: 20 20 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e dprintf("[chan
0c20: 3d 25 70 5d 20 42 69 6f 4f 75 74 70 75 74 28 25 =%p] BioOutput(%
0c30: 64 29 20 2d 3e 20 25 22 20 54 43 4c 5f 53 49 5a d) -> %" TCL_SIZ
0c40: 45 5f 4d 4f 44 49 46 49 45 52 20 22 64 20 5b 74 E_MODIFIER "d [t
0c50: 63 6c 45 6f 66 3d 25 64 3b 20 74 63 6c 45 72 72 clEof=%d; tclErr
0c60: 6e 6f 3d 25 64 3a 20 25 73 5d 22 2c 0a 09 28 76 no=%d: %s]",..(v
0c70: 6f 69 64 20 2a 29 20 63 68 61 6e 2c 20 62 75 66 oid *) chan, buf
0c80: 4c 65 6e 2c 20 72 65 74 2c 20 69 73 5f 65 6f 66 Len, ret, is_eof
0c90: 2c 20 74 63 6c 45 72 72 6e 6f 2c 20 54 63 6c 5f , tclErrno, Tcl_
0ca0: 45 72 72 6e 6f 4d 73 67 28 74 63 6c 45 72 72 6e ErrnoMsg(tclErrn
0cb0: 6f 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 o));.. if (re
0cc0: 74 20 3e 20 30 29 20 7b 0a 09 64 70 72 69 6e 74 t > 0) {..dprint
0cd0: 66 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 f("Successfully
0ce0: 77 72 6f 74 65 20 25 22 20 54 43 4c 5f 53 49 5a wrote %" TCL_SIZ
0cf0: 45 5f 4d 4f 44 49 46 49 45 52 20 22 64 20 62 79 E_MODIFIER "d by
0d00: 74 65 73 20 6f 66 20 64 61 74 61 22 2c 20 72 65 tes of data", re
0d10: 74 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 t);.. } else
0d20: 69 66 20 28 72 65 74 20 3d 3d 20 30 29 20 7b 0a if (ret == 0) {.
0d30: 09 69 66 20 28 69 73 5f 65 6f 66 29 20 7b 0a 09 .if (is_eof) {..
0d40: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 dprintf("Got
0d50: 20 45 4f 46 20 77 68 69 6c 65 20 77 72 69 74 69 EOF while writi
0d60: 6e 67 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20 ng, returning a
0d70: 43 6f 6e 6e 65 63 74 69 6f 6e 20 52 65 73 65 74 Connection Reset
0d80: 20 65 72 72 6f 72 20 77 68 69 63 68 20 6d 61 70 error which map
0d90: 73 20 74 6f 20 53 6f 66 74 20 45 4f 46 22 29 3b s to Soft EOF");
0da0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
0db0: 6e 6f 28 45 43 4f 4e 4e 52 45 53 45 54 29 3b 0a no(ECONNRESET);.
0dc0: 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 66 6c 61 . BIO_set_fla
0dd0: 67 73 28 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 gs(bio, BIO_FLAG
0de0: 53 5f 49 4e 5f 45 4f 46 29 3b 0a 0a 09 7d 20 65 S_IN_EOF);...} e
0df0: 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e lse {.. dprin
0e00: 74 66 28 22 47 6f 74 20 30 20 66 72 6f 6d 20 54 tf("Got 0 from T
0e10: 63 6c 5f 57 72 69 74 65 52 61 77 2c 20 61 6e 64 cl_WriteRaw, and
0e20: 20 45 4f 46 20 69 73 20 6e 6f 74 20 73 65 74 3b EOF is not set;
0e30: 20 72 65 74 20 3d 20 30 22 29 3b 0a 09 20 20 20 ret = 0");..
0e40: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 77 BIO_set_retry_w
0e50: 72 69 74 65 28 62 69 6f 29 3b 0a 0a 09 20 20 20 rite(bio);...
0e60: 20 64 70 72 69 6e 74 66 28 22 53 65 74 74 69 6e dprintf("Settin
0e70: 67 20 72 65 74 72 79 20 72 65 61 64 20 66 6c 61 g retry read fla
0e80: 67 22 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 g");.. BIO_se
0e90: 74 5f 72 65 74 72 79 5f 72 65 61 64 28 62 69 6f t_retry_read(bio
0ea0: 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 );..}.. } els
0eb0: 65 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 57 65 e {..dprintf("We
0ec0: 20 67 6f 74 20 73 6f 6d 65 20 6b 69 6e 64 20 6f got some kind o
0ed0: 66 20 49 2f 4f 20 65 72 72 6f 72 22 29 3b 0a 0a f I/O error");..
0ee0: 09 69 66 20 28 42 49 4f 53 68 6f 75 6c 64 52 65 .if (BIOShouldRe
0ef0: 74 72 79 28 74 63 6c 45 72 72 6e 6f 29 29 20 7b try(tclErrno)) {
0f00: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 .. dprintf("T
0f10: 72 79 20 61 67 61 69 6e 20 66 6f 72 3a 20 25 69 ry again for: %i
0f20: 3d 25 73 22 2c 20 74 63 6c 45 72 72 6e 6f 2c 20 =%s", tclErrno,
0f30: 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 74 63 6c Tcl_ErrnoMsg(tcl
0f40: 45 72 72 6e 6f 29 29 3b 0a 09 20 20 20 20 42 49 Errno));.. BI
0f50: 4f 5f 73 65 74 5f 72 65 74 72 79 5f 77 72 69 74 O_set_retry_writ
0f60: 65 28 62 69 6f 29 3b 0a 0a 09 7d 20 65 6c 73 65 e(bio);...} else
0f70: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
0f80: 22 55 6e 65 78 70 65 63 74 65 64 20 65 72 72 6f "Unexpected erro
0f90: 72 3a 20 25 69 3d 25 73 22 2c 20 74 63 6c 45 72 r: %i=%s", tclEr
0fa0: 72 6e 6f 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 rno, Tcl_ErrnoMs
0fb0: 67 28 74 63 6c 45 72 72 6e 6f 29 29 3b 0a 09 7d g(tclErrno));..}
0fc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
0fd0: 6e 74 66 28 22 42 69 6f 4f 75 74 70 75 74 20 72 ntf("BioOutput r
0fe0: 65 74 75 72 6e 69 6e 67 20 25 22 20 54 43 4c 5f eturning %" TCL_
0ff0: 53 49 5a 45 5f 4d 4f 44 49 46 49 45 52 20 22 64 SIZE_MODIFIER "d
1000: 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 72 65 74 ", ret);. ret
1010: 75 72 6e 20 28 69 6e 74 29 20 72 65 74 3b 0a 7d urn (int) ret;.}
1020: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1070: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 69 6f 49 6e ----. *. * BioIn
1080: 70 75 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 put --. *. *.Thi
1090: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 s function is us
10a0: 65 64 20 74 6f 20 72 65 61 64 20 65 6e 63 72 79 ed to read encry
10b0: 70 74 65 64 20 64 61 74 61 20 66 72 6f 6d 20 74 pted data from t
10c0: 68 65 20 73 6f 63 6b 65 74 20 61 6e 64 0a 20 2a he socket and. *
10d0: 09 77 72 69 74 65 20 69 74 20 69 6e 74 6f 20 74 .write it into t
10e0: 68 65 20 42 49 4f 2e 20 54 68 69 73 20 66 75 6e he BIO. This fun
10f0: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61 ction will be ca
1100: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 lled in response
1110: 20 74 6f 20 74 68 65 0a 20 2a 09 61 70 70 6c 69 to the. *.appli
1120: 63 61 74 69 6f 6e 20 63 61 6c 6c 69 6e 67 20 74 cation calling t
1130: 68 65 20 42 49 4f 5f 72 65 61 64 5f 65 78 28 29 he BIO_read_ex()
1140: 20 6f 72 20 42 49 4f 5f 72 65 61 64 28 29 20 66 or BIO_read() f
1150: 75 6e 63 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 20 unctions.. *. *
1160: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
1170: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f rns the number o
1180: 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f f bytes read fro
1190: 6d 20 63 68 61 6e 6e 65 6c 2c 20 30 20 66 6f 72 m channel, 0 for
11a0: 20 45 4f 46 2c 20 6f 72 20 2d 31 20 66 6f 72 0a EOF, or -1 for.
11b0: 20 2a 09 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 *.error.. *. *
11c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
11d0: 09 52 65 61 64 73 20 63 68 61 6e 6e 65 6c 20 64 .Reads channel d
11e0: 61 74 61 20 69 6e 74 6f 20 42 49 4f 2e 0a 20 2a ata into BIO.. *
11f0: 0a 20 2a 20 44 61 74 61 20 69 73 20 72 65 63 65 . * Data is rece
1200: 69 76 65 64 20 69 6e 20 77 68 6f 6c 65 20 62 6c ived in whole bl
1210: 6f 63 6b 73 20 6b 6e 6f 77 6e 20 61 73 20 72 65 ocks known as re
1220: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 70 cords from the p
1230: 65 65 72 2e 20 41 20 77 68 6f 6c 65 0a 20 2a 20 eer. A whole. *
1240: 72 65 63 6f 72 64 20 69 73 20 70 72 6f 63 65 73 record is proces
1250: 73 65 64 20 28 65 2e 67 2e 20 64 65 63 72 79 70 sed (e.g. decryp
1260: 74 65 64 29 20 69 6e 20 6f 6e 65 20 67 6f 20 61 ted) in one go a
1270: 6e 64 20 69 73 20 62 75 66 66 65 72 65 64 20 62 nd is buffered b
1280: 79 20 4f 70 65 6e 53 53 4c 0a 20 2a 20 75 6e 74 y OpenSSL. * unt
1290: 69 6c 20 69 74 20 69 73 20 72 65 61 64 20 62 79 il it is read by
12a0: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e the application
12b0: 20 76 69 61 20 61 20 63 61 6c 6c 20 74 6f 20 53 via a call to S
12c0: 53 4c 5f 72 65 61 64 2e 20 53 53 4c 5f 70 65 6e SL_read. SSL_pen
12d0: 64 69 6e 67 28 29 0a 20 2a 20 72 65 74 75 72 6e ding(). * return
12e0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
12f0: 62 79 74 65 73 20 77 68 69 63 68 20 68 61 76 65 bytes which have
1300: 20 62 65 65 6e 20 70 72 6f 63 65 73 73 65 64 2c been processed,
1310: 20 62 75 66 66 65 72 65 64 2c 20 61 6e 64 20 61 buffered, and a
1320: 72 65 0a 20 2a 20 61 76 61 69 6c 61 62 6c 65 20 re. * available
1330: 69 6e 73 69 64 65 20 73 73 6c 20 66 6f 72 20 69 inside ssl for i
1340: 6d 6d 65 64 69 61 74 65 20 72 65 61 64 2e 20 53 mmediate read. S
1350: 53 4c 5f 68 61 73 5f 70 65 6e 64 69 6e 67 28 29 SL_has_pending()
1360: 20 72 65 74 75 72 6e 73 20 31 20 69 66 0a 20 2a returns 1 if. *
1370: 20 64 61 74 61 20 69 73 20 62 75 66 66 65 72 65 data is buffere
1380: 64 20 28 77 68 65 74 68 65 72 20 70 72 6f 63 65 d (whether proce
1390: 73 73 65 64 20 6f 72 20 75 6e 70 72 6f 63 65 73 ssed or unproces
13a0: 73 65 64 29 20 61 6e 64 20 30 20 6f 74 68 65 72 sed) and 0 other
13b0: 77 69 73 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d wise.. *. *-----
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1400: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
1410: 61 74 69 63 20 69 6e 74 20 42 69 6f 49 6e 70 75 atic int BioInpu
1420: 74 28 42 49 4f 20 2a 62 69 6f 2c 20 63 68 61 72 t(BIO *bio, char
1430: 20 2a 62 75 66 2c 20 69 6e 74 20 62 75 66 4c 65 *buf, int bufLe
1440: 6e 29 20 7b 0a 20 20 20 20 54 63 6c 5f 53 69 7a n) {. Tcl_Siz
1450: 65 20 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 e ret = 0;. i
1460: 6e 74 20 69 73 5f 65 6f 66 2c 20 74 63 6c 45 72 nt is_eof, tclEr
1470: 72 6e 6f 2c 20 69 73 5f 62 6c 6f 63 6b 65 64 3b rno, is_blocked;
1480: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
1490: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
14a0: 20 42 49 4f 5f 67 65 74 5f 64 61 74 61 28 62 69 BIO_get_data(bi
14b0: 6f 29 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e o);. Tcl_Chan
14c0: 6e 65 6c 20 63 68 61 6e 20 3d 20 54 6c 73 5f 47 nel chan = Tls_G
14d0: 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 etParent(statePt
14e0: 72 2c 20 30 29 3b 0a 0a 20 20 20 20 64 70 72 69 r, 0);.. dpri
14f0: 6e 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 ntf("[chan=%p] B
1500: 69 6f 49 6e 70 75 74 28 62 69 6f 3d 25 70 2c 20 ioInput(bio=%p,
1510: 62 75 66 3d 25 70 2c 20 6c 65 6e 3d 25 64 29 22 buf=%p, len=%d)"
1520: 2c 20 28 76 6f 69 64 20 2a 29 20 63 68 61 6e 2c , (void *) chan,
1530: 0a 09 28 76 6f 69 64 20 2a 29 20 62 69 6f 2c 20 ..(void *) bio,
1540: 62 75 66 2c 20 62 75 66 4c 65 6e 29 3b 0a 0a 20 buf, bufLen);..
1550: 20 20 20 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 if (buf == NU
1560: 4c 4c 20 7c 7c 20 62 75 66 4c 65 6e 20 3c 3d 20 LL || bufLen <=
1570: 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 0) {..return 0;.
1580: 20 20 20 20 7d 0a 0a 20 20 20 20 42 49 4f 5f 63 }.. BIO_c
1590: 6c 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 67 73 lear_retry_flags
15a0: 28 62 69 6f 29 3b 0a 20 20 20 20 54 63 6c 5f 53 (bio);. Tcl_S
15b0: 65 74 45 72 72 6e 6f 28 30 29 3b 0a 0a 20 20 20 etErrno(0);..
15c0: 20 2f 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 /* Read data fr
15d0: 6f 6d 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 om underlying ch
15e0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 72 65 74 annel */. ret
15f0: 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 63 = Tcl_ReadRaw(c
1600: 68 61 6e 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 han, buf, (Tcl_S
1610: 69 7a 65 29 20 62 75 66 4c 65 6e 29 3b 0a 0a 20 ize) bufLen);..
1620: 20 20 20 69 73 5f 65 6f 66 20 3d 20 54 63 6c 5f is_eof = Tcl_
1630: 45 6f 66 28 63 68 61 6e 29 3b 0a 20 20 20 20 74 Eof(chan);. t
1640: 63 6c 45 72 72 6e 6f 20 3d 20 54 63 6c 5f 47 65 clErrno = Tcl_Ge
1650: 74 45 72 72 6e 6f 28 29 3b 0a 20 20 20 20 69 73 tErrno();. is
1660: 5f 62 6c 6f 63 6b 65 64 20 3d 20 54 63 6c 5f 49 _blocked = Tcl_I
1670: 6e 70 75 74 42 6c 6f 63 6b 65 64 28 63 68 61 6e nputBlocked(chan
1680: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
1690: 22 5b 63 68 61 6e 3d 25 70 5d 20 42 69 6f 49 6e "[chan=%p] BioIn
16a0: 70 75 74 28 25 64 29 20 2d 3e 20 25 22 20 54 43 put(%d) -> %" TC
16b0: 4c 5f 53 49 5a 45 5f 4d 4f 44 49 46 49 45 52 20 L_SIZE_MODIFIER
16c0: 22 64 20 5b 74 63 6c 45 6f 66 3d 25 64 3b 20 62 "d [tclEof=%d; b
16d0: 6c 6f 63 6b 65 64 3d 25 64 3b 20 74 63 6c 45 72 locked=%d; tclEr
16e0: 72 6e 6f 3d 25 64 3a 20 25 73 5d 22 2c 0a 09 28 rno=%d: %s]",..(
16f0: 76 6f 69 64 20 2a 29 20 63 68 61 6e 2c 20 62 75 void *) chan, bu
1700: 66 4c 65 6e 2c 20 72 65 74 2c 20 69 73 5f 65 6f fLen, ret, is_eo
1710: 66 2c 20 69 73 5f 62 6c 6f 63 6b 65 64 2c 20 74 f, is_blocked, t
1720: 63 6c 45 72 72 6e 6f 2c 20 54 63 6c 5f 45 72 72 clErrno, Tcl_Err
1730: 6e 6f 4d 73 67 28 74 63 6c 45 72 72 6e 6f 29 29 noMsg(tclErrno))
1740: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3e ;.. if (ret >
1750: 20 30 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 0) {..dprintf("
1760: 53 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 Successfully rea
1770: 64 20 25 22 20 54 43 4c 5f 53 49 5a 45 5f 4d 4f d %" TCL_SIZE_MO
1780: 44 49 46 49 45 52 20 22 64 20 62 79 74 65 73 20 DIFIER "d bytes
1790: 6f 66 20 64 61 74 61 22 2c 20 72 65 74 29 3b 0a of data", ret);.
17a0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
17b0: 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09 69 66 20 ret == 0) {..if
17c0: 28 69 73 5f 65 6f 66 29 20 7b 0a 09 20 20 20 20 (is_eof) {..
17d0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 45 4f 46 dprintf("Got EOF
17e0: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 2c 20 while reading,
17f0: 72 65 74 75 72 6e 69 6e 67 20 61 20 43 6f 6e 6e returning a Conn
1800: 65 63 74 69 6f 6e 20 52 65 73 65 74 20 65 72 72 ection Reset err
1810: 6f 72 20 77 68 69 63 68 20 6d 61 70 73 20 74 6f or which maps to
1820: 20 53 6f 66 74 20 45 4f 46 22 29 3b 0a 09 20 20 Soft EOF");..
1830: 20 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 Tcl_SetErrno(E
1840: 43 4f 4e 4e 52 45 53 45 54 29 3b 0a 09 20 20 20 CONNRESET);..
1850: 20 42 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 62 BIO_set_flags(b
1860: 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 49 4e io, BIO_FLAGS_IN
1870: 5f 45 4f 46 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 _EOF);...} else
1880: 69 66 20 28 69 73 5f 62 6c 6f 63 6b 65 64 29 20 if (is_blocked)
1890: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
18a0: 47 6f 74 20 69 6e 70 75 74 20 62 6c 6f 63 6b 65 Got input blocke
18b0: 64 20 66 72 6f 6d 20 54 63 6c 5f 52 65 61 64 52 d from Tcl_ReadR
18c0: 61 77 2e 20 53 65 74 74 69 6e 67 20 72 65 74 72 aw. Setting retr
18d0: 79 20 72 65 61 64 20 66 6c 61 67 22 29 3b 0a 09 y read flag");..
18e0: 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 BIO_set_retr
18f0: 79 5f 72 65 61 64 28 62 69 6f 29 3b 0a 09 7d 0a y_read(bio);..}.
1900: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 64 . } else {..d
1910: 70 72 69 6e 74 66 28 22 57 65 20 67 6f 74 20 73 printf("We got s
1920: 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 49 2f 4f 20 ome kind of I/O
1930: 65 72 72 6f 72 22 29 3b 0a 0a 09 69 66 20 28 42 error");...if (B
1940: 49 4f 53 68 6f 75 6c 64 52 65 74 72 79 28 74 63 IOShouldRetry(tc
1950: 6c 45 72 72 6e 6f 29 29 20 7b 0a 09 20 20 20 20 lErrno)) {..
1960: 64 70 72 69 6e 74 66 28 22 54 72 79 20 61 67 61 dprintf("Try aga
1970: 69 6e 20 66 6f 72 3a 20 25 69 3d 25 73 22 2c 20 in for: %i=%s",
1980: 74 63 6c 45 72 72 6e 6f 2c 20 54 63 6c 5f 45 72 tclErrno, Tcl_Er
1990: 72 6e 6f 4d 73 67 28 74 63 6c 45 72 72 6e 6f 29 rnoMsg(tclErrno)
19a0: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f );.. BIO_set_
19b0: 72 65 74 72 79 5f 72 65 61 64 28 62 69 6f 29 3b retry_read(bio);
19c0: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ...} else {..
19d0: 20 64 70 72 69 6e 74 66 28 22 55 6e 65 78 70 65 dprintf("Unexpe
19e0: 63 74 65 64 20 65 72 72 6f 72 3a 20 25 69 3d 25 cted error: %i=%
19f0: 73 22 2c 20 74 63 6c 45 72 72 6e 6f 2c 20 54 63 s", tclErrno, Tc
1a00: 6c 5f 45 72 72 6e 6f 4d 73 67 28 74 63 6c 45 72 l_ErrnoMsg(tclEr
1a10: 72 6e 6f 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a rno));..}. }.
1a20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 69 . dprintf("Bi
1a30: 6f 49 6e 70 75 74 20 72 65 74 75 72 6e 69 6e 67 oInput returning
1a40: 20 25 22 20 54 43 4c 5f 53 49 5a 45 5f 4d 4f 44 %" TCL_SIZE_MOD
1a50: 49 46 49 45 52 20 22 64 22 2c 20 72 65 74 29 3b IFIER "d", ret);
1a60: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 . return (int
1a70: 29 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d ) ret;.}../*. *-
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ab0: 2d 2d 2d 2d 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 0a 20 2a 0a ------------. *.
1ad0: 20 2a 20 42 69 6f 50 75 74 73 20 2d 2d 0a 20 2a * BioPuts --. *
1ae0: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f . *.This functio
1af0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 n is used to rea
1b00: 64 20 61 20 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 d a NULL termina
1b10: 74 65 64 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 ted string from
1b20: 74 68 65 20 42 49 4f 20 61 6e 64 0a 20 2a 09 77 the BIO and. *.w
1b30: 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 63 rite it to the c
1b40: 68 61 6e 6e 65 6c 2e 20 54 68 69 73 20 66 75 6e hannel. This fun
1b50: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61 ction will be ca
1b60: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 lled in response
1b70: 20 74 6f 0a 20 2a 09 74 68 65 20 61 70 70 6c 69 to. *.the appli
1b80: 63 61 74 69 6f 6e 20 63 61 6c 6c 69 6e 67 20 74 cation calling t
1b90: 68 65 20 42 49 4f 5f 70 75 74 73 28 29 20 66 75 he BIO_puts() fu
1ba0: 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 nction.. *. * Re
1bb0: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e sults:. *.Return
1bc0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
1bd0: 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f bytes written to
1be0: 20 63 68 61 6e 6e 65 6c 20 6f 72 20 30 20 66 6f channel or 0 fo
1bf0: 72 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 53 r error.. *. * S
1c00: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1c10: 57 72 69 74 65 73 20 64 61 74 61 20 74 6f 20 63 Writes data to c
1c20: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
1c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
1c80: 73 74 61 74 69 63 20 69 6e 74 20 42 69 6f 50 75 static int BioPu
1c90: 74 73 28 42 49 4f 20 2a 62 69 6f 2c 20 63 6f 6e ts(BIO *bio, con
1ca0: 73 74 20 63 68 61 72 20 2a 73 74 72 29 20 7b 0a st char *str) {.
1cb0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 69 6f dprintf("Bio
1cc0: 50 75 74 73 28 25 70 29 20 5c 22 25 73 5c 22 22 Puts(%p) \"%s\""
1cd0: 2c 20 62 69 6f 2c 20 73 74 72 29 3b 0a 0a 20 20 , bio, str);..
1ce0: 20 20 72 65 74 75 72 6e 20 42 69 6f 4f 75 74 70 return BioOutp
1cf0: 75 74 28 62 69 6f 2c 20 73 74 72 2c 20 28 69 6e ut(bio, str, (in
1d00: 74 29 20 73 74 72 6c 65 6e 28 73 74 72 29 29 3b t) strlen(str));
1d10: 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d60: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 69 6f ------. *. * Bio
1d70: 43 74 72 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Ctrl --. *. *.Th
1d80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 is function is u
1d90: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 63 sed to process c
1da0: 6f 6e 74 72 6f 6c 20 6d 65 73 73 61 67 65 73 20 ontrol messages
1db0: 69 6e 20 74 68 65 20 42 49 4f 2e 20 54 68 69 73 in the BIO. This
1dc0: 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 20 77 69 6c . *.function wil
1dd0: 6c 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 72 l be called in r
1de0: 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 61 esponse to the a
1df0: 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 69 pplication calli
1e00: 6e 67 20 74 68 65 0a 20 2a 09 42 49 4f 5f 63 74 ng the. *.BIO_ct
1e10: 72 6c 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 rl() function..
1e20: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
1e30: 09 46 75 6e 63 74 69 6f 6e 20 64 65 70 65 6e 64 .Function depend
1e40: 65 6e 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ent. *. * Side e
1e50: 66 66 65 63 74 73 3a 0a 20 2a 09 46 75 6e 63 74 ffects:. *.Funct
1e60: 69 6f 6e 20 64 65 70 65 6e 64 65 6e 74 0a 20 2a ion dependent. *
1e70: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ec0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 6c 6f 6e . */..static lon
1ed0: 67 20 42 69 6f 43 74 72 6c 28 42 49 4f 20 2a 62 g BioCtrl(BIO *b
1ee0: 69 6f 2c 20 69 6e 74 20 63 6d 64 2c 20 6c 6f 6e io, int cmd, lon
1ef0: 67 20 6e 75 6d 2c 20 76 6f 69 64 20 2a 70 74 72 g num, void *ptr
1f00: 29 20 7b 0a 20 20 20 20 6c 6f 6e 67 20 72 65 74 ) {. long ret
1f10: 20 3d 20 31 3b 0a 20 20 20 20 53 74 61 74 65 20 = 1;. State
1f20: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
1f30: 74 65 20 2a 29 20 42 49 4f 5f 67 65 74 5f 64 61 te *) BIO_get_da
1f40: 74 61 28 62 69 6f 29 3b 0a 20 20 20 20 54 63 6c ta(bio);. Tcl
1f50: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 20 3d 20 _Channel chan =
1f60: 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 Tls_GetParent(st
1f70: 61 74 65 50 74 72 2c 20 30 29 3b 0a 0a 20 20 20 atePtr, 0);..
1f80: 20 64 70 72 69 6e 74 66 28 22 42 69 6f 43 74 72 dprintf("BioCtr
1f90: 6c 28 25 70 2c 20 30 78 25 78 2c 20 30 78 25 6c l(%p, 0x%x, 0x%l
1fa0: 78 2c 20 25 70 29 22 2c 20 28 76 6f 69 64 20 2a x, %p)", (void *
1fb0: 29 20 62 69 6f 2c 20 63 6d 64 2c 20 6e 75 6d 2c ) bio, cmd, num,
1fc0: 20 70 74 72 29 3b 0a 0a 20 20 20 20 73 77 69 74 ptr);.. swit
1fd0: 63 68 20 28 63 6d 64 29 20 7b 0a 09 63 61 73 65 ch (cmd) {..case
1fe0: 20 42 49 4f 5f 43 54 52 4c 5f 52 45 53 45 54 3a BIO_CTRL_RESET:
1ff0: 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 52 65 73 65 .../* opt - Rese
2000: 74 73 20 42 49 4f 20 74 6f 20 69 6e 69 74 69 61 ts BIO to initia
2010: 6c 20 73 74 61 74 65 2e 20 49 6d 70 6c 65 6d 65 l state. Impleme
2020: 6e 74 73 20 42 49 4f 5f 72 65 73 65 74 2e 20 2a nts BIO_reset. *
2030: 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 /...dprintf("Got
2040: 20 42 49 4f 5f 43 54 52 4c 5f 52 45 53 45 54 22 BIO_CTRL_RESET"
2050: 29 3b 0a 09 09 2f 2a 20 52 65 74 75 72 6e 20 31 );.../* Return 1
2060: 20 66 6f 72 20 73 75 63 63 65 73 73 20 28 30 20 for success (0
2070: 66 6f 72 20 66 69 6c 65 20 42 49 4f 73 29 20 61 for file BIOs) a
2080: 6e 64 20 2d 31 20 66 6f 72 20 66 61 69 6c 75 72 nd -1 for failur
2090: 65 20 2a 2f 0a 09 09 72 65 74 20 3d 20 30 3b 0a e */...ret = 0;.
20a0: 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 ..break;..case B
20b0: 49 4f 5f 43 54 52 4c 5f 45 4f 46 3a 0a 09 09 2f IO_CTRL_EOF:.../
20c0: 2a 20 6f 70 74 20 2d 20 52 65 74 75 72 6e 73 20 * opt - Returns
20d0: 77 68 65 74 68 65 72 20 45 4f 46 20 68 61 73 20 whether EOF has
20e0: 62 65 65 6e 20 72 65 61 63 68 65 64 2e 20 49 6d been reached. Im
20f0: 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 65 6f 66 plements BIO_eof
2100: 2e 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 . */...dprintf("
2110: 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 45 4f 46 Got BIO_CTRL_EOF
2120: 22 29 3b 0a 09 09 2f 2a 20 52 65 74 75 72 6e 73 ");.../* Returns
2130: 20 31 20 69 66 20 45 4f 46 20 68 61 73 20 62 65 1 if EOF has be
2140: 65 6e 20 72 65 61 63 68 65 64 2c 20 30 20 69 66 en reached, 0 if
2150: 20 6e 6f 74 2c 20 6f 72 20 3c 30 20 66 6f 72 20 not, or <0 for
2160: 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 72 65 74 failure */...ret
2170: 20 3d 20 28 28 63 68 61 6e 29 20 3f 20 28 54 63 = ((chan) ? (Tc
2180: 6c 5f 45 6f 66 28 63 68 61 6e 29 20 7c 7c 20 42 l_Eof(chan) || B
2190: 49 4f 5f 74 65 73 74 5f 66 6c 61 67 73 28 62 69 IO_test_flags(bi
21a0: 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 49 4e 5f o, BIO_FLAGS_IN_
21b0: 45 4f 46 29 29 20 3a 20 31 29 3b 0a 09 09 62 72 EOF)) : 1);...br
21c0: 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 eak;..case BIO_C
21d0: 54 52 4c 5f 49 4e 46 4f 3a 0a 09 09 2f 2a 20 6f TRL_INFO:.../* o
21e0: 70 74 20 2d 20 65 78 74 72 61 20 69 6e 66 6f 20 pt - extra info
21f0: 6f 6e 20 42 49 4f 2e 20 49 6d 70 6c 65 6d 65 6e on BIO. Implemen
2200: 74 73 20 42 49 4f 5f 67 65 74 5f 6d 65 6d 5f 64 ts BIO_get_mem_d
2210: 61 74 61 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 ata */...dprintf
2220: 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 49 ("Got BIO_CTRL_I
2230: 4e 46 4f 22 29 3b 0a 09 09 72 65 74 20 3d 20 30 NFO");...ret = 0
2240: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 ;...break;..case
2250: 20 42 49 4f 5f 43 54 52 4c 5f 53 45 54 3a 0a 09 BIO_CTRL_SET:..
2260: 09 2f 2a 20 6d 61 6e 20 2d 20 73 65 74 20 74 68 ./* man - set th
2270: 65 20 27 49 4f 27 20 70 61 72 61 6d 65 74 65 72 e 'IO' parameter
2280: 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 47 */...dprintf("G
2290: 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 53 45 54 22 ot BIO_CTRL_SET"
22a0: 29 3b 0a 09 09 72 65 74 20 3d 20 30 3b 0a 09 09 );...ret = 0;...
22b0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f break;..case BIO
22c0: 5f 43 54 52 4c 5f 47 45 54 3a 0a 09 09 2f 2a 20 _CTRL_GET:.../*
22d0: 6d 61 6e 20 2d 20 67 65 74 20 74 68 65 20 27 49 man - get the 'I
22e0: 4f 27 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a O' parameter */.
22f0: 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 ..dprintf("Got B
2300: 49 4f 5f 43 54 52 4c 5f 47 45 54 20 22 29 3b 0a IO_CTRL_GET ");.
2310: 09 09 72 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 ..ret = 0;...bre
2320: 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 ak;..case BIO_CT
2330: 52 4c 5f 50 55 53 48 3a 0a 09 09 2f 2a 20 6f 70 RL_PUSH:.../* op
2340: 74 20 2d 20 69 6e 74 65 72 6e 61 6c 2c 20 75 73 t - internal, us
2350: 65 64 20 74 6f 20 73 69 67 6e 69 66 79 20 63 68 ed to signify ch
2360: 61 6e 67 65 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 ange. Implements
2370: 20 42 49 4f 5f 70 75 73 68 20 2a 2f 0a 09 09 64 BIO_push */...d
2380: 70 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f printf("Got BIO_
2390: 43 54 52 4c 5f 50 55 53 48 22 29 3b 0a 09 09 72 CTRL_PUSH");...r
23a0: 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b et = 0;...break;
23b0: 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f ..case BIO_CTRL_
23c0: 50 4f 50 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 POP:.../* opt -
23d0: 69 6e 74 65 72 6e 61 6c 2c 20 75 73 65 64 20 74 internal, used t
23e0: 6f 20 73 69 67 6e 69 66 79 20 63 68 61 6e 67 65 o signify change
23f0: 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f . Implements BIO
2400: 5f 70 6f 70 20 2a 2f 0a 09 09 64 70 72 69 6e 74 _pop */...dprint
2410: 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f f("Got BIO_CTRL_
2420: 50 4f 50 22 29 3b 0a 09 09 72 65 74 20 3d 20 30 POP");...ret = 0
2430: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 ;...break;..case
2440: 20 42 49 4f 5f 43 54 52 4c 5f 47 45 54 5f 43 4c BIO_CTRL_GET_CL
2450: 4f 53 45 3a 0a 09 09 2f 2a 20 6d 61 6e 20 2d 20 OSE:.../* man -
2460: 47 65 74 20 74 68 65 20 63 6c 6f 73 65 20 6f 6e Get the close on
2470: 20 42 49 4f 5f 66 72 65 65 28 29 20 66 6c 61 67 BIO_free() flag
2480: 20 73 65 74 20 62 79 20 42 49 4f 5f 43 54 52 4c set by BIO_CTRL
2490: 5f 53 45 54 5f 43 4c 4f 53 45 2e 20 49 6d 70 6c _SET_CLOSE. Impl
24a0: 65 6d 65 6e 74 73 20 42 49 4f 5f 67 65 74 5f 63 ements BIO_get_c
24b0: 6c 6f 73 65 20 2a 2f 0a 09 09 64 70 72 69 6e 74 lose */...dprint
24c0: 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f f("Got BIO_CTRL_
24d0: 43 4c 4f 53 45 22 29 3b 0a 09 09 2f 2a 20 52 65 CLOSE");.../* Re
24e0: 74 75 72 6e 73 20 42 49 4f 5f 43 4c 4f 53 45 2c turns BIO_CLOSE,
24f0: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 2c 20 6f 72 BIO_NOCLOSE, or
2500: 20 3c 30 20 66 6f 72 20 66 61 69 6c 75 72 65 20 <0 for failure
2510: 2a 2f 0a 09 09 72 65 74 20 3d 20 42 49 4f 5f 67 */...ret = BIO_g
2520: 65 74 5f 73 68 75 74 64 6f 77 6e 28 62 69 6f 29 et_shutdown(bio)
2530: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 ;...break;..case
2540: 20 42 49 4f 5f 43 54 52 4c 5f 53 45 54 5f 43 4c BIO_CTRL_SET_CL
2550: 4f 53 45 3a 0a 09 09 2f 2a 20 6d 61 6e 20 2d 20 OSE:.../* man -
2560: 53 65 74 20 74 68 65 20 63 6c 6f 73 65 20 6f 6e Set the close on
2570: 20 42 49 4f 5f 66 72 65 65 28 29 20 66 6c 61 67 BIO_free() flag
2580: 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f . Implements BIO
2590: 5f 73 65 74 5f 63 6c 6f 73 65 20 2a 2f 0a 09 09 _set_close */...
25a0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f dprintf("Got BIO
25b0: 5f 53 45 54 5f 43 4c 4f 53 45 22 29 3b 0a 09 09 _SET_CLOSE");...
25c0: 42 49 4f 5f 73 65 74 5f 73 68 75 74 64 6f 77 6e BIO_set_shutdown
25d0: 28 62 69 6f 2c 20 6e 75 6d 29 3b 0a 09 09 2f 2a (bio, num);.../*
25e0: 20 52 65 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 Returns 1 on su
25f0: 63 63 65 73 73 20 6f 72 20 3c 3d 30 20 66 6f 72 ccess or <=0 for
2600: 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 72 65 failure */...re
2610: 74 20 3d 20 31 3b 0a 09 09 62 72 65 61 6b 3b 0a t = 1;...break;.
2620: 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f 50 .case BIO_CTRL_P
2630: 45 4e 44 49 4e 47 3a 0a 09 09 2f 2a 20 6f 70 74 ENDING:.../* opt
2640: 20 2d 20 52 65 74 75 72 6e 20 6e 75 6d 62 65 72 - Return number
2650: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 42 49 4f of bytes in BIO
2660: 20 77 61 69 74 69 6e 67 20 74 6f 20 62 65 20 72 waiting to be r
2670: 65 61 64 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 ead. Implements
2680: 42 49 4f 5f 70 65 6e 64 69 6e 67 2e 20 2a 2f 0a BIO_pending. */.
2690: 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 ..dprintf("Got B
26a0: 49 4f 5f 43 54 52 4c 5f 50 45 4e 44 49 4e 47 22 IO_CTRL_PENDING"
26b0: 29 3b 0a 09 09 2f 2a 20 52 65 74 75 72 6e 20 74 );.../* Return t
26c0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 70 65 6e he amount of pen
26d0: 64 69 6e 67 20 64 61 74 61 20 6f 72 20 30 20 66 ding data or 0 f
26e0: 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 09 09 72 65 or error */...re
26f0: 74 20 3d 20 28 28 63 68 61 6e 29 20 3f 20 54 63 t = ((chan) ? Tc
2700: 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 l_InputBuffered(
2710: 63 68 61 6e 29 20 3a 20 30 29 3b 0a 09 09 62 72 chan) : 0);...br
2720: 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 eak;..case BIO_C
2730: 54 52 4c 5f 46 4c 55 53 48 3a 0a 09 09 2f 2a 20 TRL_FLUSH:.../*
2740: 6f 70 74 20 2d 20 46 6c 75 73 68 20 61 6e 79 20 opt - Flush any
2750: 62 75 66 66 65 72 65 64 20 6f 75 74 70 75 74 2e buffered output.
2760: 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f Implements BIO_
2770: 66 6c 75 73 68 2e 20 2a 2f 0a 09 09 64 70 72 69 flush. */...dpri
2780: 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 ntf("Got BIO_CTR
2790: 4c 5f 46 4c 55 53 48 22 29 3b 0a 09 09 2f 2a 20 L_FLUSH");.../*
27a0: 55 73 65 20 54 63 6c 5f 57 72 69 74 65 52 61 77 Use Tcl_WriteRaw
27b0: 20 69 6e 73 74 65 61 64 20 6f 66 20 54 63 6c 5f instead of Tcl_
27c0: 46 6c 75 73 68 20 74 6f 20 6f 70 65 72 61 74 65 Flush to operate
27d0: 20 6f 6e 20 72 69 67 68 74 20 63 68 61 6e 20 69 on right chan i
27e0: 6e 20 73 74 61 63 6b 20 2a 2f 0a 09 09 2f 2a 20 n stack */.../*
27f0: 52 65 74 75 72 6e 73 20 31 20 66 6f 72 20 73 75 Returns 1 for su
2800: 63 63 65 73 73 2c 20 3c 3d 30 20 66 6f 72 20 65 ccess, <=0 for e
2810: 72 72 6f 72 2f 72 65 74 72 79 2e 20 2a 2f 0a 09 rror/retry. */..
2820: 09 72 65 74 20 3d 20 28 28 63 68 61 6e 29 20 26 .ret = ((chan) &
2830: 26 20 28 54 63 6c 5f 57 72 69 74 65 52 61 77 28 & (Tcl_WriteRaw(
2840: 63 68 61 6e 2c 20 22 22 2c 20 30 29 20 3e 3d 20 chan, "", 0) >=
2850: 30 29 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 09 09 0) ? 1 : -1);...
2860: 2f 2a 72 65 74 20 3d 20 42 69 6f 4f 75 74 70 75 /*ret = BioOutpu
2870: 74 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 30 29 3b t(bio, NULL, 0);
2880: 2a 2f 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 */...break;..cas
2890: 65 20 42 49 4f 5f 43 54 52 4c 5f 44 55 50 3a 0a e BIO_CTRL_DUP:.
28a0: 09 09 2f 2a 20 6d 61 6e 20 2d 20 65 78 74 72 61 ../* man - extra
28b0: 20 73 74 75 66 66 20 66 6f 72 20 27 64 75 70 65 stuff for 'dupe
28c0: 64 27 20 42 49 4f 2e 20 49 6d 70 6c 65 6d 65 6e d' BIO. Implemen
28d0: 74 73 20 42 49 4f 5f 64 75 70 5f 73 74 61 74 65 ts BIO_dup_state
28e0: 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 47 */...dprintf("G
28f0: 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 44 55 50 22 ot BIO_CTRL_DUP"
2900: 29 3b 0a 09 09 72 65 74 20 3d 20 31 3b 0a 09 09 );...ret = 1;...
2910: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f break;..case BIO
2920: 5f 43 54 52 4c 5f 57 50 45 4e 44 49 4e 47 3a 0a _CTRL_WPENDING:.
2930: 09 09 2f 2a 20 6f 70 74 20 2d 20 52 65 74 75 72 ../* opt - Retur
2940: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 n number of byte
2950: 73 20 69 6e 20 42 49 4f 20 73 74 69 6c 6c 20 74 s in BIO still t
2960: 6f 20 62 65 20 77 72 69 74 74 65 6e 2e 20 49 6d o be written. Im
2970: 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 77 70 65 plements BIO_wpe
2980: 6e 64 69 6e 67 2e 20 2a 2f 0a 09 09 64 70 72 69 nding. */...dpri
2990: 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 ntf("Got BIO_CTR
29a0: 4c 5f 57 50 45 4e 44 49 4e 47 22 29 3b 0a 09 09 L_WPENDING");...
29b0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d /* Return the am
29c0: 6f 75 6e 74 20 6f 66 20 70 65 6e 64 69 6e 67 20 ount of pending
29d0: 64 61 74 61 20 6f 72 20 30 20 66 6f 72 20 65 72 data or 0 for er
29e0: 72 6f 72 20 2a 2f 0a 09 09 72 65 74 20 3d 20 28 ror */...ret = (
29f0: 28 63 68 61 6e 29 20 3f 20 54 63 6c 5f 4f 75 74 (chan) ? Tcl_Out
2a00: 70 75 74 42 75 66 66 65 72 65 64 28 63 68 61 6e putBuffered(chan
2a10: 29 20 3a 20 30 29 3b 0a 09 09 62 72 65 61 6b 3b ) : 0);...break;
2a20: 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f ..case BIO_CTRL_
2a30: 53 45 54 5f 43 41 4c 4c 42 41 43 4b 3a 0a 09 09 SET_CALLBACK:...
2a40: 2f 2a 20 6f 70 74 20 2d 20 53 65 74 73 20 61 6e /* opt - Sets an
2a50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 61 6c 20 63 informational c
2a60: 61 6c 6c 62 61 63 6b 2e 20 49 6d 70 6c 65 6d 65 allback. Impleme
2a70: 6e 74 73 20 42 49 4f 5f 73 65 74 5f 69 6e 66 6f nts BIO_set_info
2a80: 5f 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 09 09 72 _callback */...r
2a90: 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b et = 0;...break;
2aa0: 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f ..case BIO_CTRL_
2ab0: 47 45 54 5f 43 41 4c 4c 42 41 43 4b 3a 0a 09 09 GET_CALLBACK:...
2ac0: 2f 2a 20 6f 70 74 20 2d 20 47 65 74 20 61 6e 64 /* opt - Get and
2ad0: 20 72 65 74 75 72 6e 20 74 68 65 20 69 6e 66 6f return the info
2ae0: 20 63 61 6c 6c 62 61 63 6b 2e 20 49 6d 70 6c 65 callback. Imple
2af0: 6d 65 6e 74 73 20 42 49 4f 5f 67 65 74 5f 69 6e ments BIO_get_in
2b00: 66 6f 5f 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 09 fo_callback */..
2b10: 09 72 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 61 .ret = 0;...brea
2b20: 6b 3b 0a 0a 09 63 61 73 65 20 42 49 4f 5f 43 5f k;...case BIO_C_
2b30: 46 49 4c 45 5f 53 45 45 4b 3a 0a 09 09 2f 2a 20 FILE_SEEK:.../*
2b40: 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 73 6f 63 Not used for soc
2b50: 6b 65 74 73 2e 20 54 63 6c 5f 53 65 65 6b 20 6f kets. Tcl_Seek o
2b60: 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 74 6f 70 nly works on top
2b70: 20 63 68 61 6e 2e 20 49 6d 70 6c 65 6d 65 6e 74 chan. Implement
2b80: 73 20 42 49 4f 5f 73 65 65 6b 28 29 20 2a 2f 0a s BIO_seek() */.
2b90: 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 ..dprintf("Got B
2ba0: 49 4f 5f 43 5f 46 49 4c 45 5f 53 45 45 4b 22 29 IO_C_FILE_SEEK")
2bb0: 3b 0a 09 09 72 65 74 20 3d 20 30 3b 20 2f 2a 20 ;...ret = 0; /*
2bc0: 52 65 74 75 72 6e 20 30 20 73 75 63 63 65 73 73 Return 0 success
2bd0: 20 61 6e 64 20 2d 31 20 66 6f 72 20 66 61 69 6c and -1 for fail
2be0: 75 72 65 20 2a 2f 0a 09 09 62 72 65 61 6b 3b 0a ure */...break;.
2bf0: 09 63 61 73 65 20 42 49 4f 5f 43 5f 46 49 4c 45 .case BIO_C_FILE
2c00: 5f 54 45 4c 4c 3a 0a 09 09 2f 2a 20 4e 6f 74 20 _TELL:.../* Not
2c10: 75 73 65 64 20 66 6f 72 20 73 6f 63 6b 65 74 73 used for sockets
2c20: 2e 20 54 63 6c 5f 54 65 6c 6c 20 6f 6e 6c 79 20 . Tcl_Tell only
2c30: 77 6f 72 6b 73 20 6f 6e 20 74 6f 70 20 63 68 61 works on top cha
2c40: 6e 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 n. Implements BI
2c50: 4f 5f 74 65 6c 6c 28 29 20 2a 2f 0a 09 09 64 70 O_tell() */...dp
2c60: 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 rintf("Got BIO_C
2c70: 5f 46 49 4c 45 5f 54 45 4c 4c 22 29 3b 0a 09 09 _FILE_TELL");...
2c80: 72 65 74 20 3d 20 30 3b 20 2f 2a 20 52 65 74 75 ret = 0; /* Retu
2c90: 72 6e 20 30 20 73 75 63 63 65 73 73 20 61 6e 64 rn 0 success and
2ca0: 20 2d 31 20 66 6f 72 20 66 61 69 6c 75 72 65 20 -1 for failure
2cb0: 2a 2f 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 */...break;..cas
2cc0: 65 20 42 49 4f 5f 43 5f 53 45 54 5f 46 44 3a 0a e BIO_C_SET_FD:.
2cd0: 09 09 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 73 20 ../* Implements
2ce0: 42 49 4f 5f 73 65 74 5f 66 64 20 2a 2f 0a 09 09 BIO_set_fd */...
2cf0: 64 70 72 69 6e 74 66 28 22 55 6e 73 75 70 70 6f dprintf("Unsuppo
2d00: 72 74 65 64 20 63 61 6c 6c 3a 20 42 49 4f 5f 43 rted call: BIO_C
2d10: 5f 53 45 54 5f 46 44 22 29 3b 0a 09 09 72 65 74 _SET_FD");...ret
2d20: 20 3d 20 2d 31 3b 0a 09 09 62 72 65 61 6b 3b 0a = -1;...break;.
2d30: 09 63 61 73 65 20 42 49 4f 5f 43 5f 47 45 54 5f .case BIO_C_GET_
2d40: 46 44 3a 0a 09 09 2f 2a 20 49 6d 70 6c 65 6d 65 FD:.../* Impleme
2d50: 6e 74 73 20 42 49 4f 5f 67 65 74 5f 66 64 28 29 nts BIO_get_fd()
2d60: 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 55 */...dprintf("U
2d70: 6e 73 75 70 70 6f 72 74 65 64 20 63 61 6c 6c 3a nsupported call:
2d80: 20 42 49 4f 5f 43 5f 47 45 54 5f 46 44 22 29 3b BIO_C_GET_FD");
2d90: 0a 09 09 72 65 74 20 3d 20 2d 31 3b 0a 09 09 62 ...ret = -1;...b
2da0: 72 65 61 6b 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 reak;..#if OPENS
2db0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
2dc0: 52 20 3e 3d 20 30 78 33 30 30 30 30 30 30 30 4c R >= 0x30000000L
2dd0: 20 26 26 20 64 65 66 69 6e 65 64 28 42 49 4f 5f && defined(BIO_
2de0: 43 54 52 4c 5f 47 45 54 5f 4b 54 4c 53 5f 53 45 CTRL_GET_KTLS_SE
2df0: 4e 44 29 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 ND)..case BIO_CT
2e00: 52 4c 5f 47 45 54 5f 4b 54 4c 53 5f 53 45 4e 44 RL_GET_KTLS_SEND
2e10: 3a 0a 09 09 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 :.../* Implement
2e20: 73 20 42 49 4f 5f 67 65 74 5f 6b 74 6c 73 5f 73 s BIO_get_ktls_s
2e30: 65 6e 64 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 end */...dprintf
2e40: 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 47 ("Got BIO_CTRL_G
2e50: 45 54 5f 4b 54 4c 53 5f 53 45 4e 44 22 29 3b 0a ET_KTLS_SEND");.
2e60: 09 09 2f 2a 20 52 65 74 75 72 6e 73 20 31 20 69 ../* Returns 1 i
2e70: 66 20 74 68 65 20 42 49 4f 20 69 73 20 75 73 69 f the BIO is usi
2e80: 6e 67 20 74 68 65 20 4b 65 72 6e 65 6c 20 54 4c ng the Kernel TL
2e90: 53 20 64 61 74 61 2d 70 61 74 68 20 66 6f 72 20 S data-path for
2ea0: 73 65 6e 64 69 6e 67 2c 20 30 20 69 66 20 6e 6f sending, 0 if no
2eb0: 74 20 2a 2f 0a 09 09 72 65 74 20 3d 20 30 3b 0a t */...ret = 0;.
2ec0: 09 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a ..break;.#endif.
2ed0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
2ee0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 ION_NUMBER >= 0x
2ef0: 33 30 30 30 30 30 30 30 4c 20 26 26 20 64 65 66 30000000L && def
2f00: 69 6e 65 64 28 42 49 4f 5f 43 54 52 4c 5f 47 45 ined(BIO_CTRL_GE
2f10: 54 5f 4b 54 4c 53 5f 52 45 43 56 29 0a 09 63 61 T_KTLS_RECV)..ca
2f20: 73 65 20 42 49 4f 5f 43 54 52 4c 5f 47 45 54 5f se BIO_CTRL_GET_
2f30: 4b 54 4c 53 5f 52 45 43 56 3a 0a 09 09 2f 2a 20 KTLS_RECV:.../*
2f40: 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 67 Implements BIO_g
2f50: 65 74 5f 6b 74 6c 73 5f 72 65 63 76 20 2a 2f 0a et_ktls_recv */.
2f60: 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 ..dprintf("Got B
2f70: 49 4f 5f 43 54 52 4c 5f 47 45 54 5f 4b 54 4c 53 IO_CTRL_GET_KTLS
2f80: 5f 52 45 43 56 22 29 3b 0a 09 09 2f 2a 20 52 65 _RECV");.../* Re
2f90: 74 75 72 6e 73 20 31 20 69 66 20 74 68 65 20 42 turns 1 if the B
2fa0: 49 4f 20 69 73 20 75 73 69 6e 67 20 74 68 65 20 IO is using the
2fb0: 4b 65 72 6e 65 6c 20 54 4c 53 20 64 61 74 61 2d Kernel TLS data-
2fc0: 70 61 74 68 20 66 6f 72 20 72 65 63 65 69 76 69 path for receivi
2fd0: 6e 67 2c 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a ng, 0 if not */.
2fe0: 09 09 72 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 ..ret = 0;...bre
2ff0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 ak;.#endif..defa
3000: 75 6c 74 3a 0a 09 09 64 70 72 69 6e 74 66 28 22 ult:...dprintf("
3010: 47 6f 74 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6e 74 Got unknown cont
3020: 72 6f 6c 20 63 6f 6d 6d 61 6e 64 20 28 25 69 29 rol command (%i)
3030: 22 2c 20 63 6d 64 29 3b 0a 09 09 72 65 74 20 3d ", cmd);...ret =
3040: 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a 20 20 20 0;...break;.
3050: 20 7d 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 }. dprintf("
3060: 42 69 6f 43 74 72 6c 20 72 65 74 75 72 6e 20 76 BioCtrl return v
3070: 61 6c 75 65 20 25 6c 69 22 2c 20 72 65 74 29 3b alue %li", ret);
3080: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 74 3b . return ret;
3090: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
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 0a 20 2a 0a 20 2a 20 42 69 6f ------. *. * Bio
30f0: 4e 65 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 New --. *. *.Thi
3100: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 s function is us
3110: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e ed to create a n
3120: 65 77 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 ew instance of t
3130: 68 65 20 42 49 4f 2e 20 54 68 69 73 0a 20 2a 09 he BIO. This. *.
3140: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 function will be
3150: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f called in respo
3160: 6e 73 65 20 74 6f 20 74 68 65 20 61 70 70 6c 69 nse to the appli
3170: 63 61 74 69 6f 6e 20 63 61 6c 6c 69 6e 67 20 74 cation calling t
3180: 68 65 0a 20 2a 09 42 49 4f 5f 6e 65 77 28 29 20 he. *.BIO_new()
3190: 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 function.. *. *
31a0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
31b0: 72 6e 73 20 62 6f 6f 6c 65 61 6e 20 73 75 63 63 rns boolean succ
31c0: 65 73 73 20 72 65 73 75 6c 74 20 28 31 3d 73 75 ess result (1=su
31d0: 63 63 65 73 73 2c 20 30 3d 66 61 69 6c 75 72 65 ccess, 0=failure
31e0: 29 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 ). *. * Side eff
31f0: 65 63 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c ects:. *.Initial
3200: 69 7a 65 73 20 42 49 4f 20 73 74 72 75 63 74 75 izes BIO structu
3210: 72 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d re.. *. *-------
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3260: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
3270: 69 63 20 69 6e 74 20 42 69 6f 4e 65 77 28 42 49 ic int BioNew(BI
3280: 4f 20 2a 62 69 6f 29 20 7b 0a 20 20 20 20 64 70 O *bio) {. dp
3290: 72 69 6e 74 66 28 22 42 69 6f 4e 65 77 28 25 70 rintf("BioNew(%p
32a0: 29 20 63 61 6c 6c 65 64 22 2c 20 62 69 6f 29 3b ) called", bio);
32b0: 0a 0a 20 20 20 20 69 66 20 28 62 69 6f 20 3d 3d .. if (bio ==
32c0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
32d0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 42 0;. }.. B
32e0: 49 4f 5f 73 65 74 5f 64 61 74 61 28 62 69 6f 2c IO_set_data(bio,
32f0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 42 49 4f 5f NULL);. BIO_
3300: 73 65 74 5f 69 6e 69 74 28 62 69 6f 2c 20 30 29 set_init(bio, 0)
3310: 3b 0a 20 20 20 20 42 49 4f 5f 63 6c 65 61 72 5f ;. BIO_clear_
3320: 66 6c 61 67 73 28 62 69 6f 2c 20 2d 31 29 3b 0a flags(bio, -1);.
3330: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a return 1;.}.
3340: 0a 2f 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3390: 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 69 6f 46 72 65 ---. *. * BioFre
33a0: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 e --. *. *.This
33b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 function is used
33c0: 20 74 6f 20 64 65 73 74 72 6f 79 20 61 6e 20 69 to destroy an i
33d0: 6e 73 74 61 6e 63 65 20 6f 66 20 61 20 42 49 4f nstance of a BIO
33e0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a . This function.
33f0: 20 2a 09 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 *.will be calle
3400: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f d in response to
3410: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e the application
3420: 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 42 49 4f calling the BIO
3430: 5f 66 72 65 65 28 29 0a 20 2a 09 66 75 6e 63 74 _free(). *.funct
3440: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
3450: 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 62 ts:. *.Returns b
3460: 6f 6f 6c 65 61 6e 20 73 75 63 63 65 73 73 20 72 oolean success r
3470: 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 esult. *. * Side
3480: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 6e 69 effects:. *.Ini
3490: 74 69 61 6c 69 7a 65 73 20 42 49 4f 20 73 74 72 tializes BIO str
34a0: 75 63 74 75 72 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d ucture.. *. *---
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34d0: 2d 2d 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 0a 20 2a 2f 0a 0a ----------. */..
3500: 73 74 61 74 69 63 20 69 6e 74 20 42 69 6f 46 72 static int BioFr
3510: 65 65 28 42 49 4f 20 2a 62 69 6f 29 20 7b 0a 20 ee(BIO *bio) {.
3520: 20 20 20 64 70 72 69 6e 74 66 28 22 42 69 6f 46 dprintf("BioF
3530: 72 65 65 28 25 70 29 20 63 61 6c 6c 65 64 22 2c ree(%p) called",
3540: 20 62 69 6f 29 3b 0a 0a 20 20 20 20 69 66 20 28 bio);.. if (
3550: 62 69 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 bio == NULL) {..
3560: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a return 0;. }.
3570: 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 66 6c . /* Clear fl
3580: 61 67 73 20 69 66 20 73 65 74 20 74 6f 20 42 49 ags if set to BI
3590: 4f 5f 43 4c 4f 53 45 20 28 63 6c 6f 73 65 20 49 O_CLOSE (close I
35a0: 2f 4f 20 73 74 72 65 61 6d 20 77 68 65 6e 20 74 /O stream when t
35b0: 68 65 20 42 49 4f 20 69 73 20 66 72 65 65 64 29 he BIO is freed)
35c0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 42 49 4f 5f */. if (BIO_
35d0: 67 65 74 5f 73 68 75 74 64 6f 77 6e 28 62 69 6f get_shutdown(bio
35e0: 29 29 20 7b 0a 09 42 49 4f 5f 73 65 74 5f 64 61 )) {..BIO_set_da
35f0: 74 61 28 62 69 6f 2c 20 4e 55 4c 4c 29 3b 0a 09 ta(bio, NULL);..
3600: 42 49 4f 5f 73 65 74 5f 69 6e 69 74 28 62 69 6f BIO_set_init(bio
3610: 2c 20 30 29 3b 0a 09 42 49 4f 5f 63 6c 65 61 72 , 0);..BIO_clear
3620: 5f 66 6c 61 67 73 28 62 69 6f 2c 20 2d 31 29 3b _flags(bio, -1);
3630: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
3640: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d n 1;.}../*. *---
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
36a0: 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 20 2d 2d 0a BIO_new_tcl --.
36b0: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *. *.This funct
36c0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 69 ion is used to i
36d0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 42 49 nitialize the BI
36e0: 4f 20 6d 65 74 68 6f 64 20 68 61 6e 64 6c 65 72 O method handler
36f0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
3700: 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 70 6f 69 :. *.Returns poi
3710: 6e 74 65 72 20 74 6f 20 42 49 4f 20 6f 72 20 4e nter to BIO or N
3720: 55 4c 4c 20 66 6f 72 20 66 61 69 6c 75 72 65 0a ULL for failure.
3730: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
3740: 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a ts:. *.Initializ
3750: 65 73 20 42 49 4f 20 4d 65 74 68 6f 64 73 2e 0a es BIO Methods..
3760: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
37b0: 2d 2d 0a 20 2a 2f 0a 0a 42 49 4f 20 2a 42 49 4f --. */..BIO *BIO
37c0: 5f 6e 65 77 5f 74 63 6c 28 53 74 61 74 65 20 2a _new_tcl(State *
37d0: 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 66 6c statePtr, int fl
37e0: 61 67 73 29 20 7b 0a 20 20 20 20 42 49 4f 20 2a ags) {. BIO *
37f0: 62 69 6f 3b 0a 23 69 66 64 65 66 20 54 43 4c 54 bio;.#ifdef TCLT
3800: 4c 53 5f 53 53 4c 5f 55 53 45 5f 46 41 53 54 50 LS_SSL_USE_FASTP
3810: 41 54 48 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ATH. Tcl_Chan
3820: 6e 65 6c 20 70 61 72 65 6e 74 43 68 61 6e 6e 65 nel parentChanne
3830: 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 54 63 6c l;. const Tcl
3840: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 70 61 _ChannelType *pa
3850: 72 65 6e 74 43 68 61 6e 6e 65 6c 54 79 70 65 3b rentChannelType;
3860: 0a 0a 20 20 20 20 69 6e 74 20 70 61 72 65 6e 74 .. int parent
3870: 43 68 61 6e 6e 65 6c 46 64 49 6e 2c 20 70 61 72 ChannelFdIn, par
3880: 65 6e 74 43 68 61 6e 6e 65 6c 46 64 4f 75 74 2c entChannelFdOut,
3890: 20 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 parentChannelFd
38a0: 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c 69 64 50 ;. int validP
38b0: 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 3b 0a arentChannelFd;.
38c0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 64 70 72 69 #endif.. dpri
38d0: 6e 74 66 28 22 42 49 4f 5f 6e 65 77 5f 74 63 6c ntf("BIO_new_tcl
38e0: 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 () called");..
38f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 75 73 74 /* Create cust
3900: 6f 6d 20 42 49 4f 20 6d 65 74 68 6f 64 20 2a 2f om BIO method */
3910: 0a 20 20 20 20 69 66 20 28 42 69 6f 4d 65 74 68 . if (BioMeth
3920: 6f 64 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ods == NULL) {..
3930: 2f 2a 20 42 49 4f 5f 54 59 50 45 5f 42 49 4f 20 /* BIO_TYPE_BIO
3940: 3d 20 28 31 39 7c 42 49 4f 5f 54 59 50 45 5f 53 = (19|BIO_TYPE_S
3950: 4f 55 52 43 45 5f 53 49 4e 4b 29 20 2d 2d 20 68 OURCE_SINK) -- h
3960: 61 6c 66 20 61 20 42 49 4f 20 70 61 69 72 20 2a alf a BIO pair *
3970: 2f 0a 09 2f 2a 20 42 49 4f 5f 54 59 50 45 5f 43 /../* BIO_TYPE_C
3980: 4f 4e 4e 45 43 54 20 3d 20 28 31 32 7c 42 49 4f ONNECT = (12|BIO
3990: 5f 54 59 50 45 5f 53 4f 55 52 43 45 5f 53 49 4e _TYPE_SOURCE_SIN
39a0: 4b 7c 42 49 4f 5f 54 59 50 45 5f 44 45 53 43 52 K|BIO_TYPE_DESCR
39b0: 49 50 54 4f 52 29 20 2a 2f 0a 09 2f 2a 20 42 49 IPTOR) */../* BI
39c0: 4f 5f 54 59 50 45 5f 41 43 43 45 50 54 20 20 3d O_TYPE_ACCEPT =
39d0: 20 28 31 33 7c 42 49 4f 5f 54 59 50 45 5f 53 4f (13|BIO_TYPE_SO
39e0: 55 52 43 45 5f 53 49 4e 4b 7c 42 49 4f 5f 54 59 URCE_SINK|BIO_TY
39f0: 50 45 5f 44 45 53 43 52 49 50 54 4f 52 29 20 2a PE_DESCRIPTOR) *
3a00: 2f 0a 09 42 69 6f 4d 65 74 68 6f 64 73 20 3d 20 /..BioMethods =
3a10: 42 49 4f 5f 6d 65 74 68 5f 6e 65 77 28 42 49 4f BIO_meth_new(BIO
3a20: 5f 54 59 50 45 5f 42 49 4f 2c 20 22 74 63 6c 22 _TYPE_BIO, "tcl"
3a30: 29 3b 0a 09 69 66 20 28 42 69 6f 4d 65 74 68 6f );..if (BioMetho
3a40: 64 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ds == NULL) {..
3a50: 20 20 20 64 70 72 69 6e 74 66 28 22 4d 65 6d 6f dprintf("Memo
3a60: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 ry allocation er
3a70: 72 6f 72 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 ror");... ret
3a80: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 2f 2a urn NULL;..}../*
3a90: 20 4e 6f 74 20 75 73 65 64 20 42 49 4f 5f 6d 65 Not used BIO_me
3aa0: 74 68 5f 73 65 74 5f 77 72 69 74 65 5f 65 78 20 th_set_write_ex
3ab0: 2a 2f 0a 09 42 49 4f 5f 6d 65 74 68 5f 73 65 74 */..BIO_meth_set
3ac0: 5f 77 72 69 74 65 28 42 69 6f 4d 65 74 68 6f 64 _write(BioMethod
3ad0: 73 2c 20 42 69 6f 4f 75 74 70 75 74 29 3b 0a 09 s, BioOutput);..
3ae0: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 42 49 4f 5f /* Not used BIO_
3af0: 6d 65 74 68 5f 73 65 74 5f 72 65 61 64 5f 65 78 meth_set_read_ex
3b00: 20 2a 2f 0a 09 42 49 4f 5f 6d 65 74 68 5f 73 65 */..BIO_meth_se
3b10: 74 5f 72 65 61 64 28 42 69 6f 4d 65 74 68 6f 64 t_read(BioMethod
3b20: 73 2c 20 42 69 6f 49 6e 70 75 74 29 3b 0a 09 42 s, BioInput);..B
3b30: 49 4f 5f 6d 65 74 68 5f 73 65 74 5f 70 75 74 73 IO_meth_set_puts
3b40: 28 42 69 6f 4d 65 74 68 6f 64 73 2c 20 42 69 6f (BioMethods, Bio
3b50: 50 75 74 73 29 3b 0a 09 42 49 4f 5f 6d 65 74 68 Puts);..BIO_meth
3b60: 5f 73 65 74 5f 63 74 72 6c 28 42 69 6f 4d 65 74 _set_ctrl(BioMet
3b70: 68 6f 64 73 2c 20 42 69 6f 43 74 72 6c 29 3b 0a hods, BioCtrl);.
3b80: 09 42 49 4f 5f 6d 65 74 68 5f 73 65 74 5f 63 72 .BIO_meth_set_cr
3b90: 65 61 74 65 28 42 69 6f 4d 65 74 68 6f 64 73 2c eate(BioMethods,
3ba0: 20 42 69 6f 4e 65 77 29 3b 0a 09 42 49 4f 5f 6d BioNew);..BIO_m
3bb0: 65 74 68 5f 73 65 74 5f 64 65 73 74 72 6f 79 28 eth_set_destroy(
3bc0: 42 69 6f 4d 65 74 68 6f 64 73 2c 20 42 69 6f 46 BioMethods, BioF
3bd0: 72 65 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ree);. }..
3be0: 20 69 66 20 28 73 74 61 74 65 50 74 72 20 3d 3d if (statePtr ==
3bf0: 20 4e 55 4c 4c 29 20 7b 0a 09 64 70 72 69 6e 74 NULL) {..dprint
3c00: 66 28 22 41 73 6b 65 64 20 74 6f 20 73 65 74 75 f("Asked to setu
3c10: 70 20 61 20 4e 55 4c 4c 20 73 74 61 74 65 2c 20 p a NULL state,
3c20: 6a 75 73 74 20 63 72 65 61 74 69 6e 67 20 74 68 just creating th
3c30: 65 20 69 6e 69 74 69 61 6c 20 63 6f 6e 66 69 67 e initial config
3c40: 75 72 61 74 69 6f 6e 22 29 3b 0a 0a 09 72 65 74 uration");...ret
3c50: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
3c60: 0a 23 69 66 64 65 66 20 54 43 4c 54 4c 53 5f 53 .#ifdef TCLTLS_S
3c70: 53 4c 5f 55 53 45 5f 46 41 53 54 50 41 54 48 0a SL_USE_FASTPATH.
3c80: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 /*. * If
3c90: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 63 61 6e the channel can
3ca0: 20 62 65 20 6d 61 70 70 65 64 20 62 61 63 6b 20 be mapped back
3cb0: 74 6f 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 to a file descri
3cc0: 70 74 6f 72 2c 20 6a 75 73 74 20 75 73 65 20 74 ptor, just use t
3cd0: 68 65 20 66 69 6c 65 0a 20 20 20 20 20 2a 20 64 he file. * d
3ce0: 65 73 63 72 69 70 74 6f 72 20 77 69 74 68 20 74 escriptor with t
3cf0: 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 20 73 he SSL library s
3d00: 69 6e 63 65 20 69 74 20 77 69 6c 6c 20 6c 69 6b ince it will lik
3d10: 65 6c 79 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 ely be optimized
3d20: 20 66 6f 72 20 74 68 69 73 2e 0a 20 20 20 20 20 for this..
3d30: 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 43 68 61 */. parentCha
3d40: 6e 6e 65 6c 20 3d 20 54 6c 73 5f 47 65 74 50 61 nnel = Tls_GetPa
3d50: 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 30 rent(statePtr, 0
3d60: 29 3b 0a 20 20 20 20 70 61 72 65 6e 74 43 68 61 );. parentCha
3d70: 6e 6e 65 6c 54 79 70 65 20 3d 20 54 63 6c 5f 47 nnelType = Tcl_G
3d80: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 etChannelType(pa
3d90: 72 65 6e 74 43 68 61 6e 6e 65 6c 29 3b 0a 0a 20 rentChannel);..
3da0: 20 20 20 76 61 6c 69 64 50 61 72 65 6e 74 43 68 validParentCh
3db0: 61 6e 6e 65 6c 46 64 20 3d 20 30 3b 0a 20 20 20 annelFd = 0;.
3dc0: 20 69 66 20 28 73 74 72 63 6d 70 28 70 61 72 65 if (strcmp(pare
3dd0: 6e 74 43 68 61 6e 6e 65 6c 54 79 70 65 2d 3e 74 ntChannelType->t
3de0: 79 70 65 4e 61 6d 65 2c 20 22 74 63 70 22 29 20 ypeName, "tcp")
3df0: 3d 3d 20 30 29 20 7b 0a 09 76 6f 69 64 20 2a 70 == 0) {..void *p
3e00: 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 49 6e arentChannelFdIn
3e10: 5f 70 2c 20 2a 70 61 72 65 6e 74 43 68 61 6e 6e _p, *parentChann
3e20: 65 6c 46 64 4f 75 74 5f 70 3b 0a 09 69 6e 74 20 elFdOut_p;..int
3e30: 74 63 6c 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e tclGetChannelHan
3e40: 64 6c 65 52 65 74 3b 0a 0a 09 74 63 6c 47 65 74 dleRet;...tclGet
3e50: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 52 65 74 ChannelHandleRet
3e60: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
3e70: 6c 48 61 6e 64 6c 65 28 70 61 72 65 6e 74 43 68 lHandle(parentCh
3e80: 61 6e 6e 65 6c 2c 0a 09 20 20 20 20 54 43 4c 5f annel,.. TCL_
3e90: 52 45 41 44 41 42 4c 45 2c 20 26 70 61 72 65 6e READABLE, &paren
3ea0: 74 43 68 61 6e 6e 65 6c 46 64 49 6e 5f 70 29 3b tChannelFdIn_p);
3eb0: 0a 09 69 66 20 28 74 63 6c 47 65 74 43 68 61 6e ..if (tclGetChan
3ec0: 6e 65 6c 48 61 6e 64 6c 65 52 65 74 20 3d 3d 20 nelHandleRet ==
3ed0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 74 TCL_OK) {.. t
3ee0: 63 6c 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 clGetChannelHand
3ef0: 6c 65 52 65 74 20 3d 20 54 63 6c 5f 47 65 74 43 leRet = Tcl_GetC
3f00: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 61 72 hannelHandle(par
3f10: 65 6e 74 43 68 61 6e 6e 65 6c 2c 0a 09 20 20 20 entChannel,..
3f20: 20 20 20 20 20 54 43 4c 5f 57 52 49 54 41 42 4c TCL_WRITABL
3f30: 45 2c 20 26 70 61 72 65 6e 74 43 68 61 6e 6e 65 E, &parentChanne
3f40: 6c 46 64 4f 75 74 5f 70 29 3b 0a 09 20 20 20 20 lFdOut_p);..
3f50: 69 66 20 28 74 63 6c 47 65 74 43 68 61 6e 6e 65 if (tclGetChanne
3f60: 6c 48 61 6e 64 6c 65 52 65 74 20 3d 3d 20 54 43 lHandleRet == TC
3f70: 4c 5f 4f 4b 29 20 7b 0a 09 09 70 61 72 65 6e 74 L_OK) {...parent
3f80: 43 68 61 6e 6e 65 6c 46 64 49 6e 20 3d 20 50 54 ChannelFdIn = PT
3f90: 52 32 49 4e 54 28 70 61 72 65 6e 74 43 68 61 6e R2INT(parentChan
3fa0: 6e 65 6c 46 64 49 6e 5f 70 29 3b 0a 09 09 70 61 nelFdIn_p);...pa
3fb0: 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 4f 75 74 rentChannelFdOut
3fc0: 20 3d 20 50 54 52 32 49 4e 54 28 70 61 72 65 6e = PTR2INT(paren
3fd0: 74 43 68 61 6e 6e 65 6c 46 64 4f 75 74 5f 70 29 tChannelFdOut_p)
3fe0: 3b 0a 09 09 69 66 20 28 70 61 72 65 6e 74 43 68 ;...if (parentCh
3ff0: 61 6e 6e 65 6c 46 64 49 6e 20 3d 3d 20 70 61 72 annelFdIn == par
4000: 65 6e 74 43 68 61 6e 6e 65 6c 46 64 4f 75 74 29 entChannelFdOut)
4010: 20 7b 0a 09 09 20 20 20 20 70 61 72 65 6e 74 43 {... parentC
4020: 68 61 6e 6e 65 6c 46 64 20 3d 20 70 61 72 65 6e hannelFd = paren
4030: 74 43 68 61 6e 6e 65 6c 46 64 49 6e 3b 0a 09 09 tChannelFdIn;...
4040: 20 20 20 20 76 61 6c 69 64 50 61 72 65 6e 74 43 validParentC
4050: 68 61 6e 6e 65 6c 46 64 20 3d 20 31 3b 0a 09 09 hannelFd = 1;...
4060: 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 }.. }..}.
4070: 7d 0a 0a 20 20 20 20 69 66 20 28 76 61 6c 69 64 }.. if (valid
4080: 50 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 29 ParentChannelFd)
4090: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 57 65 20 {..dprintf("We
40a0: 66 6f 75 6e 64 20 61 20 73 68 6f 72 74 63 75 74 found a shortcut
40b0: 2c 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 20 69 , this channel i
40c0: 73 20 62 61 63 6b 65 64 20 62 79 20 61 20 73 6f s backed by a so
40d0: 63 6b 65 74 3a 20 25 69 22 2c 0a 09 20 20 20 20 cket: %i",..
40e0: 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 49 parentChannelFdI
40f0: 6e 29 3b 0a 09 62 69 6f 20 3d 20 42 49 4f 5f 6e n);..bio = BIO_n
4100: 65 77 5f 73 6f 63 6b 65 74 28 70 61 72 65 6e 74 ew_socket(parent
4110: 43 68 61 6e 6e 65 6c 46 64 2c 20 66 6c 61 67 73 ChannelFd, flags
4120: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c );..statePtr->fl
4130: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 46 ags |= TLS_TCL_F
4140: 41 53 54 50 41 54 48 3b 0a 09 42 49 4f 5f 73 65 ASTPATH;..BIO_se
4150: 74 5f 64 61 74 61 28 62 69 6f 2c 20 73 74 61 74 t_data(bio, stat
4160: 65 50 74 72 29 3b 0a 09 42 49 4f 5f 73 65 74 5f ePtr);..BIO_set_
4170: 73 68 75 74 64 6f 77 6e 28 62 69 6f 2c 20 66 6c shutdown(bio, fl
4180: 61 67 73 29 3b 0a 09 42 49 4f 5f 73 65 74 5f 69 ags);..BIO_set_i
4190: 6e 69 74 28 62 69 6f 2c 20 31 29 3b 0a 09 72 65 nit(bio, 1);..re
41a0: 74 75 72 6e 20 62 69 6f 3b 0a 20 20 20 20 7d 0a turn bio;. }.
41b0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 64 70 72 69 #endif.. dpri
41c0: 6e 74 66 28 22 46 61 6c 6c 69 6e 67 20 62 61 63 ntf("Falling bac
41d0: 6b 20 74 6f 20 54 63 6c 20 49 2f 4f 20 66 6f 72 k to Tcl I/O for
41e0: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 22 29 3b this channel");
41f0: 0a 0a 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f .. bio = BIO_
4200: 6e 65 77 28 42 69 6f 4d 65 74 68 6f 64 73 29 3b new(BioMethods);
4210: 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 64 61 74 . BIO_set_dat
4220: 61 28 62 69 6f 2c 20 73 74 61 74 65 50 74 72 29 a(bio, statePtr)
4230: 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 68 ;. BIO_set_sh
4240: 75 74 64 6f 77 6e 28 62 69 6f 2c 20 66 6c 61 67 utdown(bio, flag
4250: 73 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f s);. BIO_set_
4260: 69 6e 69 74 28 62 69 6f 2c 20 31 29 3b 20 2f 2a init(bio, 1); /*
4270: 20 45 6e 61 62 6c 65 20 72 65 61 64 20 26 20 77 Enable read & w
4280: 72 69 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 rite */. retu
4290: 72 6e 20 62 69 6f 3b 0a 7d 0a 0a 2f 2a 0a 20 2a rn bio;.}../*. *
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
42f0: 0a 20 2a 20 42 49 4f 5f 63 6c 65 61 6e 75 70 20 . * BIO_cleanup
4300: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 --. *. *.This fu
4310: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 nction is used t
4320: 6f 20 64 65 73 74 72 6f 79 20 61 20 42 49 4f 5f o destroy a BIO_
4330: 4d 45 54 48 4f 44 20 73 74 72 75 63 74 75 72 65 METHOD structure
4340: 20 61 6e 64 20 66 72 65 65 20 75 70 20 61 6e 79 and free up any
4350: 0a 20 2a 09 6d 65 6d 6f 72 79 20 61 73 73 6f 63 . *.memory assoc
4360: 69 61 74 65 64 20 77 69 74 68 20 69 74 2e 0a 20 iated with it..
4370: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
4380: 09 53 74 61 6e 64 61 72 64 20 54 43 4c 20 72 65 .Standard TCL re
4390: 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 sult. *. * Side
43a0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 73 74 effects:. *.Dest
43b0: 72 6f 79 73 20 42 49 4f 20 4d 65 74 68 6f 64 73 roys BIO Methods
43c0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4410: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 20 42 49 ----. */..int BI
4420: 4f 5f 63 6c 65 61 6e 75 70 20 28 29 20 7b 0a 20 O_cleanup () {.
4430: 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f dprintf("BIO_
4440: 63 6c 65 61 6e 75 70 28 29 20 63 61 6c 6c 65 64 cleanup() called
4450: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 42 69 6f ");.. if (Bio
4460: 4d 65 74 68 6f 64 73 20 21 3d 20 4e 55 4c 4c 29 Methods != NULL)
4470: 20 7b 0a 09 42 49 4f 5f 6d 65 74 68 5f 66 72 65 {..BIO_meth_fre
4480: 65 28 42 69 6f 4d 65 74 68 6f 64 73 29 3b 0a 09 e(BioMethods);..
4490: 42 69 6f 4d 65 74 68 6f 64 73 20 3d 20 4e 55 4c BioMethods = NUL
44a0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 L;. }. ret
44b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a urn TCL_OK;.}.