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