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 2d 32 30 32 35 20 42 72 69 61 6e 20 2024-2025 Brian
00f0: 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a 2f 0a 0a O'Hagan. *. */..
0100: 2f 2a 0a 4e 6f 72 6d 61 6c 0a 09 09 74 6c 73 42 /*.Normal...tlsB
0110: 49 4f 2e 63 09 09 09 74 6c 73 49 4f 2e 63 0a 20 IO.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 2d 2d 2b 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 20 20 2b 2d 2d 2d 2b 0a 20 7c +---+. |
0170: 20 20 20 20 20 20 7c 54 63 6c 5f 57 72 69 74 65 |Tcl_Write
0180: 52 61 77 3c 2d 2d 42 69 6f 4f 75 74 70 75 74 7c Raw<--BioOutput|
0190: 20 53 53 4c 20 7c 42 49 4f 5f 77 72 69 74 65 3c SSL |BIO_write<
01a0: 2d 2d 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 --TlsOutputProc
01b0: 3c 2d 2d 70 75 74 73 7c 20 20 20 7c 0a 20 7c 73 <--puts| |. |s
01c0: 6f 63 6b 65 74 7c 20 20 20 20 20 20 3c 65 6e 63 ocket| <enc
01d0: 72 79 70 74 65 64 3e 20 20 20 20 20 20 20 7c 20 rypted> |
01e0: 42 49 4f 20 7c 20 20 20 20 20 20 20 20 20 20 20 BIO |
01f0: 20 3c 75 6e 65 6e 63 72 79 70 74 65 64 3e 20 20 <unencrypted>
0200: 20 20 20 20 20 20 7c 41 70 70 7c 0a 20 7c 20 20 |App|. |
0210: 20 20 20 20 7c 54 63 6c 5f 52 65 61 64 52 61 77 |Tcl_ReadRaw
0220: 20 2d 2d 3e 20 42 69 6f 49 6e 70 75 74 7c 20 20 --> BioInput|
0230: 20 20 20 7c 42 49 4f 5f 52 65 61 64 20 2d 2d 3e |BIO_Read -->
0240: 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d 2d 3e TlsInputProc -->
0250: 20 72 65 61 64 7c 20 20 20 7c 0a 20 2b 2d 2d 2d read| |. +---
0260: 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20 ---+
0270: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d +---
0280: 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 --+
0290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
02a0: 20 20 20 20 2b 2d 2d 2d 2b 0a 0a 0a 46 61 73 74 +---+...Fast
02b0: 20 50 61 74 68 0a 09 09 09 09 09 09 74 6c 73 49 Path.......tlsI
02c0: 4f 2e 63 0a 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 O.c. +------+
02d0: 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d +----
02e0: 2d 2b 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: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2b 0a 20 20 +-----+.
0310: 7c 20 20 20 20 20 20 7c 3c 2d 2d 20 77 72 69 74 | |<-- writ
0320: 65 20 3c 2d 2d 7c 20 53 53 4c 20 7c 42 49 4f 5f e <--| SSL |BIO_
0330: 77 72 69 74 65 20 3c 2d 2d 20 54 6c 73 4f 75 74 write <-- TlsOut
0340: 70 75 74 50 72 6f 63 20 3c 2d 2d 20 70 75 74 73 putProc <-- puts
0350: 7c 20 20 20 20 20 7c 0a 20 20 7c 73 6f 63 6b 65 | |. |socke
0360: 74 7c 20 3c 65 6e 63 72 79 70 74 65 64 3e 20 7c t| <encrypted> |
0370: 20 42 49 4f 20 7c 20 20 20 20 20 20 20 20 20 20 BIO |
0380: 20 20 3c 75 6e 65 6e 63 72 79 70 74 65 64 3e 20 <unencrypted>
0390: 20 20 20 20 20 20 20 20 20 20 7c 20 41 70 70 20 | App
03a0: 7c 0a 20 20 7c 20 20 20 20 20 20 7c 2d 2d 3e 20 |. | |-->
03b0: 20 72 65 61 64 20 2d 2d 3e 7c 20 20 20 20 20 7c read -->| |
03c0: 42 49 4f 5f 52 65 61 64 20 20 2d 2d 3e 20 54 6c BIO_Read --> Tl
03d0: 73 49 6e 70 75 74 50 72 6f 63 20 2d 2d 3e 20 20 sInputProc -->
03e0: 72 65 61 64 7c 20 20 20 20 20 7c 0a 20 20 2b 2d read| |. +-
03f0: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 -----+
0400: 20 20 20 2b 2d 2d 2d 2d 2d 2b 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 20 20 2b 2d +-
0430: 2d 2d 2d 2d 2b 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 ----+.*/..#inclu
0440: 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 de "tlsInt.h".#i
0450: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f nclude <openssl/
0460: 62 69 6f 2e 68 3e 0a 0a 2f 2a 20 44 65 66 69 6e bio.h>../* Defin
0470: 65 20 42 49 4f 20 6d 65 74 68 6f 64 73 20 73 74 e BIO methods st
0480: 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 61 74 69 ructure */.stati
0490: 63 20 42 49 4f 5f 4d 45 54 48 4f 44 20 2a 42 69 c BIO_METHOD *Bi
04a0: 6f 4d 65 74 68 6f 64 73 20 3d 20 4e 55 4c 4c 3b oMethods = NULL;
04b0: 0a 0a 0a 0a 2f 2a 0a 20 2a 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 2d 2d 0a 20 2a 0a 20 2a 20 42 49 4f ------. *. * BIO
0510: 53 68 6f 75 6c 64 52 65 74 72 79 20 2d 2d 0a 20 ShouldRetry --.
0520: 2a 0a 20 2a 09 44 65 74 65 72 6d 69 6e 65 20 69 *. *.Determine i
0530: 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 73 f an operation s
0540: 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 hould be retried
0550: 20 66 6f 72 20 6e 6f 6e 2d 66 61 74 61 6c 20 65 for non-fatal e
0560: 72 72 6f 72 73 20 61 66 74 65 72 0a 20 2a 09 6e rrors after. *.n
0570: 65 78 74 20 73 65 6c 65 63 74 2f 28 65 29 70 6f ext select/(e)po
0580: 6c 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 ll.. *. * Result
0590: 73 3a 0a 20 2a 09 31 20 3d 20 72 65 74 72 79 2c s:. *.1 = retry,
05a0: 20 30 20 3d 20 6e 6f 20 72 65 74 72 79 0a 20 2a 0 = no retry. *
05b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
05c0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 :. *.None. *. *
05d0: 4e 6f 74 65 73 3a 0a 20 2a 09 57 65 20 63 68 65 Notes:. *.We che
05e0: 63 6b 20 74 68 65 20 73 61 6d 65 20 63 6f 64 65 ck the same code
05f0: 73 20 61 73 20 42 49 4f 5f 73 6f 63 6b 5f 73 68 s as BIO_sock_sh
0600: 6f 75 6c 64 5f 72 65 74 72 79 20 61 6e 64 0a 20 ould_retry and.
0610: 2a 09 42 49 4f 5f 73 6f 63 6b 5f 6e 6f 6e 5f 66 *.BIO_sock_non_f
0620: 61 74 61 6c 5f 65 72 72 6f 72 20 28 45 57 4f 55 atal_error (EWOU
0630: 4c 44 42 4c 4f 43 4b 2c 20 45 4e 4f 54 43 4f 4e LDBLOCK, ENOTCON
0640: 4e 2c 20 45 49 4e 54 52 2c 20 45 41 47 41 49 4e N, EINTR, EAGAIN
0650: 2c 20 45 50 52 4f 54 4f 2c 0a 20 2a 09 45 49 4e , EPROTO,. *.EIN
0660: 50 52 4f 47 52 45 53 53 2c 20 61 6e 64 20 45 41 PROGRESS, and EA
0670: 4c 52 45 41 44 59 29 20 65 78 63 65 70 74 20 66 LREADY) except f
0680: 6f 72 20 45 4e 4f 54 43 4f 4e 4e 2e 20 4e 65 77 or ENOTCONN. New
0690: 65 72 20 46 72 65 65 42 53 44 73 20 72 65 74 75 er FreeBSDs retu
06a0: 72 6e 0a 20 2a 09 45 4e 4f 54 43 4f 4e 4e 20 69 rn. *.ENOTCONN i
06b0: 6e 73 74 65 61 64 20 6f 66 20 45 41 47 41 49 4e nstead of EAGAIN
06c0: 2f 45 57 4f 55 4c 44 42 4c 4f 43 4b 20 77 68 65 /EWOULDBLOCK whe
06d0: 6e 20 74 72 79 69 6e 67 20 74 6f 20 73 65 6e 64 n trying to send
06e0: 20 6f 6e 20 61 0a 20 2a 09 6e 6f 6e 2d 62 6c 6f on a. *.non-blo
06f0: 63 6b 69 6e 67 20 73 6f 63 6b 65 74 20 77 68 69 cking socket whi
0700: 63 68 20 69 73 20 6e 6f 74 20 79 65 74 20 66 75 ch is not yet fu
0710: 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 2e 20 57 lly connected. W
0720: 68 69 6c 65 20 54 43 4c 20 63 6f 72 65 0a 20 2a hile TCL core. *
0730: 09 75 73 65 73 20 45 57 4f 55 4c 44 42 4c 4f 43 .uses EWOULDBLOC
0740: 4b 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 K if the connect
0750: 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 70 72 6f is still in pro
0760: 67 72 65 73 73 2c 20 69 74 20 75 73 65 73 20 45 gress, it uses E
0770: 4e 4f 54 43 4f 4e 4e 0a 20 2a 09 69 66 20 69 74 NOTCONN. *.if it
0780: 20 66 61 69 6c 65 64 2e 20 53 6f 20 77 65 20 73 failed. So we s
0790: 6b 69 70 20 69 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d kip it.. *. *---
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
07f0: 73 74 61 74 69 63 20 69 6e 74 20 42 49 4f 53 68 static int BIOSh
0800: 6f 75 6c 64 52 65 74 72 79 28 69 6e 74 20 63 6f ouldRetry(int co
0810: 64 65 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 65 de) {. int re
0820: 73 20 3d 20 30 3b 0a 20 20 20 20 64 70 72 69 6e s = 0;. dprin
0830: 74 66 28 22 42 49 4f 53 68 6f 75 6c 64 52 65 74 tf("BIOShouldRet
0840: 72 79 20 25 64 3d 25 73 22 2c 20 63 6f 64 65 2c ry %d=%s", code,
0850: 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 63 6f Tcl_ErrnoMsg(co
0860: 64 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 de));.. /* Ch
0870: 65 63 6b 20 66 6f 72 20 6e 6f 6e 2d 62 6c 6f 63 eck for non-bloc
0880: 6b 69 6e 67 20 72 65 74 72 79 2d 61 62 6c 65 20 king retry-able
0890: 65 72 72 6f 72 20 63 6f 64 65 73 2c 20 62 75 74 error codes, but
08a0: 20 73 6b 69 70 20 45 4e 4f 54 43 4f 4e 4e 20 2a skip ENOTCONN *
08b0: 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d /. if (code =
08c0: 3d 20 45 57 4f 55 4c 44 42 4c 4f 43 4b 20 7c 7c = EWOULDBLOCK ||
08d0: 20 63 6f 64 65 20 3d 3d 20 45 49 4e 50 52 4f 47 code == EINPROG
08e0: 52 45 53 53 20 7c 7c 20 63 6f 64 65 20 3d 3d 20 RESS || code ==
08f0: 45 41 4c 52 45 41 44 59 20 7c 7c 20 0a 09 63 6f EALREADY || ..co
0900: 64 65 20 3d 3d 20 45 41 47 41 49 4e 20 7c 7c 20 de == EAGAIN ||
0910: 63 6f 64 65 20 3d 3d 20 45 50 52 4f 54 4f 20 7c code == EPROTO |
0920: 7c 20 63 6f 64 65 20 3d 3d 20 45 49 4e 54 52 29 | code == EINTR)
0930: 20 7b 0a 09 72 65 73 20 3d 20 31 3b 0a 20 20 20 {..res = 1;.
0940: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
0950: 22 42 49 4f 53 68 6f 75 6c 64 52 65 74 72 79 20 "BIOShouldRetry
0960: 25 64 3d 25 73 2c 20 72 65 74 72 79 3d 25 64 22 %d=%s, retry=%d"
0970: 2c 20 63 6f 64 65 2c 20 54 63 6c 5f 45 72 72 6e , code, Tcl_Errn
0980: 6f 4d 73 67 28 63 6f 64 65 29 2c 20 72 65 73 29 oMsg(code), res)
0990: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 ;.. return re
09a0: 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d s;.}../*. *-----
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 0a 20 2a 0a 20 2a 20 42 --------. *. * B
0a00: 69 6f 4f 75 74 70 75 74 20 2d 2d 0a 20 2a 0a 20 ioOutput --. *.
0a10: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
0a20: 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 65 is used to get e
0a30: 6e 63 72 79 70 74 65 64 20 64 61 74 61 20 66 72 ncrypted data fr
0a40: 6f 6d 20 74 68 65 20 42 49 4f 20 69 6e 20 62 75 om the BIO in bu
0a50: 66 20 61 6e 64 0a 20 2a 09 77 72 69 74 65 20 69 f and. *.write i
0a60: 74 20 74 6f 20 74 68 65 20 63 68 61 6e 6e 65 6c t to the channel
0a70: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 . This function
0a80: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 69 will be called i
0a90: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 0a 20 2a n response to. *
0aa0: 09 74 68 65 20 74 6c 73 49 4f 20 63 61 6c 6c 69 .the tlsIO calli
0ab0: 6e 67 20 74 68 65 20 42 49 4f 5f 77 72 69 74 65 ng the BIO_write
0ac0: 5f 65 78 28 29 20 6f 72 20 42 49 4f 5f 77 72 69 _ex() or BIO_wri
0ad0: 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a te() functions..
0ae0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
0af0: 2a 09 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75 *.Returns the nu
0b00: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 mber of bytes wr
0b10: 69 74 74 65 6e 20 74 6f 20 63 68 61 6e 6e 65 6c itten to channel
0b20: 2c 20 30 20 66 6f 72 20 45 4f 46 2c 20 6f 72 20 , 0 for EOF, or
0b30: 2d 31 20 66 6f 72 0a 20 2a 09 65 72 72 6f 72 2e -1 for. *.error.
0b40: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
0b50: 63 74 73 3a 0a 20 2a 09 57 72 69 74 65 73 20 42 cts:. *.Writes B
0b60: 49 4f 20 64 61 74 61 20 74 6f 20 63 68 61 6e 6e IO data to chann
0b70: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
0b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bc0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
0bd0: 69 63 20 69 6e 74 20 42 69 6f 4f 75 74 70 75 74 ic int BioOutput
0be0: 28 42 49 4f 20 2a 62 69 6f 2c 20 63 6f 6e 73 74 (BIO *bio, const
0bf0: 20 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 char *buf, int
0c00: 62 75 66 4c 65 6e 29 20 7b 0a 20 20 20 20 54 63 bufLen) {. Tc
0c10: 6c 5f 53 69 7a 65 20 72 65 74 3b 0a 20 20 20 20 l_Size ret;.
0c20: 69 6e 74 20 69 73 5f 65 6f 66 2c 20 74 63 6c 45 int is_eof, tclE
0c30: 72 72 6e 6f 3b 0a 20 20 20 20 53 74 61 74 65 20 rrno;. State
0c40: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
0c50: 74 65 20 2a 29 20 42 49 4f 5f 67 65 74 5f 64 61 te *) BIO_get_da
0c60: 74 61 28 62 69 6f 29 3b 0a 20 20 20 20 54 63 6c ta(bio);. Tcl
0c70: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 20 3d 20 _Channel chan =
0c80: 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 Tls_GetParent(st
0c90: 61 74 65 50 74 72 2c 20 30 29 3b 0a 0a 20 20 20 atePtr, 0);..
0ca0: 20 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d dprintf("[chan=
0cb0: 25 70 5d 20 42 69 6f 4f 75 74 70 75 74 28 62 69 %p] BioOutput(bi
0cc0: 6f 3d 25 70 2c 20 62 75 66 3d 25 70 2c 20 6c 65 o=%p, buf=%p, le
0cd0: 6e 3d 25 64 29 22 2c 20 28 76 6f 69 64 20 2a 29 n=%d)", (void *)
0ce0: 63 68 61 6e 2c 0a 09 28 76 6f 69 64 20 2a 29 20 chan,..(void *)
0cf0: 62 69 6f 2c 20 62 75 66 2c 20 62 75 66 4c 65 6e bio, buf, bufLen
0d00: 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f );.. if (Tcl_
0d10: 45 6f 66 28 63 68 61 6e 29 29 20 7b 0a 09 72 65 Eof(chan)) {..re
0d20: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 turn 0;. }..
0d30: 20 20 20 42 49 4f 5f 63 6c 65 61 72 5f 72 65 74 BIO_clear_ret
0d40: 72 79 5f 66 6c 61 67 73 28 62 69 6f 29 3b 0a 20 ry_flags(bio);.
0d50: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 Tcl_SetErrno(
0d60: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 0);.. /* Writ
0d70: 65 20 64 61 74 61 20 74 6f 20 75 6e 64 65 72 6c e data to underl
0d80: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a ying channel */.
0d90: 20 20 20 20 72 65 74 20 3d 20 54 63 6c 5f 57 72 ret = Tcl_Wr
0da0: 69 74 65 52 61 77 28 63 68 61 6e 2c 20 62 75 66 iteRaw(chan, buf
0db0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 62 75 66 , (Tcl_Size) buf
0dc0: 4c 65 6e 29 3b 0a 20 20 20 20 69 73 5f 65 6f 66 Len);. is_eof
0dd0: 20 3d 20 54 63 6c 5f 45 6f 66 28 63 68 61 6e 29 = Tcl_Eof(chan)
0de0: 3b 0a 20 20 20 20 74 63 6c 45 72 72 6e 6f 20 3d ;. tclErrno =
0df0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b Tcl_GetErrno();
0e00: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 5b .. dprintf("[
0e10: 63 68 61 6e 3d 25 70 5d 20 42 69 6f 4f 75 74 70 chan=%p] BioOutp
0e20: 75 74 28 25 64 29 20 2d 3e 20 25 22 20 54 43 4c ut(%d) -> %" TCL
0e30: 5f 53 49 5a 45 5f 4d 4f 44 49 46 49 45 52 20 22 _SIZE_MODIFIER "
0e40: 64 20 5b 74 63 6c 45 6f 66 3d 25 64 3b 20 74 63 d [tclEof=%d; tc
0e50: 6c 45 72 72 6e 6f 3d 25 64 3a 20 25 73 5d 22 2c lErrno=%d: %s]",
0e60: 0a 09 28 76 6f 69 64 20 2a 29 20 63 68 61 6e 2c ..(void *) chan,
0e70: 20 62 75 66 4c 65 6e 2c 20 72 65 74 2c 20 69 73 bufLen, ret, is
0e80: 5f 65 6f 66 2c 20 74 63 6c 45 72 72 6e 6f 2c 20 _eof, tclErrno,
0e90: 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 74 63 6c Tcl_ErrnoMsg(tcl
0ea0: 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 20 20 69 66 Errno));.. if
0eb0: 20 28 72 65 74 20 3e 20 30 29 20 7b 0a 09 64 70 (ret > 0) {..dp
0ec0: 72 69 6e 74 66 28 22 53 75 63 63 65 73 73 66 75 rintf("Successfu
0ed0: 6c 6c 79 20 77 72 6f 74 65 20 25 22 20 54 43 4c lly wrote %" TCL
0ee0: 5f 53 49 5a 45 5f 4d 4f 44 49 46 49 45 52 20 22 _SIZE_MODIFIER "
0ef0: 64 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 22 d bytes of data"
0f00: 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 7d 20 65 , ret);.. } e
0f10: 6c 73 65 20 69 66 20 28 72 65 74 20 3d 3d 20 30 lse if (ret == 0
0f20: 29 20 7b 0a 09 69 66 20 28 69 73 5f 65 6f 66 29 ) {..if (is_eof)
0f30: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
0f40: 22 47 6f 74 20 45 4f 46 20 77 68 69 6c 65 20 77 "Got EOF while w
0f50: 72 69 74 69 6e 67 2c 20 72 65 74 75 72 6e 69 6e riting, returnin
0f60: 67 20 61 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 52 g a Connection R
0f70: 65 73 65 74 20 65 72 72 6f 72 20 77 68 69 63 68 eset error which
0f80: 20 6d 61 70 73 20 74 6f 20 53 6f 66 74 20 45 4f maps to Soft EO
0f90: 46 22 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 F");.. Tcl_Se
0fa0: 74 45 72 72 6e 6f 28 45 43 4f 4e 4e 52 45 53 45 tErrno(ECONNRESE
0fb0: 54 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 T);.. BIO_set
0fc0: 5f 66 6c 61 67 73 28 62 69 6f 2c 20 42 49 4f 5f _flags(bio, BIO_
0fd0: 46 4c 41 47 53 5f 49 4e 5f 45 4f 46 29 3b 0a 0a FLAGS_IN_EOF);..
0fe0: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 .} else {.. d
0ff0: 70 72 69 6e 74 66 28 22 47 6f 74 20 30 20 66 72 printf("Got 0 fr
1000: 6f 6d 20 54 63 6c 5f 57 72 69 74 65 52 61 77 2c om Tcl_WriteRaw,
1010: 20 61 6e 64 20 45 4f 46 20 69 73 20 6e 6f 74 20 and EOF is not
1020: 73 65 74 3b 20 72 65 74 20 3d 20 30 22 29 3b 0a set; ret = 0");.
1030: 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 . BIO_set_ret
1040: 72 79 5f 77 72 69 74 65 28 62 69 6f 29 3b 0a 0a ry_write(bio);..
1050: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 65 . dprintf("Se
1060: 74 74 69 6e 67 20 72 65 74 72 79 20 72 65 61 64 tting retry read
1070: 20 66 6c 61 67 22 29 3b 0a 09 20 20 20 20 42 49 flag");.. BI
1080: 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 61 64 O_set_retry_read
1090: 28 62 69 6f 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d (bio);..}.. }
10a0: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 50 49 50 else {../* EPIP
10b0: 45 20 6f 72 20 45 43 4f 4e 4e 52 45 53 45 54 20 E or ECONNRESET
10c0: 6d 65 61 6e 20 70 65 65 72 20 69 73 20 67 6f 6e mean peer is gon
10d0: 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 57 e */..dprintf("W
10e0: 65 20 67 6f 74 20 73 6f 6d 65 20 6b 69 6e 64 20 e got some kind
10f0: 6f 66 20 49 2f 4f 20 65 72 72 6f 72 22 29 3b 0a of I/O error");.
1100: 0a 09 69 66 20 28 42 49 4f 53 68 6f 75 6c 64 52 ..if (BIOShouldR
1110: 65 74 72 79 28 74 63 6c 45 72 72 6e 6f 29 29 20 etry(tclErrno))
1120: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
1130: 54 72 79 20 61 67 61 69 6e 20 66 6f 72 3a 20 25 Try again for: %
1140: 69 3d 25 73 22 2c 20 74 63 6c 45 72 72 6e 6f 2c i=%s", tclErrno,
1150: 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 74 63 Tcl_ErrnoMsg(tc
1160: 6c 45 72 72 6e 6f 29 29 3b 0a 09 20 20 20 20 42 lErrno));.. B
1170: 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 77 72 69 IO_set_retry_wri
1180: 74 65 28 62 69 6f 29 3b 0a 0a 09 7d 20 65 6c 73 te(bio);...} els
1190: 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 e {.. dprintf
11a0: 28 22 55 6e 65 78 70 65 63 74 65 64 20 65 72 72 ("Unexpected err
11b0: 6f 72 3a 20 25 69 3d 25 73 22 2c 20 74 63 6c 45 or: %i=%s", tclE
11c0: 72 72 6e 6f 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d rrno, Tcl_ErrnoM
11d0: 73 67 28 74 63 6c 45 72 72 6e 6f 29 29 3b 0a 09 sg(tclErrno));..
11e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 }. }.. dpr
11f0: 69 6e 74 66 28 22 42 69 6f 4f 75 74 70 75 74 20 intf("BioOutput
1200: 72 65 74 75 72 6e 69 6e 67 20 25 22 20 54 43 4c returning %" TCL
1210: 5f 53 49 5a 45 5f 4d 4f 44 49 46 49 45 52 20 22 _SIZE_MODIFIER "
1220: 64 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 72 65 d", ret);. re
1230: 74 75 72 6e 20 28 69 6e 74 29 20 72 65 74 3b 0a turn (int) ret;.
1240: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
1250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1290: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 69 6f 49 -----. *. * BioI
12a0: 6e 70 75 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 nput --. *. *.Th
12b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 is function is u
12c0: 73 65 64 20 74 6f 20 72 65 61 64 20 65 6e 63 72 sed to read encr
12d0: 79 70 74 65 64 20 64 61 74 61 20 66 72 6f 6d 20 ypted data from
12e0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 the channel and
12f0: 70 61 73 73 0a 20 2a 09 69 74 20 74 6f 20 74 68 pass. *.it to th
1300: 65 20 42 49 4f 20 69 6e 20 62 75 66 2e 20 54 68 e BIO in buf. Th
1310: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c is function will
1320: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 be called in re
1330: 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 0a 20 2a sponse to the. *
1340: 09 74 6c 73 49 4f 20 63 61 6c 6c 69 6e 67 20 74 .tlsIO calling t
1350: 68 65 20 42 49 4f 5f 72 65 61 64 5f 65 78 28 29 he BIO_read_ex()
1360: 20 6f 72 20 42 49 4f 5f 72 65 61 64 28 29 20 66 or BIO_read() f
1370: 75 6e 63 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 20 unctions.. *. *
1380: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
1390: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f rns the number o
13a0: 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f f bytes read fro
13b0: 6d 20 63 68 61 6e 6e 65 6c 2c 20 30 20 66 6f 72 m channel, 0 for
13c0: 20 45 4f 46 2c 20 6f 72 20 2d 31 20 66 6f 72 0a EOF, or -1 for.
13d0: 20 2a 09 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 *.error.. *. *
13e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
13f0: 09 52 65 61 64 73 20 63 68 61 6e 6e 65 6c 20 64 .Reads channel d
1400: 61 74 61 20 69 6e 74 6f 20 42 49 4f 20 6f 72 20 ata into BIO or
1410: 73 65 74 73 20 72 65 74 72 79 20 66 6c 61 67 73 sets retry flags
1420: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1470: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
1480: 20 69 6e 74 20 42 69 6f 49 6e 70 75 74 28 42 49 int BioInput(BI
1490: 4f 20 2a 62 69 6f 2c 20 63 68 61 72 20 2a 62 75 O *bio, char *bu
14a0: 66 2c 20 69 6e 74 20 62 75 66 4c 65 6e 29 20 7b f, int bufLen) {
14b0: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 72 65 . Tcl_Size re
14c0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 5f 65 6f t;. int is_eo
14d0: 66 2c 20 74 63 6c 45 72 72 6e 6f 2c 20 69 73 5f f, tclErrno, is_
14e0: 62 6c 6f 63 6b 65 64 3b 0a 20 20 20 20 53 74 61 blocked;. Sta
14f0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
1500: 53 74 61 74 65 20 2a 29 20 42 49 4f 5f 67 65 74 State *) BIO_get
1510: 5f 64 61 74 61 28 62 69 6f 29 3b 0a 20 20 20 20 _data(bio);.
1520: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
1530: 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 = Tls_GetParent
1540: 28 73 74 61 74 65 50 74 72 2c 20 30 29 3b 0a 0a (statePtr, 0);..
1550: 20 20 20 20 64 70 72 69 6e 74 66 28 22 5b 63 68 dprintf("[ch
1560: 61 6e 3d 25 70 5d 20 42 69 6f 49 6e 70 75 74 28 an=%p] BioInput(
1570: 62 69 6f 3d 25 70 2c 20 62 75 66 3d 25 70 2c 20 bio=%p, buf=%p,
1580: 6c 65 6e 3d 25 64 29 22 2c 20 28 76 6f 69 64 20 len=%d)", (void
1590: 2a 29 20 63 68 61 6e 2c 0a 09 28 76 6f 69 64 20 *) chan,..(void
15a0: 2a 29 20 62 69 6f 2c 20 62 75 66 2c 20 62 75 66 *) bio, buf, buf
15b0: 4c 65 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 62 Len);.. if (b
15c0: 75 66 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 62 75 uf == NULL || bu
15d0: 66 4c 65 6e 20 3c 3d 20 30 20 7c 7c 20 54 63 6c fLen <= 0 || Tcl
15e0: 5f 45 6f 66 28 63 68 61 6e 29 29 20 7b 0a 09 72 _Eof(chan)) {..r
15f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a eturn 0;. }..
1600: 20 20 20 20 42 49 4f 5f 63 6c 65 61 72 5f 72 65 BIO_clear_re
1610: 74 72 79 5f 66 6c 61 67 73 28 62 69 6f 29 3b 0a try_flags(bio);.
1620: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f Tcl_SetErrno
1630: 28 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 (0);.. /* Rea
1640: 64 20 64 61 74 61 20 66 72 6f 6d 20 75 6e 64 65 d data from unde
1650: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 2a rlying channel *
1660: 2f 0a 20 20 20 20 72 65 74 20 3d 20 54 63 6c 5f /. ret = Tcl_
1670: 52 65 61 64 52 61 77 28 63 68 61 6e 2c 20 62 75 ReadRaw(chan, bu
1680: 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 62 75 f, (Tcl_Size) bu
1690: 66 4c 65 6e 29 3b 0a 20 20 20 20 69 73 5f 65 6f fLen);. is_eo
16a0: 66 20 3d 20 54 63 6c 5f 45 6f 66 28 63 68 61 6e f = Tcl_Eof(chan
16b0: 29 3b 0a 20 20 20 20 74 63 6c 45 72 72 6e 6f 20 );. tclErrno
16c0: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 = Tcl_GetErrno()
16d0: 3b 0a 20 20 20 20 69 73 5f 62 6c 6f 63 6b 65 64 ;. is_blocked
16e0: 20 3d 20 54 63 6c 5f 49 6e 70 75 74 42 6c 6f 63 = Tcl_InputBloc
16f0: 6b 65 64 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 ked(chan);..
1700: 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25 dprintf("[chan=%
1710: 70 5d 20 42 69 6f 49 6e 70 75 74 28 62 75 66 20 p] BioInput(buf
1720: 6c 65 6e 3d 25 64 29 20 2d 3e 20 25 22 20 54 43 len=%d) -> %" TC
1730: 4c 5f 53 49 5a 45 5f 4d 4f 44 49 46 49 45 52 20 L_SIZE_MODIFIER
1740: 22 64 20 5b 74 63 6c 45 6f 66 3d 25 64 3b 20 62 "d [tclEof=%d; b
1750: 6c 6f 63 6b 65 64 3d 25 64 3b 20 74 63 6c 45 72 locked=%d; tclEr
1760: 72 6e 6f 3d 25 64 3a 20 25 73 5d 22 2c 0a 09 28 rno=%d: %s]",..(
1770: 76 6f 69 64 20 2a 29 20 63 68 61 6e 2c 20 62 75 void *) chan, bu
1780: 66 4c 65 6e 2c 20 72 65 74 2c 20 69 73 5f 65 6f fLen, ret, is_eo
1790: 66 2c 20 69 73 5f 62 6c 6f 63 6b 65 64 2c 20 74 f, is_blocked, t
17a0: 63 6c 45 72 72 6e 6f 2c 20 54 63 6c 5f 45 72 72 clErrno, Tcl_Err
17b0: 6e 6f 4d 73 67 28 74 63 6c 45 72 72 6e 6f 29 29 noMsg(tclErrno))
17c0: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3e ;.. if (ret >
17d0: 20 30 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 0) {..dprintf("
17e0: 53 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 Successfully rea
17f0: 64 20 25 22 20 54 43 4c 5f 53 49 5a 45 5f 4d 4f d %" TCL_SIZE_MO
1800: 44 49 46 49 45 52 20 22 64 20 62 79 74 65 73 20 DIFIER "d bytes
1810: 6f 66 20 64 61 74 61 22 2c 20 72 65 74 29 3b 0a of data", ret);.
1820: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
1830: 72 65 74 20 3d 3d 20 30 29 20 7b 0a 09 69 66 20 ret == 0) {..if
1840: 28 69 73 5f 65 6f 66 29 20 7b 0a 09 20 20 20 20 (is_eof) {..
1850: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 45 4f 46 dprintf("Got EOF
1860: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 2c 20 while reading,
1870: 72 65 74 75 72 6e 69 6e 67 20 61 20 43 6f 6e 6e returning a Conn
1880: 65 63 74 69 6f 6e 20 52 65 73 65 74 20 65 72 72 ection Reset err
1890: 6f 72 20 77 68 69 63 68 20 6d 61 70 73 20 74 6f or which maps to
18a0: 20 53 6f 66 74 20 45 4f 46 22 29 3b 0a 09 20 20 Soft EOF");..
18b0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 Tcl_SetErrno(E
18c0: 43 4f 4e 4e 52 45 53 45 54 29 3b 0a 09 20 20 20 CONNRESET);..
18d0: 20 42 49 4f 5f 73 65 74 5f 66 6c 61 67 73 28 62 BIO_set_flags(b
18e0: 69 6f 2c 20 42 49 4f 5f 46 4c 41 47 53 5f 49 4e io, BIO_FLAGS_IN
18f0: 5f 45 4f 46 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 _EOF);...} else
1900: 69 66 20 28 69 73 5f 62 6c 6f 63 6b 65 64 29 20 if (is_blocked)
1910: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
1920: 47 6f 74 20 69 6e 70 75 74 20 62 6c 6f 63 6b 65 Got input blocke
1930: 64 20 66 72 6f 6d 20 54 63 6c 5f 52 65 61 64 52 d from Tcl_ReadR
1940: 61 77 2e 20 53 65 74 74 69 6e 67 20 72 65 74 72 aw. Setting retr
1950: 79 20 72 65 61 64 20 66 6c 61 67 22 29 3b 0a 09 y read flag");..
1960: 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 BIO_set_retr
1970: 79 5f 72 65 61 64 28 62 69 6f 29 3b 0a 09 7d 0a y_read(bio);..}.
1980: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 64 . } else {..d
1990: 70 72 69 6e 74 66 28 22 57 65 20 67 6f 74 20 73 printf("We got s
19a0: 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 49 2f 4f 20 ome kind of I/O
19b0: 65 72 72 6f 72 22 29 3b 0a 0a 09 69 66 20 28 42 error");...if (B
19c0: 49 4f 53 68 6f 75 6c 64 52 65 74 72 79 28 74 63 IOShouldRetry(tc
19d0: 6c 45 72 72 6e 6f 29 29 20 7b 0a 09 20 20 20 20 lErrno)) {..
19e0: 64 70 72 69 6e 74 66 28 22 54 72 79 20 61 67 61 dprintf("Try aga
19f0: 69 6e 20 66 6f 72 3a 20 25 69 3d 25 73 22 2c 20 in for: %i=%s",
1a00: 74 63 6c 45 72 72 6e 6f 2c 20 54 63 6c 5f 45 72 tclErrno, Tcl_Er
1a10: 72 6e 6f 4d 73 67 28 74 63 6c 45 72 72 6e 6f 29 rnoMsg(tclErrno)
1a20: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f );.. BIO_set_
1a30: 72 65 74 72 79 5f 72 65 61 64 28 62 69 6f 29 3b retry_read(bio);
1a40: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ...} else {..
1a50: 20 64 70 72 69 6e 74 66 28 22 55 6e 65 78 70 65 dprintf("Unexpe
1a60: 63 74 65 64 20 65 72 72 6f 72 3a 20 25 69 3d 25 cted error: %i=%
1a70: 73 22 2c 20 74 63 6c 45 72 72 6e 6f 2c 20 54 63 s", tclErrno, Tc
1a80: 6c 5f 45 72 72 6e 6f 4d 73 67 28 74 63 6c 45 72 l_ErrnoMsg(tclEr
1a90: 72 6e 6f 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a rno));..}. }.
1aa0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 69 . dprintf("Bi
1ab0: 6f 49 6e 70 75 74 20 72 65 74 75 72 6e 69 6e 67 oInput returning
1ac0: 20 25 22 20 54 43 4c 5f 53 49 5a 45 5f 4d 4f 44 %" TCL_SIZE_MOD
1ad0: 49 46 49 45 52 20 22 64 22 2c 20 72 65 74 29 3b IFIER "d", ret);
1ae0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 . return (int
1af0: 29 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d ) ret;.}../*. *-
1b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
1b50: 20 2a 20 42 69 6f 50 75 74 73 20 2d 2d 0a 20 2a * BioPuts --. *
1b60: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f . *.This functio
1b70: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 n is used to rea
1b80: 64 20 61 20 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 d a NULL termina
1b90: 74 65 64 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 ted string from
1ba0: 74 68 65 20 42 49 4f 20 61 6e 64 0a 20 2a 09 77 the BIO and. *.w
1bb0: 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 63 rite it to the c
1bc0: 68 61 6e 6e 65 6c 2e 20 54 68 69 73 20 66 75 6e hannel. This fun
1bd0: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61 ction will be ca
1be0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 lled in response
1bf0: 20 74 6f 0a 20 2a 09 74 68 65 20 61 70 70 6c 69 to. *.the appli
1c00: 63 61 74 69 6f 6e 20 63 61 6c 6c 69 6e 67 20 74 cation calling t
1c10: 68 65 20 42 49 4f 5f 70 75 74 73 28 29 20 66 75 he BIO_puts() fu
1c20: 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 nction.. *. * Re
1c30: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e sults:. *.Return
1c40: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
1c50: 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 bytes read from
1c60: 63 68 61 6e 6e 65 6c 2c 20 30 20 66 6f 72 20 45 channel, 0 for E
1c70: 4f 46 2c 20 6f 72 20 2d 31 20 66 6f 72 0a 20 2a OF, or -1 for. *
1c80: 09 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 53 69 .error.. *. * Si
1c90: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 de effects:. *.W
1ca0: 72 69 74 65 73 20 64 61 74 61 20 74 6f 20 63 68 rites data to ch
1cb0: 61 6e 6e 65 6c 20 6f 72 20 73 65 74 73 20 72 65 annel or sets re
1cc0: 74 72 79 20 66 6c 61 67 73 2e 0a 20 2a 0a 20 2a try flags.. *. *
1cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a -------------. *
1d20: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 42 69 /..static int Bi
1d30: 6f 50 75 74 73 28 42 49 4f 20 2a 62 69 6f 2c 20 oPuts(BIO *bio,
1d40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 74 72 29 const char *str)
1d50: 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 {. dprintf("
1d60: 42 69 6f 50 75 74 73 28 25 70 29 20 5c 22 25 73 BioPuts(%p) \"%s
1d70: 5c 22 22 2c 20 62 69 6f 2c 20 73 74 72 29 3b 0a \"", bio, str);.
1d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 42 69 6f 4f . return BioO
1d90: 75 74 70 75 74 28 62 69 6f 2c 20 73 74 72 2c 20 utput(bio, str,
1da0: 28 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 74 72 (int) strlen(str
1db0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ));.}../*. *----
1dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
1e10: 42 69 6f 43 74 72 6c 20 2d 2d 0a 20 2a 0a 20 2a BioCtrl --. *. *
1e20: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 .This function i
1e30: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 63 65 73 s used to proces
1e40: 73 20 63 6f 6e 74 72 6f 6c 20 6d 65 73 73 61 67 s control messag
1e50: 65 73 20 69 6e 20 74 68 65 20 42 49 4f 2e 20 54 es in the BIO. T
1e60: 68 69 73 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 20 his. *.function
1e70: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 69 will be called i
1e80: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 n response to th
1e90: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 e application ca
1ea0: 6c 6c 69 6e 67 20 74 68 65 0a 20 2a 09 42 49 4f lling the. *.BIO
1eb0: 5f 63 74 72 6c 28 29 20 66 75 6e 63 74 69 6f 6e _ctrl() function
1ec0: 2e 20 53 65 76 65 72 61 6c 20 66 75 6e 63 74 69 . Several functi
1ed0: 6f 6e 73 20 77 72 61 70 20 42 49 4f 5f 63 74 72 ons wrap BIO_ctr
1ee0: 6c 28 29 20 73 75 63 68 20 61 73 0a 20 2a 09 42 l() such as. *.B
1ef0: 49 4f 5f 65 6f 66 2c 20 42 49 4f 5f 66 6c 75 73 IO_eof, BIO_flus
1f00: 68 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67 2c 20 h, BIO_pending,
1f10: 42 49 4f 5f 77 70 65 6e 64 69 6e 67 2c 20 65 74 BIO_wpending, et
1f20: 63 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 c.. *. * Results
1f30: 3a 0a 20 2a 09 46 75 6e 63 74 69 6f 6e 20 64 65 :. *.Function de
1f40: 70 65 6e 64 65 6e 74 0a 20 2a 0a 20 2a 20 53 69 pendent. *. * Si
1f50: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 de effects:. *.F
1f60: 75 6e 63 74 69 6f 6e 20 64 65 70 65 6e 64 65 6e unction dependen
1f70: 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d t. *. *---------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fc0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
1fd0: 20 6c 6f 6e 67 20 42 69 6f 43 74 72 6c 28 42 49 long BioCtrl(BI
1fe0: 4f 20 2a 62 69 6f 2c 20 69 6e 74 20 63 6d 64 2c O *bio, int cmd,
1ff0: 20 6c 6f 6e 67 20 6e 75 6d 2c 20 76 6f 69 64 20 long num, void
2000: 2a 70 74 72 29 20 7b 0a 20 20 20 20 6c 6f 6e 67 *ptr) {. long
2010: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 53 74 ret = 1;. St
2020: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
2030: 28 53 74 61 74 65 20 2a 29 20 42 49 4f 5f 67 65 (State *) BIO_ge
2040: 74 5f 64 61 74 61 28 62 69 6f 29 3b 0a 20 20 20 t_data(bio);.
2050: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 Tcl_Channel cha
2060: 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e n = Tls_GetParen
2070: 74 28 73 74 61 74 65 50 74 72 2c 20 30 29 3b 0a t(statePtr, 0);.
2080: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 69 . dprintf("Bi
2090: 6f 43 74 72 6c 28 25 70 2c 20 30 78 25 78 2c 20 oCtrl(%p, 0x%x,
20a0: 30 78 25 6c 78 2c 20 25 70 29 22 2c 20 28 76 6f 0x%lx, %p)", (vo
20b0: 69 64 20 2a 29 20 62 69 6f 2c 20 63 6d 64 2c 20 id *) bio, cmd,
20c0: 6e 75 6d 2c 20 70 74 72 29 3b 0a 0a 20 20 20 20 num, ptr);..
20d0: 73 77 69 74 63 68 20 28 63 6d 64 29 20 7b 0a 09 switch (cmd) {..
20e0: 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f 52 45 case BIO_CTRL_RE
20f0: 53 45 54 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 SET:.../* opt -
2100: 52 65 73 65 74 73 20 42 49 4f 20 74 6f 20 69 6e Resets BIO to in
2110: 69 74 69 61 6c 20 73 74 61 74 65 2e 20 49 6d 70 itial state. Imp
2120: 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 72 65 73 65 lements BIO_rese
2130: 74 2e 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 t. */...dprintf(
2140: 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 52 45 "Got BIO_CTRL_RE
2150: 53 45 54 22 29 3b 0a 09 09 2f 2a 20 52 65 74 75 SET");.../* Retu
2160: 72 6e 20 31 20 66 6f 72 20 73 75 63 63 65 73 73 rn 1 for success
2170: 20 28 30 20 66 6f 72 20 66 69 6c 65 20 42 49 4f (0 for file BIO
2180: 73 29 20 61 6e 64 20 2d 31 20 66 6f 72 20 66 61 s) and -1 for fa
2190: 69 6c 75 72 65 2e 20 2a 2f 0a 09 09 72 65 74 20 ilure. */...ret
21a0: 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 = 0;...break;..c
21b0: 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f 45 4f 46 ase BIO_CTRL_EOF
21c0: 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 52 65 74 :.../* opt - Ret
21d0: 75 72 6e 73 20 77 68 65 74 68 65 72 20 45 4f 46 urns whether EOF
21e0: 20 68 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 has been reache
21f0: 64 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 d. Implements BI
2200: 4f 5f 65 6f 66 2e 20 2a 2f 0a 09 09 64 70 72 69 O_eof. */...dpri
2210: 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 ntf("Got BIO_CTR
2220: 4c 5f 45 4f 46 22 29 3b 0a 09 09 2f 2a 20 52 65 L_EOF");.../* Re
2230: 74 75 72 6e 73 20 31 20 69 66 20 45 4f 46 20 68 turns 1 if EOF h
2240: 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 64 2c as been reached,
2250: 20 30 20 69 66 20 6e 6f 74 2c 20 6f 72 20 3c 30 0 if not, or <0
2260: 20 66 6f 72 20 66 61 69 6c 75 72 65 2e 20 2a 2f for failure. */
2270: 0a 09 09 72 65 74 20 3d 20 28 28 63 68 61 6e 29 ...ret = ((chan)
2280: 20 3f 20 28 54 63 6c 5f 45 6f 66 28 63 68 61 6e ? (Tcl_Eof(chan
2290: 29 20 7c 7c 20 42 49 4f 5f 74 65 73 74 5f 66 6c ) || BIO_test_fl
22a0: 61 67 73 28 62 69 6f 2c 20 42 49 4f 5f 46 4c 41 ags(bio, BIO_FLA
22b0: 47 53 5f 49 4e 5f 45 4f 46 29 29 20 3a 20 31 29 GS_IN_EOF)) : 1)
22c0: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 ;...break;..case
22d0: 20 42 49 4f 5f 43 54 52 4c 5f 49 4e 46 4f 3a 0a BIO_CTRL_INFO:.
22e0: 09 09 2f 2a 20 6f 70 74 20 2d 20 65 78 74 72 61 ../* opt - extra
22f0: 20 69 6e 66 6f 20 6f 6e 20 42 49 4f 2e 20 49 6d info on BIO. Im
2300: 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 67 65 74 plements BIO_get
2310: 5f 6d 65 6d 5f 64 61 74 61 2e 20 2a 2f 0a 09 09 _mem_data. */...
2320: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f dprintf("Got BIO
2330: 5f 43 54 52 4c 5f 49 4e 46 4f 22 29 3b 0a 09 09 _CTRL_INFO");...
2340: 72 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b ret = 0;...break
2350: 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c ;..case BIO_CTRL
2360: 5f 53 45 54 3a 0a 09 09 2f 2a 20 6d 61 6e 20 2d _SET:.../* man -
2370: 20 73 65 74 20 74 68 65 20 27 49 4f 27 20 70 61 set the 'IO' pa
2380: 72 61 6d 65 74 65 72 2e 20 2a 2f 0a 09 09 64 70 rameter. */...dp
2390: 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 rintf("Got BIO_C
23a0: 54 52 4c 5f 53 45 54 22 29 3b 0a 09 09 72 65 74 TRL_SET");...ret
23b0: 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 = 0;...break;..
23c0: 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f 47 45 case BIO_CTRL_GE
23d0: 54 3a 0a 09 09 2f 2a 20 6d 61 6e 20 2d 20 67 65 T:.../* man - ge
23e0: 74 20 74 68 65 20 27 49 4f 27 20 70 61 72 61 6d t the 'IO' param
23f0: 65 74 65 72 2e 20 2a 2f 0a 09 09 64 70 72 69 6e eter. */...dprin
2400: 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c tf("Got BIO_CTRL
2410: 5f 47 45 54 20 22 29 3b 0a 09 09 72 65 74 20 3d _GET ");...ret =
2420: 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 0;...break;..ca
2430: 73 65 20 42 49 4f 5f 43 54 52 4c 5f 50 55 53 48 se BIO_CTRL_PUSH
2440: 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 69 6e 74 :.../* opt - int
2450: 65 72 6e 61 6c 2c 20 75 73 65 64 20 74 6f 20 73 ernal, used to s
2460: 69 67 6e 69 66 79 20 63 68 61 6e 67 65 2e 20 49 ignify change. I
2470: 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 70 75 mplements BIO_pu
2480: 73 68 2e 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 sh. */...dprintf
2490: 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 50 ("Got BIO_CTRL_P
24a0: 55 53 48 22 29 3b 0a 09 09 72 65 74 20 3d 20 30 USH");...ret = 0
24b0: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 ;...break;..case
24c0: 20 42 49 4f 5f 43 54 52 4c 5f 50 4f 50 3a 0a 09 BIO_CTRL_POP:..
24d0: 09 2f 2a 20 6f 70 74 20 2d 20 69 6e 74 65 72 6e ./* opt - intern
24e0: 61 6c 2c 20 75 73 65 64 20 74 6f 20 73 69 67 6e al, used to sign
24f0: 69 66 79 20 63 68 61 6e 67 65 2e 20 49 6d 70 6c ify change. Impl
2500: 65 6d 65 6e 74 73 20 42 49 4f 5f 70 6f 70 2e 20 ements BIO_pop.
2510: 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 47 6f */...dprintf("Go
2520: 74 20 42 49 4f 5f 43 54 52 4c 5f 50 4f 50 22 29 t BIO_CTRL_POP")
2530: 3b 0a 09 09 72 65 74 20 3d 20 30 3b 0a 09 09 62 ;...ret = 0;...b
2540: 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f 5f reak;..case BIO_
2550: 43 54 52 4c 5f 47 45 54 5f 43 4c 4f 53 45 3a 0a CTRL_GET_CLOSE:.
2560: 09 09 2f 2a 20 6d 61 6e 20 2d 20 47 65 74 20 74 ../* man - Get t
2570: 68 65 20 63 6c 6f 73 65 20 6f 6e 20 42 49 4f 5f he close on BIO_
2580: 66 72 65 65 28 29 20 66 6c 61 67 20 73 65 74 20 free() flag set
2590: 62 79 20 42 49 4f 5f 43 54 52 4c 5f 53 45 54 5f by BIO_CTRL_SET_
25a0: 43 4c 4f 53 45 2e 20 49 6d 70 6c 65 6d 65 6e 74 CLOSE. Implement
25b0: 73 20 42 49 4f 5f 67 65 74 5f 63 6c 6f 73 65 2e s BIO_get_close.
25c0: 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 47 */...dprintf("G
25d0: 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 43 4c 4f 53 ot BIO_CTRL_CLOS
25e0: 45 22 29 3b 0a 09 09 2f 2a 20 52 65 74 75 72 6e E");.../* Return
25f0: 73 20 42 49 4f 5f 43 4c 4f 53 45 2c 20 42 49 4f s BIO_CLOSE, BIO
2600: 5f 4e 4f 43 4c 4f 53 45 2c 20 6f 72 20 3c 30 20 _NOCLOSE, or <0
2610: 66 6f 72 20 66 61 69 6c 75 72 65 2e 20 2a 2f 0a for failure. */.
2620: 09 09 72 65 74 20 3d 20 42 49 4f 5f 67 65 74 5f ..ret = BIO_get_
2630: 73 68 75 74 64 6f 77 6e 28 62 69 6f 29 3b 0a 09 shutdown(bio);..
2640: 09 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 .break;..case BI
2650: 4f 5f 43 54 52 4c 5f 53 45 54 5f 43 4c 4f 53 45 O_CTRL_SET_CLOSE
2660: 3a 0a 09 09 2f 2a 20 6d 61 6e 20 2d 20 53 65 74 :.../* man - Set
2670: 20 74 68 65 20 63 6c 6f 73 65 20 6f 6e 20 42 49 the close on BI
2680: 4f 5f 66 72 65 65 28 29 20 66 6c 61 67 2e 20 49 O_free() flag. I
2690: 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 73 65 mplements BIO_se
26a0: 74 5f 63 6c 6f 73 65 2e 20 2a 2f 0a 09 09 64 70 t_close. */...dp
26b0: 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 53 rintf("Got BIO_S
26c0: 45 54 5f 43 4c 4f 53 45 22 29 3b 0a 09 09 42 49 ET_CLOSE");...BI
26d0: 4f 5f 73 65 74 5f 73 68 75 74 64 6f 77 6e 28 62 O_set_shutdown(b
26e0: 69 6f 2c 20 28 69 6e 74 29 6e 75 6d 29 3b 0a 09 io, (int)num);..
26f0: 09 2f 2a 20 52 65 74 75 72 6e 73 20 31 20 6f 6e ./* Returns 1 on
2700: 20 73 75 63 63 65 73 73 20 6f 72 20 3c 3d 30 20 success or <=0
2710: 66 6f 72 20 66 61 69 6c 75 72 65 2e 20 2a 2f 0a for failure. */.
2720: 09 09 72 65 74 20 3d 20 31 3b 0a 09 09 62 72 65 ..ret = 1;...bre
2730: 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 ak;..case BIO_CT
2740: 52 4c 5f 50 45 4e 44 49 4e 47 3a 0a 09 09 2f 2a RL_PENDING:.../*
2750: 20 6f 70 74 20 2d 20 52 65 74 75 72 6e 20 6e 75 opt - Return nu
2760: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e mber of bytes in
2770: 20 63 68 61 6e 20 77 61 69 74 69 6e 67 20 74 6f chan waiting to
2780: 20 62 65 20 72 65 61 64 2e 20 49 6d 70 6c 65 6d be read. Implem
2790: 65 6e 74 73 20 42 49 4f 5f 70 65 6e 64 69 6e 67 ents BIO_pending
27a0: 2e 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 . */...dprintf("
27b0: 47 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 50 45 4e Got BIO_CTRL_PEN
27c0: 44 49 4e 47 22 29 3b 0a 09 09 2f 2a 20 52 65 74 DING");.../* Ret
27d0: 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f urn the amount o
27e0: 66 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 6f f pending data o
27f0: 72 20 30 20 66 6f 72 20 65 72 72 6f 72 2e 20 2a r 0 for error. *
2800: 2f 0a 09 09 72 65 74 20 3d 20 28 28 63 68 61 6e /...ret = ((chan
2810: 29 20 3f 20 54 63 6c 5f 49 6e 70 75 74 42 75 66 ) ? Tcl_InputBuf
2820: 66 65 72 65 64 28 63 68 61 6e 29 20 3a 20 30 29 fered(chan) : 0)
2830: 3b 0a 09 09 64 70 72 69 6e 74 66 28 22 72 62 69 ;...dprintf("rbi
2840: 6f 20 70 65 6e 64 69 6e 67 3d 25 6c 64 22 2c 20 o pending=%ld",
2850: 72 65 74 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 ret);...break;..
2860: 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f 46 4c case BIO_CTRL_FL
2870: 55 53 48 3a 0a 09 09 2f 2a 20 6f 70 74 20 2d 20 USH:.../* opt -
2880: 46 6c 75 73 68 20 61 6e 79 20 62 75 66 66 65 72 Flush any buffer
2890: 65 64 20 6f 75 74 70 75 74 2e 20 49 6d 70 6c 65 ed output. Imple
28a0: 6d 65 6e 74 73 20 42 49 4f 5f 66 6c 75 73 68 2e ments BIO_flush.
28b0: 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 47 */...dprintf("G
28c0: 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 46 4c 55 53 ot BIO_CTRL_FLUS
28d0: 48 22 29 3b 0a 09 09 2f 2a 20 55 73 65 20 54 63 H");.../* Use Tc
28e0: 6c 5f 57 72 69 74 65 52 61 77 20 69 6e 73 74 65 l_WriteRaw inste
28f0: 61 64 20 6f 66 20 54 63 6c 5f 46 6c 75 73 68 20 ad of Tcl_Flush
2900: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 72 69 to operate on ri
2910: 67 68 74 20 63 68 61 6e 20 69 6e 20 73 74 61 63 ght chan in stac
2920: 6b 2e 20 2a 2f 0a 09 09 2f 2a 20 52 65 74 75 72 k. */.../* Retur
2930: 6e 73 20 31 20 66 6f 72 20 73 75 63 63 65 73 73 ns 1 for success
2940: 2c 20 3c 3d 30 20 66 6f 72 20 65 72 72 6f 72 2f , <=0 for error/
2950: 72 65 74 72 79 2e 20 2a 2f 0a 09 09 72 65 74 20 retry. */...ret
2960: 3d 20 28 28 63 68 61 6e 29 20 26 26 20 28 54 63 = ((chan) && (Tc
2970: 6c 5f 57 72 69 74 65 52 61 77 28 63 68 61 6e 2c l_WriteRaw(chan,
2980: 20 22 22 2c 20 30 29 20 3e 3d 20 30 29 20 3f 20 "", 0) >= 0) ?
2990: 31 20 3a 20 2d 31 29 3b 0a 09 09 62 72 65 61 6b 1 : -1);...break
29a0: 3b 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c ;..case BIO_CTRL
29b0: 5f 44 55 50 3a 0a 09 09 2f 2a 20 6d 61 6e 20 2d _DUP:.../* man -
29c0: 20 65 78 74 72 61 20 73 74 75 66 66 20 66 6f 72 extra stuff for
29d0: 20 27 64 75 70 65 64 27 20 42 49 4f 2e 20 49 6d 'duped' BIO. Im
29e0: 70 6c 65 6d 65 6e 74 73 20 42 49 4f 5f 64 75 70 plements BIO_dup
29f0: 5f 73 74 61 74 65 2e 20 2a 2f 0a 09 09 64 70 72 _state. */...dpr
2a00: 69 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 intf("Got BIO_CT
2a10: 52 4c 5f 44 55 50 22 29 3b 0a 09 09 72 65 74 20 RL_DUP");...ret
2a20: 3d 20 31 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 = 1;...break;..c
2a30: 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f 57 50 45 ase BIO_CTRL_WPE
2a40: 4e 44 49 4e 47 3a 0a 09 09 2f 2a 20 6f 70 74 20 NDING:.../* opt
2a50: 2d 20 52 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 - Return number
2a60: 6f 66 20 62 79 74 65 73 20 69 6e 20 63 68 61 6e of bytes in chan
2a70: 20 73 74 69 6c 6c 20 74 6f 20 62 65 20 77 72 69 still to be wri
2a80: 74 74 65 6e 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 tten. Implements
2a90: 20 42 49 4f 5f 77 70 65 6e 64 69 6e 67 2e 20 2a BIO_wpending. *
2aa0: 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 /...dprintf("Got
2ab0: 20 42 49 4f 5f 43 54 52 4c 5f 57 50 45 4e 44 49 BIO_CTRL_WPENDI
2ac0: 4e 47 22 29 3b 0a 09 09 2f 2a 20 52 65 74 75 72 NG");.../* Retur
2ad0: 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 n the amount of
2ae0: 70 65 6e 64 69 6e 67 20 64 61 74 61 20 6f 72 20 pending data or
2af0: 30 20 66 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 09 0 for error */..
2b00: 09 72 65 74 20 3d 20 28 28 63 68 61 6e 29 20 3f .ret = ((chan) ?
2b10: 20 54 63 6c 5f 4f 75 74 70 75 74 42 75 66 66 65 Tcl_OutputBuffe
2b20: 72 65 64 28 63 68 61 6e 29 20 3a 20 30 29 3b 0a red(chan) : 0);.
2b30: 09 09 64 70 72 69 6e 74 66 28 22 77 62 69 6f 20 ..dprintf("wbio
2b40: 70 65 6e 64 69 6e 67 3d 25 6c 64 22 2c 20 72 65 pending=%ld", re
2b50: 74 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 t);...break;..ca
2b60: 73 65 20 42 49 4f 5f 43 54 52 4c 5f 53 45 54 5f se BIO_CTRL_SET_
2b70: 43 41 4c 4c 42 41 43 4b 3a 0a 09 09 2f 2a 20 6f CALLBACK:.../* o
2b80: 70 74 20 2d 20 53 65 74 73 20 61 6e 20 69 6e 66 pt - Sets an inf
2b90: 6f 72 6d 61 74 69 6f 6e 61 6c 20 63 61 6c 6c 62 ormational callb
2ba0: 61 63 6b 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 ack. Implements
2bb0: 42 49 4f 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c BIO_set_info_cal
2bc0: 6c 62 61 63 6b 2e 20 2a 2f 0a 09 09 72 65 74 20 lback. */...ret
2bd0: 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 63 = 0;...break;..c
2be0: 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f 47 45 54 ase BIO_CTRL_GET
2bf0: 5f 43 41 4c 4c 42 41 43 4b 3a 0a 09 09 2f 2a 20 _CALLBACK:.../*
2c00: 6f 70 74 20 2d 20 47 65 74 20 61 6e 64 20 72 65 opt - Get and re
2c10: 74 75 72 6e 20 74 68 65 20 69 6e 66 6f 20 63 61 turn the info ca
2c20: 6c 6c 62 61 63 6b 2e 20 49 6d 70 6c 65 6d 65 6e llback. Implemen
2c30: 74 73 20 42 49 4f 5f 67 65 74 5f 69 6e 66 6f 5f ts BIO_get_info_
2c40: 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 09 09 72 callback. */...r
2c50: 65 74 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b et = 0;...break;
2c60: 0a 0a 09 63 61 73 65 20 42 49 4f 5f 43 5f 46 49 ...case BIO_C_FI
2c70: 4c 45 5f 53 45 45 4b 3a 0a 09 09 2f 2a 20 4e 6f LE_SEEK:.../* No
2c80: 74 20 75 73 65 64 20 66 6f 72 20 73 6f 63 6b 65 t used for socke
2c90: 74 73 2e 20 54 63 6c 5f 53 65 65 6b 20 6f 6e 6c ts. Tcl_Seek onl
2ca0: 79 20 77 6f 72 6b 73 20 6f 6e 20 74 6f 70 20 63 y works on top c
2cb0: 68 61 6e 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 han. Implements
2cc0: 42 49 4f 5f 73 65 65 6b 28 29 2e 20 2a 2f 0a 09 BIO_seek(). */..
2cd0: 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 42 49 .dprintf("Got BI
2ce0: 4f 5f 43 5f 46 49 4c 45 5f 53 45 45 4b 22 29 3b O_C_FILE_SEEK");
2cf0: 0a 09 09 72 65 74 20 3d 20 30 3b 20 2f 2a 20 52 ...ret = 0; /* R
2d00: 65 74 75 72 6e 20 30 20 73 75 63 63 65 73 73 20 eturn 0 success
2d10: 61 6e 64 20 2d 31 20 66 6f 72 20 66 61 69 6c 75 and -1 for failu
2d20: 72 65 20 2a 2f 0a 09 09 62 72 65 61 6b 3b 0a 09 re */...break;..
2d30: 63 61 73 65 20 42 49 4f 5f 43 5f 46 49 4c 45 5f case BIO_C_FILE_
2d40: 54 45 4c 4c 3a 0a 09 09 2f 2a 20 4e 6f 74 20 75 TELL:.../* Not u
2d50: 73 65 64 20 66 6f 72 20 73 6f 63 6b 65 74 73 2e sed for sockets.
2d60: 20 54 63 6c 5f 54 65 6c 6c 20 6f 6e 6c 79 20 77 Tcl_Tell only w
2d70: 6f 72 6b 73 20 6f 6e 20 74 6f 70 20 63 68 61 6e orks on top chan
2d80: 2e 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 49 4f . Implements BIO
2d90: 5f 74 65 6c 6c 28 29 2e 20 2a 2f 0a 09 09 64 70 _tell(). */...dp
2da0: 72 69 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 rintf("Got BIO_C
2db0: 5f 46 49 4c 45 5f 54 45 4c 4c 22 29 3b 0a 09 09 _FILE_TELL");...
2dc0: 72 65 74 20 3d 20 30 3b 20 2f 2a 20 52 65 74 75 ret = 0; /* Retu
2dd0: 72 6e 20 30 20 73 75 63 63 65 73 73 20 61 6e 64 rn 0 success and
2de0: 20 2d 31 20 66 6f 72 20 66 61 69 6c 75 72 65 20 -1 for failure
2df0: 2a 2f 0a 09 09 62 72 65 61 6b 3b 0a 09 63 61 73 */...break;..cas
2e00: 65 20 42 49 4f 5f 43 5f 53 45 54 5f 46 44 3a 0a e BIO_C_SET_FD:.
2e10: 09 09 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 73 20 ../* Implements
2e20: 42 49 4f 5f 73 65 74 5f 66 64 20 2a 2f 0a 09 09 BIO_set_fd */...
2e30: 64 70 72 69 6e 74 66 28 22 55 6e 73 75 70 70 6f dprintf("Unsuppo
2e40: 72 74 65 64 20 63 61 6c 6c 3a 20 42 49 4f 5f 43 rted call: BIO_C
2e50: 5f 53 45 54 5f 46 44 22 29 3b 0a 09 09 72 65 74 _SET_FD");...ret
2e60: 20 3d 20 2d 31 3b 0a 09 09 62 72 65 61 6b 3b 0a = -1;...break;.
2e70: 09 63 61 73 65 20 42 49 4f 5f 43 5f 47 45 54 5f .case BIO_C_GET_
2e80: 46 44 3a 0a 09 09 2f 2a 20 49 6d 70 6c 65 6d 65 FD:.../* Impleme
2e90: 6e 74 73 20 42 49 4f 5f 67 65 74 5f 66 64 28 29 nts BIO_get_fd()
2ea0: 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 55 */...dprintf("U
2eb0: 6e 73 75 70 70 6f 72 74 65 64 20 63 61 6c 6c 3a nsupported call:
2ec0: 20 42 49 4f 5f 43 5f 47 45 54 5f 46 44 22 29 3b BIO_C_GET_FD");
2ed0: 0a 09 09 72 65 74 20 3d 20 2d 31 3b 0a 09 09 62 ...ret = -1;...b
2ee0: 72 65 61 6b 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 reak;..#if OPENS
2ef0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 SL_VERSION_NUMBE
2f00: 52 20 3e 3d 20 30 78 33 30 30 30 30 30 30 30 4c R >= 0x30000000L
2f10: 0a 09 63 61 73 65 20 42 49 4f 5f 43 54 52 4c 5f ..case BIO_CTRL_
2f20: 47 45 54 5f 4b 54 4c 53 5f 53 45 4e 44 3a 0a 09 GET_KTLS_SEND:..
2f30: 09 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 73 20 42 ./* Implements B
2f40: 49 4f 5f 67 65 74 5f 6b 74 6c 73 5f 73 65 6e 64 IO_get_ktls_send
2f50: 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 47 */...dprintf("G
2f60: 6f 74 20 42 49 4f 5f 43 54 52 4c 5f 47 45 54 5f ot BIO_CTRL_GET_
2f70: 4b 54 4c 53 5f 53 45 4e 44 22 29 3b 0a 09 09 2f KTLS_SEND");.../
2f80: 2a 20 52 65 74 75 72 6e 73 20 31 20 69 66 20 74 * Returns 1 if t
2f90: 68 65 20 42 49 4f 20 69 73 20 75 73 69 6e 67 20 he BIO is using
2fa0: 74 68 65 20 4b 65 72 6e 65 6c 20 54 4c 53 20 64 the Kernel TLS d
2fb0: 61 74 61 2d 70 61 74 68 20 66 6f 72 20 73 65 6e ata-path for sen
2fc0: 64 69 6e 67 2c 20 30 20 69 66 20 6e 6f 74 2e 20 ding, 0 if not.
2fd0: 2a 2f 0a 09 09 72 65 74 20 3d 20 30 3b 0a 09 09 */...ret = 0;...
2fe0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 42 49 4f break;..case BIO
2ff0: 5f 43 54 52 4c 5f 47 45 54 5f 4b 54 4c 53 5f 52 _CTRL_GET_KTLS_R
3000: 45 43 56 3a 0a 09 09 2f 2a 20 49 6d 70 6c 65 6d ECV:.../* Implem
3010: 65 6e 74 73 20 42 49 4f 5f 67 65 74 5f 6b 74 6c ents BIO_get_ktl
3020: 73 5f 72 65 63 76 20 2a 2f 0a 09 09 64 70 72 69 s_recv */...dpri
3030: 6e 74 66 28 22 47 6f 74 20 42 49 4f 5f 43 54 52 ntf("Got BIO_CTR
3040: 4c 5f 47 45 54 5f 4b 54 4c 53 5f 52 45 43 56 22 L_GET_KTLS_RECV"
3050: 29 3b 0a 09 09 2f 2a 20 52 65 74 75 72 6e 73 20 );.../* Returns
3060: 31 20 69 66 20 74 68 65 20 42 49 4f 20 69 73 20 1 if the BIO is
3070: 75 73 69 6e 67 20 74 68 65 20 4b 65 72 6e 65 6c using the Kernel
3080: 20 54 4c 53 20 64 61 74 61 2d 70 61 74 68 20 66 TLS data-path f
3090: 6f 72 20 72 65 63 65 69 76 69 6e 67 2c 20 30 20 or receiving, 0
30a0: 69 66 20 6e 6f 74 2e 20 2a 2f 0a 09 09 72 65 74 if not. */...ret
30b0: 20 3d 20 30 3b 0a 09 09 62 72 65 61 6b 3b 0a 23 = 0;...break;.#
30c0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a endif..default:.
30d0: 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 75 ..dprintf("Got u
30e0: 6e 6b 6e 6f 77 6e 20 63 6f 6e 74 72 6f 6c 20 63 nknown control c
30f0: 6f 6d 6d 61 6e 64 20 28 25 69 29 22 2c 20 63 6d ommand (%i)", cm
3100: 64 29 3b 0a 09 09 72 65 74 20 3d 20 30 3b 0a 09 d);...ret = 0;..
3110: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 .break;. }.
3120: 20 20 64 70 72 69 6e 74 66 28 22 42 69 6f 43 74 dprintf("BioCt
3130: 72 6c 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 rl return value
3140: 25 6c 69 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 %li", ret);.
3150: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f return ret;.}../
3160: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
31b0: 2d 0a 20 2a 0a 20 2a 20 42 69 6f 4e 65 77 20 2d -. *. * BioNew -
31c0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e -. *. *.This fun
31d0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f ction is used to
31e0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e create a new in
31f0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 42 49 stance of the BI
3200: 4f 2e 20 54 68 69 73 0a 20 2a 09 66 75 6e 63 74 O. This. *.funct
3210: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c ion will be call
3220: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 ed in response t
3230: 6f 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f o the applicatio
3240: 6e 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 20 2a n calling the. *
3250: 09 42 49 4f 5f 6e 65 77 28 29 20 66 75 6e 63 74 .BIO_new() funct
3260: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ion.. *. * Resul
3270: 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 62 ts:. *.Returns b
3280: 6f 6f 6c 65 61 6e 20 73 75 63 63 65 73 73 20 72 oolean success r
3290: 65 73 75 6c 74 20 28 31 3d 73 75 63 63 65 73 73 esult (1=success
32a0: 2c 20 30 3d 66 61 69 6c 75 72 65 29 2e 0a 20 2a , 0=failure).. *
32b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
32c0: 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 :. *.Initializes
32d0: 20 42 49 4f 20 73 74 72 75 63 74 75 72 65 2e 0a BIO structure..
32e0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3330: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
3340: 6e 74 20 42 69 6f 4e 65 77 28 42 49 4f 20 2a 62 nt BioNew(BIO *b
3350: 69 6f 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 io) {. dprint
3360: 66 28 22 42 69 6f 4e 65 77 28 25 70 29 20 63 61 f("BioNew(%p) ca
3370: 6c 6c 65 64 22 2c 20 62 69 6f 29 3b 0a 0a 20 20 lled", bio);..
3380: 20 20 69 66 20 28 62 69 6f 20 3d 3d 20 4e 55 4c if (bio == NUL
3390: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a L) {..return 0;.
33a0: 20 20 20 20 7d 0a 0a 20 20 20 20 42 49 4f 5f 73 }.. BIO_s
33b0: 65 74 5f 64 61 74 61 28 62 69 6f 2c 20 4e 55 4c et_data(bio, NUL
33c0: 4c 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f L);. BIO_set_
33d0: 69 6e 69 74 28 62 69 6f 2c 20 30 29 3b 0a 20 20 init(bio, 0);.
33e0: 20 20 42 49 4f 5f 63 6c 65 61 72 5f 66 6c 61 67 BIO_clear_flag
33f0: 73 28 62 69 6f 2c 20 2d 31 29 3b 0a 20 20 20 20 s(bio, -1);.
3400: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a return 1;.}../*.
3410: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3460: 20 2a 0a 20 2a 20 42 69 6f 46 72 65 65 20 2d 2d *. * BioFree --
3470: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 . *. *.This func
3480: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 tion is used to
3490: 64 65 73 74 72 6f 79 20 61 6e 20 69 6e 73 74 61 destroy an insta
34a0: 6e 63 65 20 6f 66 20 61 20 42 49 4f 2e 20 54 68 nce of a BIO. Th
34b0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 2a 09 77 is function. *.w
34c0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 69 6e ill be called in
34d0: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 response to the
34e0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c application cal
34f0: 6c 69 6e 67 20 74 68 65 20 42 49 4f 5f 66 72 65 ling the BIO_fre
3500: 65 28 29 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 2e e(). *.function.
3510: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
3520: 20 2a 09 52 65 74 75 72 6e 73 20 62 6f 6f 6c 65 *.Returns boole
3530: 61 6e 20 73 75 63 63 65 73 73 20 72 65 73 75 6c an success resul
3540: 74 20 28 31 3d 73 75 63 63 65 73 73 2c 20 30 3d t (1=success, 0=
3550: 66 61 69 6c 75 72 65 29 2e 0a 20 2a 0a 20 2a 20 failure).. *. *
3560: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
3570: 09 44 65 2d 69 6e 69 74 69 61 6c 69 7a 65 73 20 .De-initializes
3580: 42 49 4f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 BIO structure..
3590: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35e0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
35f0: 74 20 42 69 6f 46 72 65 65 28 42 49 4f 20 2a 62 t BioFree(BIO *b
3600: 69 6f 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 io) {. dprint
3610: 66 28 22 42 69 6f 46 72 65 65 28 25 70 29 20 63 f("BioFree(%p) c
3620: 61 6c 6c 65 64 22 2c 20 62 69 6f 29 3b 0a 0a 20 alled", bio);..
3630: 20 20 20 69 66 20 28 62 69 6f 20 3d 3d 20 4e 55 if (bio == NU
3640: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b LL) {..return 0;
3650: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
3660: 6c 65 61 72 20 66 6c 61 67 73 20 69 66 20 73 65 lear flags if se
3670: 74 20 74 6f 20 42 49 4f 5f 43 4c 4f 53 45 20 28 t to BIO_CLOSE (
3680: 63 6c 6f 73 65 20 49 2f 4f 20 73 74 72 65 61 6d close I/O stream
3690: 20 77 68 65 6e 20 74 68 65 20 42 49 4f 20 69 73 when the BIO is
36a0: 20 66 72 65 65 64 29 20 2a 2f 0a 20 20 20 20 69 freed) */. i
36b0: 66 20 28 42 49 4f 5f 67 65 74 5f 73 68 75 74 64 f (BIO_get_shutd
36c0: 6f 77 6e 28 62 69 6f 29 29 20 7b 0a 09 42 49 4f own(bio)) {..BIO
36d0: 5f 73 65 74 5f 64 61 74 61 28 62 69 6f 2c 20 4e _set_data(bio, N
36e0: 55 4c 4c 29 3b 0a 09 42 49 4f 5f 63 6c 65 61 72 ULL);..BIO_clear
36f0: 5f 66 6c 61 67 73 28 62 69 6f 2c 20 2d 31 29 3b _flags(bio, -1);
3700: 0a 09 42 49 4f 5f 73 65 74 5f 69 6e 69 74 28 62 ..BIO_set_init(b
3710: 69 6f 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 io, 0);. }.
3720: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f return 1;.}../
3730: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3760: 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 42 49 4f 5f 6e 65 77 5f -. *. * BIO_new_
3790: 74 63 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 tcl --. *. *.Thi
37a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 s function is us
37b0: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 ed to initialize
37c0: 20 74 68 65 20 42 49 4f 20 6d 65 74 68 6f 64 20 the BIO method
37d0: 68 61 6e 64 6c 65 72 73 2e 0a 20 2a 0a 20 2a 20 handlers.. *. *
37e0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 Results:. *.Retu
37f0: 72 6e 73 20 70 6f 69 6e 74 65 72 20 74 6f 20 42 rns pointer to B
3800: 49 4f 20 6f 72 20 4e 55 4c 4c 20 66 6f 72 20 66 IO or NULL for f
3810: 61 69 6c 75 72 65 0a 20 2a 0a 20 2a 20 53 69 64 ailure. *. * Sid
3820: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 6e e effects:. *.In
3830: 69 74 69 61 6c 69 7a 65 73 20 42 49 4f 20 4d 65 itializes BIO Me
3840: 74 68 6f 64 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d thods.. *. *----
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 42 ---------. */..B
38a0: 49 4f 20 2a 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 IO *BIO_new_tcl(
38b0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c State *statePtr,
38c0: 20 69 6e 74 20 66 6c 61 67 73 29 20 7b 0a 20 20 int flags) {.
38d0: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 23 69 66 64 BIO *bio;.#ifd
38e0: 65 66 20 54 43 4c 54 4c 53 5f 53 53 4c 5f 55 53 ef TCLTLS_SSL_US
38f0: 45 5f 46 41 53 54 50 41 54 48 0a 20 20 20 20 54 E_FASTPATH. T
3900: 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e cl_Channel paren
3910: 74 43 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 63 6f tChannel;. co
3920: 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 nst Tcl_ChannelT
3930: 79 70 65 20 2a 70 61 72 65 6e 74 43 68 61 6e 6e ype *parentChann
3940: 65 6c 54 79 70 65 3b 0a 0a 20 20 20 20 69 6e 74 elType;.. int
3950: 20 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 parentChannelFd
3960: 49 6e 2c 20 70 61 72 65 6e 74 43 68 61 6e 6e 65 In, parentChanne
3970: 6c 46 64 4f 75 74 2c 20 70 61 72 65 6e 74 43 68 lFdOut, parentCh
3980: 61 6e 6e 65 6c 46 64 3b 0a 20 20 20 20 69 6e 74 annelFd;. int
3990: 20 76 61 6c 69 64 50 61 72 65 6e 74 43 68 61 6e validParentChan
39a0: 6e 65 6c 46 64 3b 0a 23 65 6e 64 69 66 0a 0a 20 nelFd;.#endif..
39b0: 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f dprintf("BIO_
39c0: 6e 65 77 5f 74 63 6c 28 29 20 63 61 6c 6c 65 64 new_tcl() called
39d0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 ");.. /* Crea
39e0: 74 65 20 63 75 73 74 6f 6d 20 42 49 4f 20 6d 65 te custom BIO me
39f0: 74 68 6f 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 thod */. if (
3a00: 42 69 6f 4d 65 74 68 6f 64 73 20 3d 3d 20 4e 55 BioMethods == NU
3a10: 4c 4c 29 20 7b 0a 09 2f 2a 20 42 49 4f 5f 54 59 LL) {../* BIO_TY
3a20: 50 45 5f 42 49 4f 20 3d 20 28 31 39 7c 42 49 4f PE_BIO = (19|BIO
3a30: 5f 54 59 50 45 5f 53 4f 55 52 43 45 5f 53 49 4e _TYPE_SOURCE_SIN
3a40: 4b 29 20 2d 2d 20 68 61 6c 66 20 61 20 42 49 4f K) -- half a BIO
3a50: 20 70 61 69 72 20 2a 2f 0a 09 2f 2a 20 63 75 73 pair */../* cus
3a60: 74 6f 6d 20 3d 20 42 49 4f 5f 67 65 74 5f 6e 65 tom = BIO_get_ne
3a70: 77 5f 69 6e 64 65 78 28 29 20 7c 20 42 49 4f 5f w_index() | BIO_
3a80: 54 59 50 45 5f 53 4f 55 52 43 45 5f 53 49 4e 4b TYPE_SOURCE_SINK
3a90: 20 2a 2f 0a 09 42 69 6f 4d 65 74 68 6f 64 73 20 */..BioMethods
3aa0: 3d 20 42 49 4f 5f 6d 65 74 68 5f 6e 65 77 28 42 = BIO_meth_new(B
3ab0: 49 4f 5f 54 59 50 45 5f 42 49 4f 2c 20 22 74 63 IO_TYPE_BIO, "tc
3ac0: 6c 22 29 3b 0a 09 69 66 20 28 42 69 6f 4d 65 74 l");..if (BioMet
3ad0: 68 6f 64 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a hods == NULL) {.
3ae0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 4d 65 . dprintf("Me
3af0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 mory allocation
3b00: 65 72 72 6f 72 22 29 3b 0a 0a 09 20 20 20 20 72 error");... r
3b10: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 eturn NULL;..}..
3b20: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 42 49 4f 5f /* Not used BIO_
3b30: 6d 65 74 68 5f 73 65 74 5f 77 72 69 74 65 5f 65 meth_set_write_e
3b40: 78 20 2a 2f 0a 09 42 49 4f 5f 6d 65 74 68 5f 73 x */..BIO_meth_s
3b50: 65 74 5f 77 72 69 74 65 28 42 69 6f 4d 65 74 68 et_write(BioMeth
3b60: 6f 64 73 2c 20 42 69 6f 4f 75 74 70 75 74 29 3b ods, BioOutput);
3b70: 0a 09 2f 2a 20 4e 6f 74 20 75 73 65 64 20 42 49 ../* Not used BI
3b80: 4f 5f 6d 65 74 68 5f 73 65 74 5f 72 65 61 64 5f O_meth_set_read_
3b90: 65 78 20 2a 2f 0a 09 42 49 4f 5f 6d 65 74 68 5f ex */..BIO_meth_
3ba0: 73 65 74 5f 72 65 61 64 28 42 69 6f 4d 65 74 68 set_read(BioMeth
3bb0: 6f 64 73 2c 20 42 69 6f 49 6e 70 75 74 29 3b 0a ods, BioInput);.
3bc0: 09 42 49 4f 5f 6d 65 74 68 5f 73 65 74 5f 70 75 .BIO_meth_set_pu
3bd0: 74 73 28 42 69 6f 4d 65 74 68 6f 64 73 2c 20 42 ts(BioMethods, B
3be0: 69 6f 50 75 74 73 29 3b 0a 09 42 49 4f 5f 6d 65 ioPuts);..BIO_me
3bf0: 74 68 5f 73 65 74 5f 63 74 72 6c 28 42 69 6f 4d th_set_ctrl(BioM
3c00: 65 74 68 6f 64 73 2c 20 42 69 6f 43 74 72 6c 29 ethods, BioCtrl)
3c10: 3b 0a 09 42 49 4f 5f 6d 65 74 68 5f 73 65 74 5f ;..BIO_meth_set_
3c20: 63 72 65 61 74 65 28 42 69 6f 4d 65 74 68 6f 64 create(BioMethod
3c30: 73 2c 20 42 69 6f 4e 65 77 29 3b 0a 09 42 49 4f s, BioNew);..BIO
3c40: 5f 6d 65 74 68 5f 73 65 74 5f 64 65 73 74 72 6f _meth_set_destro
3c50: 79 28 42 69 6f 4d 65 74 68 6f 64 73 2c 20 42 69 y(BioMethods, Bi
3c60: 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 oFree);. }..
3c70: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20 if (statePtr
3c80: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 64 70 72 69 == NULL) {..dpri
3c90: 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 73 65 ntf("Asked to se
3ca0: 74 75 70 20 61 20 4e 55 4c 4c 20 73 74 61 74 65 tup a NULL state
3cb0: 2c 20 6a 75 73 74 20 63 72 65 61 74 69 6e 67 20 , just creating
3cc0: 74 68 65 20 69 6e 69 74 69 61 6c 20 63 6f 6e 66 the initial conf
3cd0: 69 67 75 72 61 74 69 6f 6e 22 29 3b 0a 0a 09 72 iguration");...r
3ce0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
3cf0: 7d 0a 0a 23 69 66 64 65 66 20 54 43 4c 54 4c 53 }..#ifdef TCLTLS
3d00: 5f 53 53 4c 5f 55 53 45 5f 46 41 53 54 50 41 54 _SSL_USE_FASTPAT
3d10: 48 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 H. /*. *
3d20: 49 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 63 If the channel c
3d30: 61 6e 20 62 65 20 6d 61 70 70 65 64 20 62 61 63 an be mapped bac
3d40: 6b 20 74 6f 20 61 20 66 69 6c 65 20 64 65 73 63 k to a file desc
3d50: 72 69 70 74 6f 72 2c 20 6a 75 73 74 20 75 73 65 riptor, just use
3d60: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 2a the file. *
3d70: 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 74 68 descriptor with
3d80: 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 the SSL library
3d90: 20 73 69 6e 63 65 20 69 74 20 77 69 6c 6c 20 6c since it will l
3da0: 69 6b 65 6c 79 20 62 65 20 6f 70 74 69 6d 69 7a ikely be optimiz
3db0: 65 64 20 66 6f 72 20 74 68 69 73 2e 0a 20 20 20 ed for this..
3dc0: 20 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 43 */. parentC
3dd0: 68 61 6e 6e 65 6c 20 3d 20 54 6c 73 5f 47 65 74 hannel = Tls_Get
3de0: 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c Parent(statePtr,
3df0: 20 30 29 3b 0a 20 20 20 20 70 61 72 65 6e 74 43 0);. parentC
3e00: 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 54 63 6c hannelType = Tcl
3e10: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
3e20: 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 29 3b 0a parentChannel);.
3e30: 0a 20 20 20 20 76 61 6c 69 64 50 61 72 65 6e 74 . validParent
3e40: 43 68 61 6e 6e 65 6c 46 64 20 3d 20 30 3b 0a 20 ChannelFd = 0;.
3e50: 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 70 61 if (strcmp(pa
3e60: 72 65 6e 74 43 68 61 6e 6e 65 6c 54 79 70 65 2d rentChannelType-
3e70: 3e 74 79 70 65 4e 61 6d 65 2c 20 22 74 63 70 22 >typeName, "tcp"
3e80: 29 20 3d 3d 20 30 29 20 7b 0a 09 76 6f 69 64 20 ) == 0) {..void
3e90: 2a 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 *parentChannelFd
3ea0: 49 6e 5f 70 2c 20 2a 70 61 72 65 6e 74 43 68 61 In_p, *parentCha
3eb0: 6e 6e 65 6c 46 64 4f 75 74 5f 70 3b 0a 09 69 6e nnelFdOut_p;..in
3ec0: 74 20 74 63 6c 47 65 74 43 68 61 6e 6e 65 6c 48 t tclGetChannelH
3ed0: 61 6e 64 6c 65 52 65 74 3b 0a 0a 09 74 63 6c 47 andleRet;...tclG
3ee0: 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 52 etChannelHandleR
3ef0: 65 74 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e et = Tcl_GetChan
3f00: 6e 65 6c 48 61 6e 64 6c 65 28 70 61 72 65 6e 74 nelHandle(parent
3f10: 43 68 61 6e 6e 65 6c 2c 0a 09 20 20 20 20 54 43 Channel,.. TC
3f20: 4c 5f 52 45 41 44 41 42 4c 45 2c 20 26 70 61 72 L_READABLE, &par
3f30: 65 6e 74 43 68 61 6e 6e 65 6c 46 64 49 6e 5f 70 entChannelFdIn_p
3f40: 29 3b 0a 09 69 66 20 28 74 63 6c 47 65 74 43 68 );..if (tclGetCh
3f50: 61 6e 6e 65 6c 48 61 6e 64 6c 65 52 65 74 20 3d annelHandleRet =
3f60: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
3f70: 20 74 63 6c 47 65 74 43 68 61 6e 6e 65 6c 48 61 tclGetChannelHa
3f80: 6e 64 6c 65 52 65 74 20 3d 20 54 63 6c 5f 47 65 ndleRet = Tcl_Ge
3f90: 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 tChannelHandle(p
3fa0: 61 72 65 6e 74 43 68 61 6e 6e 65 6c 2c 0a 09 20 arentChannel,..
3fb0: 20 20 20 20 20 20 20 54 43 4c 5f 57 52 49 54 41 TCL_WRITA
3fc0: 42 4c 45 2c 20 26 70 61 72 65 6e 74 43 68 61 6e BLE, &parentChan
3fd0: 6e 65 6c 46 64 4f 75 74 5f 70 29 3b 0a 09 20 20 nelFdOut_p);..
3fe0: 20 20 69 66 20 28 74 63 6c 47 65 74 43 68 61 6e if (tclGetChan
3ff0: 6e 65 6c 48 61 6e 64 6c 65 52 65 74 20 3d 3d 20 nelHandleRet ==
4000: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 70 61 72 65 TCL_OK) {...pare
4010: 6e 74 43 68 61 6e 6e 65 6c 46 64 49 6e 20 3d 20 ntChannelFdIn =
4020: 50 54 52 32 49 4e 54 28 70 61 72 65 6e 74 43 68 PTR2INT(parentCh
4030: 61 6e 6e 65 6c 46 64 49 6e 5f 70 29 3b 0a 09 09 annelFdIn_p);...
4040: 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 4f parentChannelFdO
4050: 75 74 20 3d 20 50 54 52 32 49 4e 54 28 70 61 72 ut = PTR2INT(par
4060: 65 6e 74 43 68 61 6e 6e 65 6c 46 64 4f 75 74 5f entChannelFdOut_
4070: 70 29 3b 0a 09 09 69 66 20 28 70 61 72 65 6e 74 p);...if (parent
4080: 43 68 61 6e 6e 65 6c 46 64 49 6e 20 3d 3d 20 70 ChannelFdIn == p
4090: 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 64 4f 75 arentChannelFdOu
40a0: 74 29 20 7b 0a 09 09 20 20 20 20 70 61 72 65 6e t) {... paren
40b0: 74 43 68 61 6e 6e 65 6c 46 64 20 3d 20 70 61 72 tChannelFd = par
40c0: 65 6e 74 43 68 61 6e 6e 65 6c 46 64 49 6e 3b 0a entChannelFdIn;.
40d0: 09 09 20 20 20 20 76 61 6c 69 64 50 61 72 65 6e .. validParen
40e0: 74 43 68 61 6e 6e 65 6c 46 64 20 3d 20 31 3b 0a tChannelFd = 1;.
40f0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 ..}.. }..}.
4100: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 76 61 6c }.. if (val
4110: 69 64 50 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 idParentChannelF
4120: 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 57 d) {..dprintf("W
4130: 65 20 66 6f 75 6e 64 20 61 20 73 68 6f 72 74 63 e found a shortc
4140: 75 74 2c 20 74 68 69 73 20 63 68 61 6e 6e 65 6c ut, this channel
4150: 20 69 73 20 62 61 63 6b 65 64 20 62 79 20 61 20 is backed by a
4160: 73 6f 63 6b 65 74 3a 20 25 69 22 2c 0a 09 20 20 socket: %i",..
4170: 20 20 70 61 72 65 6e 74 43 68 61 6e 6e 65 6c 46 parentChannelF
4180: 64 49 6e 29 3b 0a 09 62 69 6f 20 3d 20 42 49 4f dIn);..bio = BIO
4190: 5f 6e 65 77 5f 73 6f 63 6b 65 74 28 70 61 72 65 _new_socket(pare
41a0: 6e 74 43 68 61 6e 6e 65 6c 46 64 2c 20 66 6c 61 ntChannelFd, fla
41b0: 67 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e gs);..statePtr->
41c0: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c flags |= TLS_TCL
41d0: 5f 46 41 53 54 50 41 54 48 3b 0a 09 42 49 4f 5f _FASTPATH;..BIO_
41e0: 73 65 74 5f 64 61 74 61 28 62 69 6f 2c 20 73 74 set_data(bio, st
41f0: 61 74 65 50 74 72 29 3b 0a 09 42 49 4f 5f 73 65 atePtr);..BIO_se
4200: 74 5f 73 68 75 74 64 6f 77 6e 28 62 69 6f 2c 20 t_shutdown(bio,
4210: 66 6c 61 67 73 29 3b 0a 09 42 49 4f 5f 73 65 74 flags);..BIO_set
4220: 5f 69 6e 69 74 28 62 69 6f 2c 20 31 29 3b 0a 09 _init(bio, 1);..
4230: 72 65 74 75 72 6e 20 62 69 6f 3b 0a 20 20 20 20 return bio;.
4240: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 64 70 }.#endif.. dp
4250: 72 69 6e 74 66 28 22 46 61 6c 6c 69 6e 67 20 62 rintf("Falling b
4260: 61 63 6b 20 74 6f 20 54 63 6c 20 49 2f 4f 20 66 ack to Tcl I/O f
4270: 6f 72 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 22 or this channel"
4280: 29 3b 0a 0a 20 20 20 20 62 69 6f 20 3d 20 42 49 );.. bio = BI
4290: 4f 5f 6e 65 77 28 42 69 6f 4d 65 74 68 6f 64 73 O_new(BioMethods
42a0: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 64 );. BIO_set_d
42b0: 61 74 61 28 62 69 6f 2c 20 73 74 61 74 65 50 74 ata(bio, statePt
42c0: 72 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f r);. BIO_set_
42d0: 73 68 75 74 64 6f 77 6e 28 62 69 6f 2c 20 66 6c shutdown(bio, fl
42e0: 61 67 73 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 ags);. BIO_se
42f0: 74 5f 69 6e 69 74 28 62 69 6f 2c 20 31 29 3b 20 t_init(bio, 1);
4300: 2f 2a 20 45 6e 61 62 6c 65 20 72 65 61 64 20 26 /* Enable read &
4310: 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 72 65 write */. re
4320: 74 75 72 6e 20 62 69 6f 3b 0a 7d 0a 0a 2f 2a 0a turn bio;.}../*.
4330: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4380: 20 2a 0a 20 2a 20 42 49 4f 5f 63 6c 65 61 6e 75 *. * BIO_cleanu
4390: 70 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 p --. *. *.This
43a0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 function is used
43b0: 20 74 6f 20 64 65 73 74 72 6f 79 20 61 20 42 49 to destroy a BI
43c0: 4f 5f 4d 45 54 48 4f 44 20 73 74 72 75 63 74 75 O_METHOD structu
43d0: 72 65 20 61 6e 64 20 66 72 65 65 20 75 70 20 61 re and free up a
43e0: 6e 79 0a 20 2a 09 6d 65 6d 6f 72 79 20 61 73 73 ny. *.memory ass
43f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 69 74 2e ociated with it.
4400: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
4410: 20 2a 09 53 74 61 6e 64 61 72 64 20 54 43 4c 20 *.Standard TCL
4420: 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 result. *. * Sid
4430: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 e effects:. *.De
4440: 73 74 72 6f 79 73 20 42 49 4f 20 4d 65 74 68 6f stroys BIO Metho
4450: 64 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ds.. *. *-------
4460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44a0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 20 ------. */..int
44b0: 42 49 4f 5f 63 6c 65 61 6e 75 70 20 28 29 20 7b BIO_cleanup () {
44c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 . dprintf("BI
44d0: 4f 5f 63 6c 65 61 6e 75 70 28 29 20 63 61 6c 6c O_cleanup() call
44e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 42 ed");.. if (B
44f0: 69 6f 4d 65 74 68 6f 64 73 20 21 3d 20 4e 55 4c ioMethods != NUL
4500: 4c 29 20 7b 0a 09 42 49 4f 5f 6d 65 74 68 5f 66 L) {..BIO_meth_f
4510: 72 65 65 28 42 69 6f 4d 65 74 68 6f 64 73 29 3b ree(BioMethods);
4520: 0a 09 42 69 6f 4d 65 74 68 6f 64 73 20 3d 20 4e ..BioMethods = N
4530: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ULL;. }. r
4540: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.