Hex Artifact Content

Artifact 9efb936c9c9e172e375e3adc8232ccfbbafc5feb4f10b8c87f691a7b16397119:


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;.}.