Tcl Source Code

Hex Artifact Content
Login

Artifact f729943df9afa4076414b598a8e9be1534cb8e0990cc9d39c8dd1937124801ad:


0000: 2f 2a 0a 20 2a 20 74 63 6c 57 69 6e 50 69 70 65  /*. * tclWinPipe
0010: 2e 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  .c --. *. *.This
0020: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0030: 20 74 68 65 20 57 69 6e 64 6f 77 73 2d 73 70 65   the Windows-spe
0040: 63 69 66 69 63 20 65 78 65 63 20 70 69 70 65 6c  cific exec pipel
0050: 69 6e 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74  ine functions, t
0060: 68 65 0a 20 2a 09 22 70 69 70 65 22 20 63 68 61  he. *."pipe" cha
0070: 6e 6e 65 6c 20 64 72 69 76 65 72 2c 20 61 6e 64  nnel driver, and
0080: 20 74 68 65 20 22 70 69 64 22 20 54 63 6c 20 63   the "pid" Tcl c
0090: 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 20 43 6f  ommand.. *. * Co
00a0: 70 79 72 69 67 68 74 20 c2 a9 20 31 39 39 36 2d  pyright © 1996-
00b0: 31 39 39 37 20 53 75 6e 20 4d 69 63 72 6f 73 79  1997 Sun Microsy
00c0: 73 74 65 6d 73 2c 20 49 6e 63 2e 0a 20 2a 0a 20  stems, Inc.. *. 
00d0: 2a 20 53 65 65 20 74 68 65 20 66 69 6c 65 20 22  * See the file "
00e0: 6c 69 63 65 6e 73 65 2e 74 65 72 6d 73 22 20 66  license.terms" f
00f0: 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  or information o
0100: 6e 20 75 73 61 67 65 20 61 6e 64 20 72 65 64 69  n usage and redi
0110: 73 74 72 69 62 75 74 69 6f 6e 20 6f 66 0a 20 2a  stribution of. *
0120: 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20   this file, and 
0130: 66 6f 72 20 61 20 44 49 53 43 4c 41 49 4d 45 52  for a DISCLAIMER
0140: 20 4f 46 20 41 4c 4c 20 57 41 52 52 41 4e 54 49   OF ALL WARRANTI
0150: 45 53 2e 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64  ES.. */..#includ
0160: 65 20 22 74 63 6c 57 69 6e 49 6e 74 2e 68 22 0a  e "tclWinInt.h".
0170: 0a 2f 2a 0a 20 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*. * The follo
0180: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73  wing variable is
0190: 20 75 73 65 64 20 74 6f 20 74 65 6c 6c 20 77 68   used to tell wh
01a0: 65 74 68 65 72 20 74 68 69 73 20 6d 6f 64 75 6c  ether this modul
01b0: 65 20 68 61 73 20 62 65 65 6e 0a 20 2a 20 69 6e  e has been. * in
01c0: 69 74 69 61 6c 69 7a 65 64 2e 0a 20 2a 2f 0a 0a  itialized.. */..
01d0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69  static int initi
01e0: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 2f 2a 0a  alized = 0;../*.
01f0: 20 2a 20 54 68 65 20 70 69 70 65 4d 75 74 65 78   * The pipeMutex
0200: 20 6c 6f 63 6b 73 20 61 72 6f 75 6e 64 20 61 63   locks around ac
0210: 63 65 73 73 20 74 6f 20 74 68 65 20 69 6e 69 74  cess to the init
0220: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 72 6f 63  ialized and proc
0230: 4c 69 73 74 0a 20 2a 20 76 61 72 69 61 62 6c 65  List. * variable
0240: 73 2c 20 61 6e 64 20 69 74 20 69 73 20 75 73 65  s, and it is use
0250: 64 20 74 6f 20 70 72 6f 74 65 63 74 20 62 61 63  d to protect bac
0260: 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 73 20  kground threads 
0270: 66 72 6f 6d 20 62 65 69 6e 67 0a 20 2a 20 74 65  from being. * te
0280: 72 6d 69 6e 61 74 65 64 20 77 68 69 6c 65 20 74  rminated while t
0290: 68 65 79 20 61 72 65 20 75 73 69 6e 67 20 41 50  hey are using AP
02a0: 49 73 20 74 68 61 74 20 68 6f 6c 64 20 6c 6f 63  Is that hold loc
02b0: 6b 73 2e 0a 20 2a 2f 0a 0a 54 43 4c 5f 44 45 43  ks.. */..TCL_DEC
02c0: 4c 41 52 45 5f 4d 55 54 45 58 28 70 69 70 65 4d  LARE_MUTEX(pipeM
02d0: 75 74 65 78 29 0a 0a 2f 2a 0a 20 2a 20 54 68 65  utex)../*. * The
02e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65   following value
02f0: 73 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 76  s identify the v
0300: 61 72 69 6f 75 73 20 74 79 70 65 73 20 6f 66 20  arious types of 
0310: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61  applications tha
0320: 74 20 72 75 6e 0a 20 2a 20 75 6e 64 65 72 20 57  t run. * under W
0330: 69 6e 64 6f 77 73 2e 20 54 68 65 72 65 20 69 73  indows. There is
0340: 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 63 6f   special case co
0350: 64 65 20 66 6f 72 20 74 68 65 20 76 61 72 69 6f  de for the vario
0360: 75 73 20 74 79 70 65 73 2e 0a 20 2a 2f 0a 65 6e  us types.. */.en
0370: 75 6d 20 54 63 6c 57 69 6e 41 70 70 6c 69 63 61  um TclWinApplica
0380: 74 69 6f 6e 54 79 70 65 73 20 7b 0a 20 20 20 20  tionTypes {.    
0390: 41 50 50 4c 5f 4e 4f 4e 45 20 3d 20 30 2c 0a 20  APPL_NONE = 0,. 
03a0: 20 20 20 41 50 50 4c 5f 44 4f 53 20 3d 20 31 2c     APPL_DOS = 1,
03b0: 0a 20 20 20 20 41 50 50 4c 5f 57 49 4e 33 58 20  .    APPL_WIN3X 
03c0: 3d 20 32 2c 0a 20 20 20 20 41 50 50 4c 5f 57 49  = 2,.    APPL_WI
03d0: 4e 33 32 20 3d 20 33 0a 7d 3b 0a 0a 2f 2a 0a 20  N32 = 3.};../*. 
03e0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
03f0: 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 73 74  constants and st
0400: 72 75 63 74 75 72 65 73 20 61 72 65 20 75 73 65  ructures are use
0410: 64 20 74 6f 20 65 6e 63 61 70 73 75 6c 61 74 65  d to encapsulate
0420: 20 74 68 65 20 73 74 61 74 65 20 6f 66 0a 20 2a   the state of. *
0430: 20 76 61 72 69 6f 75 73 20 74 79 70 65 73 20 6f   various types o
0440: 66 20 66 69 6c 65 73 20 75 73 65 64 20 69 6e 20  f files used in 
0450: 61 20 70 69 70 65 6c 69 6e 65 2e 20 54 68 69 73  a pipeline. This
0460: 20 75 73 65 64 20 74 6f 20 68 61 76 65 20 61 20   used to have a 
0470: 31 20 26 26 20 32 20 74 68 61 74 0a 20 2a 20 73  1 && 2 that. * s
0480: 75 70 70 6f 72 74 65 64 20 57 69 6e 33 32 73 2e  upported Win32s.
0490: 0a 20 2a 2f 0a 65 6e 75 6d 20 50 69 70 65 53 74  . */.enum PipeSt
04a0: 61 67 65 49 64 73 20 7b 0a 20 20 20 20 57 49 4e  ageIds {.    WIN
04b0: 5f 46 49 4c 45 20 3d 20 33 09 09 2f 2a 20 42 61  _FILE = 3../* Ba
04c0: 73 69 63 20 57 69 6e 33 32 20 66 69 6c 65 2e 20  sic Win32 file. 
04d0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 69  */.};../*. * Thi
04e0: 73 20 73 74 72 75 63 74 75 72 65 20 65 6e 63 61  s structure enca
04f0: 70 73 75 6c 61 74 65 73 20 74 68 65 20 63 6f 6d  psulates the com
0500: 6d 6f 6e 20 73 74 61 74 65 20 61 73 73 6f 63 69  mon state associ
0510: 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20 66 69  ated with all fi
0520: 6c 65 20 74 79 70 65 73 0a 20 2a 20 75 73 65 64  le types. * used
0530: 20 69 6e 20 61 20 70 69 70 65 6c 69 6e 65 2e 0a   in a pipeline..
0540: 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72   */..typedef str
0550: 75 63 74 20 7b 0a 20 20 20 20 69 6e 74 20 74 79  uct {.    int ty
0560: 70 65 3b 09 09 09 2f 2a 20 4f 6e 65 20 6f 66 20  pe;.../* One of 
0570: 74 68 65 20 66 69 6c 65 20 74 79 70 65 73 20 64  the file types d
0580: 65 66 69 6e 65 64 20 61 62 6f 76 65 2e 20 2a 2f  efined above. */
0590: 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 61 6e 64  .    HANDLE hand
05a0: 6c 65 3b 09 09 2f 2a 20 4f 70 65 6e 20 66 69 6c  le;../* Open fil
05b0: 65 20 68 61 6e 64 6c 65 2e 20 2a 2f 0a 7d 20 57  e handle. */.} W
05c0: 69 6e 46 69 6c 65 3b 0a 0a 2f 2a 0a 20 2a 20 54  inFile;../*. * T
05d0: 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64  his list is used
05e0: 20 74 6f 20 6d 61 70 20 66 72 6f 6d 20 70 69 64   to map from pid
05f0: 73 20 74 6f 20 70 72 6f 63 65 73 73 20 68 61 6e  s to process han
0600: 64 6c 65 73 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64  dles.. */..typed
0610: 65 66 20 73 74 72 75 63 74 20 50 72 6f 63 49 6e  ef struct ProcIn
0620: 66 6f 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  fo {.    HANDLE 
0630: 68 50 72 6f 63 65 73 73 3b 0a 20 20 20 20 69 6e  hProcess;.    in
0640: 74 20 64 77 50 72 6f 63 65 73 73 49 64 3b 0a 20  t dwProcessId;. 
0650: 20 20 20 73 74 72 75 63 74 20 50 72 6f 63 49 6e     struct ProcIn
0660: 66 6f 20 2a 6e 65 78 74 50 74 72 3b 0a 7d 20 50  fo *nextPtr;.} P
0670: 72 6f 63 49 6e 66 6f 3b 0a 0a 73 74 61 74 69 63  rocInfo;..static
0680: 20 50 72 6f 63 49 6e 66 6f 20 2a 70 72 6f 63 4c   ProcInfo *procL
0690: 69 73 74 3b 0a 0a 2f 2a 0a 20 2a 20 42 69 74 20  ist;../*. * Bit 
06a0: 6d 61 73 6b 73 20 75 73 65 64 20 69 6e 20 74 68  masks used in th
06b0: 65 20 66 6c 61 67 73 2f 72 65 61 64 46 6c 61 67  e flags/readFlag
06c0: 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  s fields of the 
06d0: 50 69 70 65 49 6e 66 6f 20 73 74 72 75 63 74 75  PipeInfo structu
06e0: 72 65 20 62 65 6c 6f 77 2e 0a 20 2a 2f 0a 65 6e  re below.. */.en
06f0: 75 6d 20 54 63 6c 57 69 6e 50 69 70 65 49 6e 66  um TclWinPipeInf
0700: 6f 46 6c 61 67 73 20 7b 0a 20 20 20 20 50 49 50  oFlags {.    PIP
0710: 45 5f 50 45 4e 44 49 4e 47 20 3d 20 31 3c 3c 30  E_PENDING = 1<<0
0720: 2c 09 2f 2a 20 4d 65 73 73 61 67 65 20 69 73 20  ,./* Message is 
0730: 70 65 6e 64 69 6e 67 20 69 6e 20 74 68 65 20 71  pending in the q
0740: 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 50 49 50  ueue. */.    PIP
0750: 45 5f 41 53 59 4e 43 20 3d 20 31 3c 3c 31 2c 09  E_ASYNC = 1<<1,.
0760: 09 2f 2a 20 43 68 61 6e 6e 65 6c 20 69 73 20 6e  ./* Channel is n
0770: 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 2e 20 2a 2f 0a  on-blocking. */.
0780: 20 20 20 20 50 49 50 45 5f 45 4f 46 20 3d 20 31      PIPE_EOF = 1
0790: 3c 3c 32 2c 09 09 2f 2a 20 50 69 70 65 20 68 61  <<2,../* Pipe ha
07a0: 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 20 2a  s reached EOF. *
07b0: 2f 0a 20 20 20 20 50 49 50 45 5f 45 58 54 52 41  /.    PIPE_EXTRA
07c0: 42 59 54 45 20 3d 20 31 3c 3c 33 09 2f 2a 20 54  BYTE = 1<<3./* T
07d0: 68 65 20 72 65 61 64 65 72 20 74 68 72 65 61 64  he reader thread
07e0: 20 68 61 73 20 63 6f 6e 73 75 6d 65 64 20 6f 6e   has consumed on
07f0: 65 20 62 79 74 65 2e 20 2a 2f 0a 7d 3b 0a 0a 2f  e byte. */.};../
0800: 2a 0a 20 2a 20 54 4f 44 4f 3a 20 49 74 20 61 70  *. * TODO: It ap
0810: 70 65 61 72 73 20 74 68 65 20 77 68 6f 6c 65 20  pears the whole 
0820: 45 58 54 52 41 42 59 54 45 20 6d 61 63 68 69 6e  EXTRABYTE machin
0830: 65 72 79 20 69 73 20 69 6e 20 70 6c 61 63 65 20  ery is in place 
0840: 74 6f 20 73 75 70 70 6f 72 74 0a 20 2a 20 6f 75  to support. * ou
0850: 74 64 61 74 65 64 20 57 69 6e 20 39 35 20 73 79  tdated Win 95 sy
0860: 73 74 65 6d 73 2e 20 20 49 66 20 74 68 69 73 20  stems.  If this 
0870: 63 61 6e 20 62 65 20 63 6f 6e 66 69 72 6d 65 64  can be confirmed
0880: 2c 20 6d 75 63 68 20 63 6f 64 65 20 63 61 6e 20  , much code can 
0890: 62 65 0a 20 2a 20 64 65 6c 65 74 65 64 2e 0a 20  be. * deleted.. 
08a0: 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73  */../*. * This s
08b0: 74 72 75 63 74 75 72 65 20 64 65 73 63 72 69 62  tructure describ
08c0: 65 73 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20  es per-instance 
08d0: 64 61 74 61 20 66 6f 72 20 61 20 70 69 70 65 20  data for a pipe 
08e0: 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20  based channel.. 
08f0: 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  */..typedef stru
0900: 63 74 20 50 69 70 65 49 6e 66 6f 20 7b 0a 20 20  ct PipeInfo {.  
0910: 20 20 73 74 72 75 63 74 20 50 69 70 65 49 6e 66    struct PipeInf
0920: 6f 20 2a 6e 65 78 74 50 74 72 3b 09 2f 2a 20 50  o *nextPtr;./* P
0930: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20 72  ointer to next r
0940: 65 67 69 73 74 65 72 65 64 20 70 69 70 65 2e 20  egistered pipe. 
0950: 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  */.    Tcl_Chann
0960: 65 6c 20 63 68 61 6e 6e 65 6c 3b 09 2f 2a 20 50  el channel;./* P
0970: 6f 69 6e 74 65 72 20 74 6f 20 63 68 61 6e 6e 65  ointer to channe
0980: 6c 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  l structure. */.
0990: 20 20 20 20 69 6e 74 20 76 61 6c 69 64 4d 61 73      int validMas
09a0: 6b 3b 09 09 2f 2a 20 4f 52 27 65 64 20 63 6f 6d  k;../* OR'ed com
09b0: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f  bination of TCL_
09c0: 52 45 41 44 41 42 4c 45 2c 0a 09 09 09 09 20 2a  READABLE,..... *
09d0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 2c 20 6f   TCL_WRITABLE, o
09e0: 72 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 3a  r TCL_EXCEPTION:
09f0: 20 69 6e 64 69 63 61 74 65 73 0a 09 09 09 09 20   indicates..... 
0a00: 2a 20 77 68 69 63 68 20 6f 70 65 72 61 74 69 6f  * which operatio
0a10: 6e 73 20 61 72 65 20 76 61 6c 69 64 20 6f 6e 20  ns are valid on 
0a20: 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  the file. */.   
0a30: 20 69 6e 74 20 77 61 74 63 68 4d 61 73 6b 3b 09   int watchMask;.
0a40: 09 2f 2a 20 4f 52 27 65 64 20 63 6f 6d 62 69 6e  ./* OR'ed combin
0a50: 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41  ation of TCL_REA
0a60: 44 41 42 4c 45 2c 0a 09 09 09 09 20 2a 20 54 43  DABLE,..... * TC
0a70: 4c 5f 57 52 49 54 41 42 4c 45 2c 20 6f 72 20 54  L_WRITABLE, or T
0a80: 43 4c 5f 45 58 43 45 50 54 49 4f 4e 3a 20 69 6e  CL_EXCEPTION: in
0a90: 64 69 63 61 74 65 73 0a 09 09 09 09 20 2a 20 77  dicates..... * w
0aa0: 68 69 63 68 20 65 76 65 6e 74 73 20 73 68 6f 75  hich events shou
0ab0: 6c 64 20 62 65 20 72 65 70 6f 72 74 65 64 2e 20  ld be reported. 
0ac0: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  */.    int flags
0ad0: 3b 09 09 09 2f 2a 20 53 74 61 74 65 20 66 6c 61  ;.../* State fla
0ae0: 67 73 2c 20 73 65 65 20 61 62 6f 76 65 20 66 6f  gs, see above fo
0af0: 72 20 61 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20  r a list. */.   
0b00: 20 54 63 6c 46 69 6c 65 20 72 65 61 64 46 69 6c   TclFile readFil
0b10: 65 3b 09 09 2f 2a 20 4f 75 74 70 75 74 20 66 72  e;../* Output fr
0b20: 6f 6d 20 70 69 70 65 2e 20 2a 2f 0a 20 20 20 20  om pipe. */.    
0b30: 54 63 6c 46 69 6c 65 20 77 72 69 74 65 46 69 6c  TclFile writeFil
0b40: 65 3b 09 09 2f 2a 20 49 6e 70 75 74 20 66 72 6f  e;../* Input fro
0b50: 6d 20 70 69 70 65 2e 20 2a 2f 0a 20 20 20 20 54  m pipe. */.    T
0b60: 63 6c 46 69 6c 65 20 65 72 72 6f 72 46 69 6c 65  clFile errorFile
0b70: 3b 09 09 2f 2a 20 45 72 72 6f 72 20 6f 75 74 70  ;../* Error outp
0b80: 75 74 20 66 72 6f 6d 20 70 69 70 65 2e 20 2a 2f  ut from pipe. */
0b90: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 50  .    size_t numP
0ba0: 69 64 73 3b 09 09 2f 2a 20 4e 75 6d 62 65 72 20  ids;../* Number 
0bb0: 6f 66 20 70 72 6f 63 65 73 73 65 73 20 61 74 74  of processes att
0bc0: 61 63 68 65 64 20 74 6f 20 70 69 70 65 2e 20 2a  ached to pipe. *
0bd0: 2f 0a 20 20 20 20 54 63 6c 5f 50 69 64 20 2a 70  /.    Tcl_Pid *p
0be0: 69 64 50 74 72 3b 09 09 2f 2a 20 50 69 64 73 20  idPtr;../* Pids 
0bf0: 6f 66 20 61 74 74 61 63 68 65 64 20 70 72 6f 63  of attached proc
0c00: 65 73 73 65 73 2e 20 2a 2f 0a 20 20 20 20 54 63  esses. */.    Tc
0c10: 6c 5f 54 68 72 65 61 64 49 64 20 74 68 72 65 61  l_ThreadId threa
0c20: 64 49 64 3b 09 2f 2a 20 54 68 72 65 61 64 20 74  dId;./* Thread t
0c30: 6f 20 77 68 69 63 68 20 65 76 65 6e 74 73 20 73  o which events s
0c40: 68 6f 75 6c 64 20 62 65 20 72 65 70 6f 72 74 65  hould be reporte
0c50: 64 2e 0a 09 09 09 09 20 2a 20 54 68 69 73 20 76  d...... * This v
0c60: 61 6c 75 65 20 69 73 20 75 73 65 64 20 62 79 20  alue is used by 
0c70: 74 68 65 20 72 65 61 64 65 72 2f 77 72 69 74 65  the reader/write
0c80: 72 0a 09 09 09 09 20 2a 20 74 68 72 65 61 64 73  r..... * threads
0c90: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 50 69 70 65  . */.    TclPipe
0ca0: 54 68 72 65 61 64 49 6e 66 6f 20 2a 77 72 69 74  ThreadInfo *writ
0cb0: 65 54 49 3b 09 2f 2a 20 54 68 72 65 61 64 20 69  eTI;./* Thread i
0cc0: 6e 66 6f 20 6f 66 20 77 72 69 74 65 72 20 61 6e  nfo of writer an
0cd0: 64 20 72 65 61 64 65 72 2c 20 74 68 69 73 20 2a  d reader, this *
0ce0: 2f 0a 20 20 20 20 54 63 6c 50 69 70 65 54 68 72  /.    TclPipeThr
0cf0: 65 61 64 49 6e 66 6f 20 2a 72 65 61 64 54 49 3b  eadInfo *readTI;
0d00: 09 2f 2a 20 73 74 72 75 63 74 75 72 65 20 6f 77  ./* structure ow
0d10: 6e 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e  ned by correspon
0d20: 64 69 6e 67 20 74 68 72 65 61 64 2e 20 2a 2f 0a  ding thread. */.
0d30: 20 20 20 20 48 41 4e 44 4c 45 20 77 72 69 74 65      HANDLE write
0d40: 54 68 72 65 61 64 3b 09 09 2f 2a 20 48 61 6e 64  Thread;../* Hand
0d50: 6c 65 20 74 6f 20 77 72 69 74 65 72 20 74 68 72  le to writer thr
0d60: 65 61 64 2e 20 2a 2f 0a 20 20 20 20 48 41 4e 44  ead. */.    HAND
0d70: 4c 45 20 72 65 61 64 54 68 72 65 61 64 3b 09 09  LE readThread;..
0d80: 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 61  /* Handle to rea
0d90: 64 65 72 20 74 68 72 65 61 64 2e 20 2a 2f 0a 0a  der thread. */..
0da0: 20 20 20 20 48 41 4e 44 4c 45 20 77 72 69 74 61      HANDLE writa
0db0: 62 6c 65 3b 09 09 2f 2a 20 4d 61 6e 75 61 6c 2d  ble;../* Manual-
0dc0: 72 65 73 65 74 20 65 76 65 6e 74 20 74 6f 20 73  reset event to s
0dd0: 69 67 6e 61 6c 20 77 68 65 6e 20 74 68 65 0a 09  ignal when the..
0de0: 09 09 09 20 2a 20 77 72 69 74 65 72 20 74 68 72  ... * writer thr
0df0: 65 61 64 20 68 61 73 20 66 69 6e 69 73 68 65 64  ead has finished
0e00: 20 77 61 69 74 69 6e 67 20 66 6f 72 20 74 68 65   waiting for the
0e10: 0a 09 09 09 09 20 2a 20 63 75 72 72 65 6e 74 20  ..... * current 
0e20: 62 75 66 66 65 72 20 74 6f 20 62 65 20 77 72 69  buffer to be wri
0e30: 74 74 65 6e 2e 20 2a 2f 0a 20 20 20 20 48 41 4e  tten. */.    HAN
0e40: 44 4c 45 20 72 65 61 64 61 62 6c 65 3b 09 09 2f  DLE readable;../
0e50: 2a 20 4d 61 6e 75 61 6c 2d 72 65 73 65 74 20 65  * Manual-reset e
0e60: 76 65 6e 74 20 74 6f 20 73 69 67 6e 61 6c 20 77  vent to signal w
0e70: 68 65 6e 20 74 68 65 0a 09 09 09 09 20 2a 20 72  hen the..... * r
0e80: 65 61 64 65 72 20 74 68 72 65 61 64 20 68 61 73  eader thread has
0e90: 20 66 69 6e 69 73 68 65 64 20 77 61 69 74 69 6e   finished waitin
0ea0: 67 20 66 6f 72 0a 09 09 09 09 20 2a 20 69 6e 70  g for..... * inp
0eb0: 75 74 2e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  ut. */.    DWORD
0ec0: 20 77 72 69 74 65 45 72 72 6f 72 3b 09 09 2f 2a   writeError;../*
0ed0: 20 41 6e 20 65 72 72 6f 72 20 63 61 75 73 65 64   An error caused
0ee0: 20 62 79 20 74 68 65 20 6c 61 73 74 20 62 61 63   by the last bac
0ef0: 6b 67 72 6f 75 6e 64 0a 09 09 09 09 20 2a 20 77  kground..... * w
0f00: 72 69 74 65 2e 20 53 65 74 20 74 6f 20 30 20 69  rite. Set to 0 i
0f10: 66 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 62  f no error has b
0f20: 65 65 6e 0a 09 09 09 09 20 2a 20 64 65 74 65 63  een..... * detec
0f30: 74 65 64 2e 20 54 68 69 73 20 77 6f 72 64 20 69  ted. This word i
0f40: 73 20 73 68 61 72 65 64 20 77 69 74 68 20 74 68  s shared with th
0f50: 65 0a 09 09 09 09 20 2a 20 77 72 69 74 65 72 20  e..... * writer 
0f60: 74 68 72 65 61 64 20 73 6f 20 61 63 63 65 73 73  thread so access
0f70: 20 6d 75 73 74 20 62 65 0a 09 09 09 09 20 2a 20   must be..... * 
0f80: 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 77 69 74  synchronized wit
0f90: 68 20 74 68 65 20 77 72 69 74 61 62 6c 65 20 6f  h the writable o
0fa0: 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 63 68  bject. */.    ch
0fb0: 61 72 20 2a 77 72 69 74 65 42 75 66 3b 09 09 2f  ar *writeBuf;../
0fc0: 2a 20 43 75 72 72 65 6e 74 20 62 61 63 6b 67 72  * Current backgr
0fd0: 6f 75 6e 64 20 6f 75 74 70 75 74 20 62 75 66 66  ound output buff
0fe0: 65 72 2e 20 41 63 63 65 73 73 20 69 73 0a 09 09  er. Access is...
0ff0: 09 09 20 2a 20 73 79 6e 63 68 72 6f 6e 69 7a 65  .. * synchronize
1000: 64 20 77 69 74 68 20 74 68 65 20 77 72 69 74 61  d with the writa
1010: 62 6c 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  ble object. */. 
1020: 20 20 20 69 6e 74 20 77 72 69 74 65 42 75 66 4c     int writeBufL
1030: 65 6e 3b 09 09 2f 2a 20 53 69 7a 65 20 6f 66 20  en;../* Size of 
1040: 77 72 69 74 65 20 62 75 66 66 65 72 2e 20 41 63  write buffer. Ac
1050: 63 65 73 73 20 69 73 0a 09 09 09 09 20 2a 20 73  cess is..... * s
1060: 79 6e 63 68 72 6f 6e 69 7a 65 64 20 77 69 74 68  ynchronized with
1070: 20 74 68 65 20 77 72 69 74 61 62 6c 65 20 6f 62   the writable ob
1080: 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ject. */.    int
1090: 20 74 6f 57 72 69 74 65 3b 09 09 2f 2a 20 43 75   toWrite;../* Cu
10a0: 72 72 65 6e 74 20 61 6d 6f 75 6e 74 20 74 6f 20  rrent amount to 
10b0: 62 65 20 77 72 69 74 74 65 6e 2e 20 41 63 63 65  be written. Acce
10c0: 73 73 20 69 73 0a 09 09 09 09 20 2a 20 73 79 6e  ss is..... * syn
10d0: 63 68 72 6f 6e 69 7a 65 64 20 77 69 74 68 20 74  chronized with t
10e0: 68 65 20 77 72 69 74 61 62 6c 65 20 6f 62 6a 65  he writable obje
10f0: 63 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ct. */.    int r
1100: 65 61 64 46 6c 61 67 73 3b 09 09 2f 2a 20 46 6c  eadFlags;../* Fl
1110: 61 67 73 20 74 68 61 74 20 61 72 65 20 73 68 61  ags that are sha
1120: 72 65 64 20 77 69 74 68 20 74 68 65 20 72 65 61  red with the rea
1130: 64 65 72 0a 09 09 09 09 20 2a 20 74 68 72 65 61  der..... * threa
1140: 64 2e 20 41 63 63 65 73 73 20 69 73 20 73 79 6e  d. Access is syn
1150: 63 68 72 6f 6e 69 7a 65 64 20 77 69 74 68 20 74  chronized with t
1160: 68 65 0a 09 09 09 09 20 2a 20 72 65 61 64 61 62  he..... * readab
1170: 6c 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  le object. */.  
1180: 20 20 63 68 61 72 20 65 78 74 72 61 42 79 74 65    char extraByte
1190: 3b 09 09 2f 2a 20 42 75 66 66 65 72 20 66 6f 72  ;../* Buffer for
11a0: 20 65 78 74 72 61 20 63 68 61 72 61 63 74 65 72   extra character
11b0: 20 63 6f 6e 73 75 6d 65 64 20 62 79 0a 09 09 09   consumed by....
11c0: 09 20 2a 20 72 65 61 64 65 72 20 74 68 72 65 61  . * reader threa
11d0: 64 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20  d. This byte is 
11e0: 73 68 61 72 65 64 20 77 69 74 68 20 74 68 65 0a  shared with the.
11f0: 09 09 09 09 20 2a 20 72 65 61 64 65 72 20 74 68  .... * reader th
1200: 72 65 61 64 20 73 6f 20 61 63 63 65 73 73 20 6d  read so access m
1210: 75 73 74 20 62 65 0a 09 09 09 09 20 2a 20 73 79  ust be..... * sy
1220: 6e 63 68 72 6f 6e 69 7a 65 64 20 77 69 74 68 20  nchronized with 
1230: 74 68 65 20 72 65 61 64 61 62 6c 65 20 6f 62 6a  the readable obj
1240: 65 63 74 2e 20 2a 2f 0a 7d 20 50 69 70 65 49 6e  ect. */.} PipeIn
1250: 66 6f 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72  fo;..typedef str
1260: 75 63 74 20 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  uct {.    /*.   
1270: 20 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e    * The followin
1280: 67 20 70 6f 69 6e 74 65 72 20 72 65 66 65 72 73  g pointer refers
1290: 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
12a0: 74 68 65 20 6c 69 73 74 20 6f 66 20 70 69 70 65  the list of pipe
12b0: 73 20 74 68 61 74 20 61 72 65 0a 20 20 20 20 20  s that are.     
12c0: 2a 20 62 65 69 6e 67 20 77 61 74 63 68 65 64 20  * being watched 
12d0: 66 6f 72 20 66 69 6c 65 20 65 76 65 6e 74 73 2e  for file events.
12e0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 50 69  .     */..    Pi
12f0: 70 65 49 6e 66 6f 20 2a 66 69 72 73 74 50 69 70  peInfo *firstPip
1300: 65 50 74 72 3b 0a 7d 20 54 68 72 65 61 64 53 70  ePtr;.} ThreadSp
1310: 65 63 69 66 69 63 44 61 74 61 3b 0a 0a 73 74 61  ecificData;..sta
1320: 74 69 63 20 54 63 6c 5f 54 68 72 65 61 64 44 61  tic Tcl_ThreadDa
1330: 74 61 4b 65 79 20 64 61 74 61 4b 65 79 3b 0a 0a  taKey dataKey;..
1340: 2f 2a 0a 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*. * The follow
1350: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
1360: 20 77 68 61 74 20 69 73 20 61 64 64 65 64 20 74   what is added t
1370: 6f 20 74 68 65 20 54 63 6c 20 65 76 65 6e 74 20  o the Tcl event 
1380: 71 75 65 75 65 20 77 68 65 6e 20 70 69 70 65 0a  queue when pipe.
1390: 20 2a 20 65 76 65 6e 74 73 20 61 72 65 20 67 65   * events are ge
13a0: 6e 65 72 61 74 65 64 2e 0a 20 2a 2f 0a 0a 74 79  nerated.. */..ty
13b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 7b 0a 20  pedef struct {. 
13c0: 20 20 20 54 63 6c 5f 45 76 65 6e 74 20 68 65 61     Tcl_Event hea
13d0: 64 65 72 3b 09 09 2f 2a 20 49 6e 66 6f 72 6d 61  der;../* Informa
13e0: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 73 74 61  tion that is sta
13f0: 6e 64 61 72 64 20 66 6f 72 20 61 6c 6c 0a 09 09  ndard for all...
1400: 09 09 20 2a 20 65 76 65 6e 74 73 2e 20 2a 2f 0a  .. * events. */.
1410: 20 20 20 20 50 69 70 65 49 6e 66 6f 20 2a 69 6e      PipeInfo *in
1420: 66 6f 50 74 72 3b 09 09 2f 2a 20 50 6f 69 6e 74  foPtr;../* Point
1430: 65 72 20 74 6f 20 70 69 70 65 20 69 6e 66 6f 20  er to pipe info 
1440: 73 74 72 75 63 74 75 72 65 2e 20 4e 6f 74 65 20  structure. Note 
1450: 74 68 61 74 0a 09 09 09 09 20 2a 20 77 65 20 73  that..... * we s
1460: 74 69 6c 6c 20 68 61 76 65 20 74 6f 20 76 65 72  till have to ver
1470: 69 66 79 20 74 68 61 74 20 74 68 65 20 70 69 70  ify that the pip
1480: 65 0a 09 09 09 09 20 2a 20 65 78 69 73 74 73 20  e..... * exists 
1490: 62 65 66 6f 72 65 20 64 65 72 65 66 65 72 65 6e  before dereferen
14a0: 63 69 6e 67 20 74 68 69 73 0a 09 09 09 09 20 2a  cing this..... *
14b0: 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 7d 20 50   pointer. */.} P
14c0: 69 70 65 45 76 65 6e 74 3b 0a 0a 2f 2a 0a 20 2a  ipeEvent;../*. *
14d0: 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f   Declarations fo
14e0: 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64  r functions used
14f0: 20 6f 6e 6c 79 20 69 6e 20 74 68 69 73 20 66 69   only in this fi
1500: 6c 65 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  le.. */..static 
1510: 69 6e 74 09 09 41 70 70 6c 69 63 61 74 69 6f 6e  int..Application
1520: 54 79 70 65 28 54 63 6c 5f 49 6e 74 65 72 70 20  Type(Tcl_Interp 
1530: 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20  *interp,....    
1540: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
1550: 4e 61 6d 65 2c 20 63 68 61 72 20 2a 66 75 6c 6c  Name, char *full
1560: 4e 61 6d 65 29 3b 0a 73 74 61 74 69 63 20 76 6f  Name);.static vo
1570: 69 64 09 09 42 75 69 6c 64 43 6f 6d 6d 61 6e 64  id..BuildCommand
1580: 4c 69 6e 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Line(const char 
1590: 2a 65 78 65 63 75 74 61 62 6c 65 2c 20 73 69 7a  *executable, siz
15a0: 65 5f 74 20 61 72 67 63 2c 0a 09 09 09 20 20 20  e_t argc,....   
15b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
15c0: 67 76 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  gv, Tcl_DString 
15d0: 2a 6c 69 6e 65 50 74 72 29 3b 0a 73 74 61 74 69  *linePtr);.stati
15e0: 63 20 42 4f 4f 4c 09 09 48 61 73 43 6f 6e 73 6f  c BOOL..HasConso
15f0: 6c 65 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63  le(void);.static
1600: 20 69 6e 74 09 09 50 69 70 65 42 6c 6f 63 6b 4d   int..PipeBlockM
1610: 6f 64 65 50 72 6f 63 28 76 6f 69 64 20 2a 69 6e  odeProc(void *in
1620: 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20  stanceData, int 
1630: 6d 6f 64 65 29 3b 0a 73 74 61 74 69 63 20 76 6f  mode);.static vo
1640: 69 64 09 09 50 69 70 65 43 68 65 63 6b 50 72 6f  id..PipeCheckPro
1650: 63 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61  c(void *clientDa
1660: 74 61 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a  ta, int flags);.
1670: 73 74 61 74 69 63 20 69 6e 74 09 09 50 69 70 65  static int..Pipe
1680: 43 6c 6f 73 65 32 50 72 6f 63 28 76 6f 69 64 20  Close2Proc(void 
1690: 2a 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09  *instanceData,..
16a0: 09 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ..    Tcl_Interp
16b0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c   *interp, int fl
16c0: 61 67 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ags);.static int
16d0: 09 09 50 69 70 65 45 76 65 6e 74 50 72 6f 63 28  ..PipeEventProc(
16e0: 54 63 6c 5f 45 76 65 6e 74 20 2a 65 76 50 74 72  Tcl_Event *evPtr
16f0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a 73 74  , int flags);.st
1700: 61 74 69 63 20 69 6e 74 09 09 50 69 70 65 47 65  atic int..PipeGe
1710: 74 48 61 6e 64 6c 65 50 72 6f 63 28 76 6f 69 64  tHandleProc(void
1720: 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a   *instanceData,.
1730: 09 09 09 20 20 20 20 69 6e 74 20 64 69 72 65 63  ...    int direc
1740: 74 69 6f 6e 2c 20 76 6f 69 64 20 2a 2a 68 61 6e  tion, void **han
1750: 64 6c 65 50 74 72 29 3b 0a 73 74 61 74 69 63 20  dlePtr);.static 
1760: 76 6f 69 64 09 09 50 69 70 65 49 6e 69 74 28 76  void..PipeInit(v
1770: 6f 69 64 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  oid);.static int
1780: 09 09 50 69 70 65 49 6e 70 75 74 50 72 6f 63 28  ..PipeInputProc(
1790: 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 44 61  void *instanceDa
17a0: 74 61 2c 20 63 68 61 72 20 2a 62 75 66 2c 0a 09  ta, char *buf,..
17b0: 09 09 20 20 20 20 69 6e 74 20 74 6f 52 65 61 64  ..    int toRead
17c0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65  , int *errorCode
17d0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 50  );.static int..P
17e0: 69 70 65 4f 75 74 70 75 74 50 72 6f 63 28 76 6f  ipeOutputProc(vo
17f0: 69 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61  id *instanceData
1800: 2c 0a 09 09 09 20 20 20 20 63 6f 6e 73 74 20 63  ,....    const c
1810: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f  har *buf, int to
1820: 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f  Write, int *erro
1830: 72 43 6f 64 65 29 3b 0a 73 74 61 74 69 63 20 44  rCode);.static D
1840: 57 4f 52 44 20 57 49 4e 41 50 49 09 50 69 70 65  WORD WINAPI.Pipe
1850: 52 65 61 64 65 72 54 68 72 65 61 64 28 4c 50 56  ReaderThread(LPV
1860: 4f 49 44 20 61 72 67 29 3b 0a 73 74 61 74 69 63  OID arg);.static
1870: 20 76 6f 69 64 09 09 50 69 70 65 53 65 74 75 70   void..PipeSetup
1880: 50 72 6f 63 28 76 6f 69 64 20 2a 63 6c 69 65 6e  Proc(void *clien
1890: 74 44 61 74 61 2c 20 69 6e 74 20 66 6c 61 67 73  tData, int flags
18a0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09  );.static void..
18b0: 50 69 70 65 57 61 74 63 68 50 72 6f 63 28 76 6f  PipeWatchProc(vo
18c0: 69 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61  id *instanceData
18d0: 2c 20 69 6e 74 20 6d 61 73 6b 29 3b 0a 73 74 61  , int mask);.sta
18e0: 74 69 63 20 44 57 4f 52 44 20 57 49 4e 41 50 49  tic DWORD WINAPI
18f0: 09 50 69 70 65 57 72 69 74 65 72 54 68 72 65 61  .PipeWriterThrea
1900: 64 28 4c 50 56 4f 49 44 20 61 72 67 29 3b 0a 73  d(LPVOID arg);.s
1910: 74 61 74 69 63 20 69 6e 74 09 09 54 65 6d 70 46  tatic int..TempF
1920: 69 6c 65 4e 61 6d 65 28 57 43 48 41 52 20 6e 61  ileName(WCHAR na
1930: 6d 65 5b 4d 41 58 5f 50 41 54 48 5d 29 3b 0a 73  me[MAX_PATH]);.s
1940: 74 61 74 69 63 20 69 6e 74 09 09 57 61 69 74 46  tatic int..WaitF
1950: 6f 72 52 65 61 64 28 50 69 70 65 49 6e 66 6f 20  orRead(PipeInfo 
1960: 2a 69 6e 66 6f 50 74 72 2c 20 69 6e 74 20 62 6c  *infoPtr, int bl
1970: 6f 63 6b 69 6e 67 29 3b 0a 73 74 61 74 69 63 20  ocking);.static 
1980: 76 6f 69 64 09 09 50 69 70 65 54 68 72 65 61 64  void..PipeThread
1990: 41 63 74 69 6f 6e 50 72 6f 63 28 76 6f 69 64 20  ActionProc(void 
19a0: 2a 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 09  *instanceData,..
19b0: 09 09 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e  ..    int action
19c0: 29 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73  );../*. * This s
19d0: 74 72 75 63 74 75 72 65 20 64 65 73 63 72 69 62  tructure describ
19e0: 65 73 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 74  es the channel t
19f0: 79 70 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  ype structure fo
1a00: 72 20 63 6f 6d 6d 61 6e 64 20 70 69 70 65 20 62  r command pipe b
1a10: 61 73 65 64 0a 20 2a 20 49 2f 4f 2e 0a 20 2a 2f  ased. * I/O.. */
1a20: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54  ..static const T
1a30: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 70  cl_ChannelType p
1a40: 69 70 65 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d  ipeChannelType =
1a50: 20 7b 0a 20 20 20 20 22 70 69 70 65 22 2c 0a 20   {.    "pipe",. 
1a60: 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56     TCL_CHANNEL_V
1a70: 45 52 53 49 4f 4e 5f 35 2c 0a 20 20 20 20 4e 55  ERSION_5,.    NU
1a80: 4c 4c 2c 09 09 09 2f 2a 20 44 65 70 72 65 63 61  LL,.../* Depreca
1a90: 74 65 64 2e 20 2a 2f 0a 20 20 20 20 50 69 70 65  ted. */.    Pipe
1aa0: 49 6e 70 75 74 50 72 6f 63 2c 0a 20 20 20 20 50  InputProc,.    P
1ab0: 69 70 65 4f 75 74 70 75 74 50 72 6f 63 2c 0a 20  ipeOutputProc,. 
1ac0: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 44 65     NULL,.../* De
1ad0: 70 72 65 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20  precated. */.   
1ae0: 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53 65 74 20   NULL,.../* Set 
1af0: 6f 70 74 69 6f 6e 20 70 72 6f 63 2e 20 2a 2f 0a  option proc. */.
1b00: 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 47      NULL,.../* G
1b10: 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 2e 20  et option proc. 
1b20: 2a 2f 0a 20 20 20 20 50 69 70 65 57 61 74 63 68  */.    PipeWatch
1b30: 50 72 6f 63 2c 0a 20 20 20 20 50 69 70 65 47 65  Proc,.    PipeGe
1b40: 74 48 61 6e 64 6c 65 50 72 6f 63 2c 0a 20 20 20  tHandleProc,.   
1b50: 20 50 69 70 65 43 6c 6f 73 65 32 50 72 6f 63 2c   PipeClose2Proc,
1b60: 0a 20 20 20 20 50 69 70 65 42 6c 6f 63 6b 4d 6f  .    PipeBlockMo
1b70: 64 65 50 72 6f 63 2c 0a 20 20 20 20 4e 55 4c 4c  deProc,.    NULL
1b80: 2c 09 09 09 2f 2a 20 46 6c 75 73 68 20 70 72 6f  ,.../* Flush pro
1b90: 63 2e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09  c. */.    NULL,.
1ba0: 09 09 2f 2a 20 42 75 62 62 6c 65 64 20 65 76 65  ../* Bubbled eve
1bb0: 6e 74 20 68 61 6e 64 6c 65 72 20 70 72 6f 63 2e  nt handler proc.
1bc0: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09   */.    NULL,...
1bd0: 2f 2a 20 53 65 65 6b 20 70 72 6f 63 2e 20 2a 2f  /* Seek proc. */
1be0: 0a 20 20 20 20 50 69 70 65 54 68 72 65 61 64 41  .    PipeThreadA
1bf0: 63 74 69 6f 6e 50 72 6f 63 2c 0a 20 20 20 20 4e  ctionProc,.    N
1c00: 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74  ULL.../* Truncat
1c10: 65 20 70 72 6f 63 2e 20 2a 2f 0a 7d 3b 0a 0c 0a  e proc. */.};...
1c20: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
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 0a 20 2a 0a 20  -----------. *. 
1c70: 2a 20 50 69 70 65 49 6e 69 74 20 2d 2d 0a 20 2a  * PipeInit --. *
1c80: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
1c90: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  n initializes th
1ca0: 65 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c  e static variabl
1cb0: 65 73 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  es for this file
1cc0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
1cd0: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20  . *.None.. *. * 
1ce0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
1cf0: 09 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 65  .Creates a new e
1d00: 76 65 6e 74 20 73 6f 75 72 63 65 2e 0a 20 2a 0a  vent source.. *.
1d10: 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
1d60: 61 74 69 63 20 76 6f 69 64 0a 50 69 70 65 49 6e  atic void.PipeIn
1d70: 69 74 28 76 6f 69 64 29 0a 7b 0a 20 20 20 20 54  it(void).{.    T
1d80: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
1d90: 61 20 2a 74 73 64 50 74 72 3b 0a 0a 20 20 20 20  a *tsdPtr;..    
1da0: 2f 2a 0a 20 20 20 20 20 2a 20 43 68 65 63 6b 20  /*.     * Check 
1db0: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  the initialized 
1dc0: 66 6c 61 67 20 66 69 72 73 74 2c 20 74 68 65 6e  flag first, then
1dd0: 20 63 68 65 63 6b 20 61 67 61 69 6e 20 69 6e 20   check again in 
1de0: 74 68 65 20 6d 75 74 65 78 2e 20 54 68 69 73 0a  the mutex. This.
1df0: 20 20 20 20 20 2a 20 69 73 20 61 20 73 70 65 65       * is a spee
1e00: 64 20 65 6e 68 61 6e 63 65 6d 65 6e 74 2e 0a 20  d enhancement.. 
1e10: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
1e20: 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  !initialized) {.
1e30: 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26  .Tcl_MutexLock(&
1e40: 70 69 70 65 4d 75 74 65 78 29 3b 0a 09 69 66 20  pipeMutex);..if 
1e50: 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  (!initialized) {
1e60: 0a 09 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65  ..    initialize
1e70: 64 20 3d 20 31 3b 0a 09 20 20 20 20 70 72 6f 63  d = 1;..    proc
1e80: 4c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  List = NULL;..}.
1e90: 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b  .Tcl_MutexUnlock
1ea0: 28 26 70 69 70 65 4d 75 74 65 78 29 3b 0a 20 20  (&pipeMutex);.  
1eb0: 20 20 7d 0a 0a 20 20 20 20 74 73 64 50 74 72 20    }..    tsdPtr 
1ec0: 3d 20 28 54 68 72 65 61 64 53 70 65 63 69 66 69  = (ThreadSpecifi
1ed0: 63 44 61 74 61 20 2a 29 54 63 6c 54 68 72 65 61  cData *)TclThrea
1ee0: 64 44 61 74 61 4b 65 79 47 65 74 28 26 64 61 74  dDataKeyGet(&dat
1ef0: 61 4b 65 79 29 3b 0a 20 20 20 20 69 66 20 28 74  aKey);.    if (t
1f00: 73 64 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  sdPtr == NULL) {
1f10: 0a 09 74 73 64 50 74 72 20 3d 20 54 43 4c 5f 54  ..tsdPtr = TCL_T
1f20: 53 44 5f 49 4e 49 54 28 26 64 61 74 61 4b 65 79  SD_INIT(&dataKey
1f30: 29 3b 0a 09 74 73 64 50 74 72 2d 3e 66 69 72 73  );..tsdPtr->firs
1f40: 74 50 69 70 65 50 74 72 20 3d 20 4e 55 4c 4c 3b  tPipePtr = NULL;
1f50: 0a 09 54 63 6c 5f 43 72 65 61 74 65 45 76 65 6e  ..Tcl_CreateEven
1f60: 74 53 6f 75 72 63 65 28 50 69 70 65 53 65 74 75  tSource(PipeSetu
1f70: 70 50 72 6f 63 2c 20 50 69 70 65 43 68 65 63 6b  pProc, PipeCheck
1f80: 50 72 6f 63 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  Proc, NULL);.   
1f90: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   }.}.../*. *----
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fe0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 46 69 6e  --. *. * TclpFin
1ff0: 61 6c 69 7a 65 50 69 70 65 73 20 2d 2d 0a 20 2a  alizePipes --. *
2000: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
2010: 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
2020: 20 54 63 6c 5f 46 69 6e 61 6c 69 7a 65 54 68 72   Tcl_FinalizeThr
2030: 65 61 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ead to finalize 
2040: 74 68 65 0a 20 2a 09 70 6c 61 74 66 6f 72 6d 20  the. *.platform 
2050: 73 70 65 63 69 66 69 63 20 70 69 70 65 20 73 75  specific pipe su
2060: 62 73 79 73 74 65 6d 2e 0a 20 2a 0a 20 2a 20 52  bsystem.. *. * R
2070: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
2080: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
2090: 63 74 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 73 20  cts:. *.Removes 
20a0: 74 68 65 20 70 69 70 65 20 65 76 65 6e 74 20 73  the pipe event s
20b0: 6f 75 72 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ource.. *. *----
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2100: 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63 6c  --. */..void.Tcl
2110: 70 46 69 6e 61 6c 69 7a 65 50 69 70 65 73 28 76  pFinalizePipes(v
2120: 6f 69 64 29 0a 7b 0a 20 20 20 20 54 68 72 65 61  oid).{.    Threa
2130: 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 74  dSpecificData *t
2140: 73 64 50 74 72 3b 0a 0a 20 20 20 20 74 73 64 50  sdPtr;..    tsdP
2150: 74 72 20 3d 20 28 54 68 72 65 61 64 53 70 65 63  tr = (ThreadSpec
2160: 69 66 69 63 44 61 74 61 20 2a 29 54 63 6c 54 68  ificData *)TclTh
2170: 72 65 61 64 44 61 74 61 4b 65 79 47 65 74 28 26  readDataKeyGet(&
2180: 64 61 74 61 4b 65 79 29 3b 0a 20 20 20 20 69 66  dataKey);.    if
2190: 20 28 74 73 64 50 74 72 20 21 3d 20 4e 55 4c 4c   (tsdPtr != NULL
21a0: 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 45  ) {..Tcl_DeleteE
21b0: 76 65 6e 74 53 6f 75 72 63 65 28 50 69 70 65 53  ventSource(PipeS
21c0: 65 74 75 70 50 72 6f 63 2c 20 50 69 70 65 43 68  etupProc, PipeCh
21d0: 65 63 6b 50 72 6f 63 2c 20 4e 55 4c 4c 29 3b 0a  eckProc, NULL);.
21e0: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d      }.}.../*. *-
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2230: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 69 70 65  -----. *. * Pipe
2240: 53 65 74 75 70 50 72 6f 63 20 2d 2d 0a 20 2a 0a  SetupProc --. *.
2250: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e   *.This function
2260: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 65 66 6f   is invoked befo
2270: 72 65 20 54 63 6c 5f 44 6f 4f 6e 65 45 76 65 6e  re Tcl_DoOneEven
2280: 74 20 62 6c 6f 63 6b 73 20 77 61 69 74 69 6e 67  t blocks waiting
2290: 20 66 6f 72 20 61 6e 0a 20 2a 09 65 76 65 6e 74   for an. *.event
22a0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
22b0: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20  . *.None.. *. * 
22c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
22d0: 09 41 64 6a 75 73 74 73 20 74 68 65 20 62 6c 6f  .Adjusts the blo
22e0: 63 6b 20 74 69 6d 65 20 69 66 20 6e 65 65 64 65  ck time if neede
22f0: 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d.. *. *--------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2340: 2a 2f 0a 0a 76 6f 69 64 0a 50 69 70 65 53 65 74  */..void.PipeSet
2350: 75 70 50 72 6f 63 28 0a 20 20 20 20 54 43 4c 5f  upProc(.    TCL_
2360: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a  UNUSED(void *),.
2370: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09      int flags)..
2380: 09 2f 2a 20 45 76 65 6e 74 20 66 6c 61 67 73 20  ./* Event flags 
2390: 61 73 20 70 61 73 73 65 64 20 74 6f 20 54 63 6c  as passed to Tcl
23a0: 5f 44 6f 4f 6e 65 45 76 65 6e 74 2e 20 2a 2f 0a  _DoOneEvent. */.
23b0: 7b 0a 20 20 20 20 50 69 70 65 49 6e 66 6f 20 2a  {.    PipeInfo *
23c0: 69 6e 66 6f 50 74 72 3b 0a 20 20 20 20 54 63 6c  infoPtr;.    Tcl
23d0: 5f 54 69 6d 65 20 62 6c 6f 63 6b 54 69 6d 65 20  _Time blockTime 
23e0: 3d 20 7b 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20  = { 0, 0 };.    
23f0: 69 6e 74 20 62 6c 6f 63 6b 20 3d 20 31 3b 0a 20  int block = 1;. 
2400: 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66 69     ThreadSpecifi
2410: 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20  cData *tsdPtr = 
2420: 54 43 4c 5f 54 53 44 5f 49 4e 49 54 28 26 64 61  TCL_TSD_INIT(&da
2430: 74 61 4b 65 79 29 3b 0a 0a 20 20 20 20 69 66 20  taKey);..    if 
2440: 28 21 28 66 6c 61 67 73 20 26 20 54 43 4c 5f 46  (!(flags & TCL_F
2450: 49 4c 45 5f 45 56 45 4e 54 53 29 29 20 7b 0a 09  ILE_EVENTS)) {..
2460: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
2470: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4c 6f 6f     /*.     * Loo
2480: 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79 20  k to see if any 
2490: 65 76 65 6e 74 73 20 61 72 65 20 61 6c 72 65 61  events are alrea
24a0: 64 79 20 70 65 6e 64 69 6e 67 2e 20 20 49 66 20  dy pending.  If 
24b0: 74 68 65 79 20 61 72 65 2c 20 70 6f 6c 6c 2e 0a  they are, poll..
24c0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72       */..    for
24d0: 20 28 69 6e 66 6f 50 74 72 20 3d 20 74 73 64 50   (infoPtr = tsdP
24e0: 74 72 2d 3e 66 69 72 73 74 50 69 70 65 50 74 72  tr->firstPipePtr
24f0: 3b 20 69 6e 66 6f 50 74 72 20 21 3d 20 4e 55 4c  ; infoPtr != NUL
2500: 4c 3b 0a 09 20 20 20 20 69 6e 66 6f 50 74 72 20  L;..    infoPtr 
2510: 3d 20 69 6e 66 6f 50 74 72 2d 3e 6e 65 78 74 50  = infoPtr->nextP
2520: 74 72 29 20 7b 0a 09 69 66 20 28 69 6e 66 6f 50  tr) {..if (infoP
2530: 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 26 20  tr->watchMask & 
2540: 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 20 7b 0a  TCL_WRITABLE) {.
2550: 09 20 20 20 20 69 66 20 28 57 61 69 74 46 6f 72  .    if (WaitFor
2560: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 69 6e 66  SingleObject(inf
2570: 6f 50 74 72 2d 3e 77 72 69 74 61 62 6c 65 2c 20  oPtr->writable, 
2580: 30 29 20 21 3d 20 57 41 49 54 5f 54 49 4d 45 4f  0) != WAIT_TIMEO
2590: 55 54 29 20 7b 0a 09 09 62 6c 6f 63 6b 20 3d 20  UT) {...block = 
25a0: 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66  0;..    }..}..if
25b0: 20 28 69 6e 66 6f 50 74 72 2d 3e 77 61 74 63 68   (infoPtr->watch
25c0: 4d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41  Mask & TCL_READA
25d0: 42 4c 45 29 20 7b 0a 09 20 20 20 20 69 66 20 28  BLE) {..    if (
25e0: 57 61 69 74 46 6f 72 52 65 61 64 28 69 6e 66 6f  WaitForRead(info
25f0: 50 74 72 2c 20 30 29 20 3e 3d 20 30 29 20 7b 0a  Ptr, 0) >= 0) {.
2600: 09 09 62 6c 6f 63 6b 20 3d 20 30 3b 0a 09 20 20  ..block = 0;..  
2610: 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20    }..}.    }.   
2620: 20 69 66 20 28 21 62 6c 6f 63 6b 29 20 7b 0a 09   if (!block) {..
2630: 54 63 6c 5f 53 65 74 4d 61 78 42 6c 6f 63 6b 54  Tcl_SetMaxBlockT
2640: 69 6d 65 28 26 62 6c 6f 63 6b 54 69 6d 65 29 3b  ime(&blockTime);
2650: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  .    }.}.../*. *
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26a0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 69 70  ------. *. * Pip
26b0: 65 43 68 65 63 6b 50 72 6f 63 20 2d 2d 0a 20 2a  eCheckProc --. *
26c0: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f  . *.This functio
26d0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 54  n is called by T
26e0: 63 6c 5f 44 6f 4f 6e 65 45 76 65 6e 74 20 74 6f  cl_DoOneEvent to
26f0: 20 63 68 65 63 6b 20 74 68 65 20 70 69 70 65 20   check the pipe 
2700: 65 76 65 6e 74 0a 20 2a 09 73 6f 75 72 63 65 20  event. *.source 
2710: 66 6f 72 20 65 76 65 6e 74 73 2e 0a 20 2a 0a 20  for events.. *. 
2720: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
2730: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ne.. *. * Side e
2740: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 71  ffects:. *.May q
2750: 75 65 75 65 20 61 6e 20 65 76 65 6e 74 2e 0a 20  ueue an event.. 
2760: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
27b0: 73 74 61 74 69 63 20 76 6f 69 64 0a 50 69 70 65  static void.Pipe
27c0: 43 68 65 63 6b 50 72 6f 63 28 0a 20 20 20 20 54  CheckProc(.    T
27d0: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a  CL_UNUSED(void *
27e0: 29 2c 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  ),.    int flags
27f0: 29 09 09 09 2f 2a 20 45 76 65 6e 74 20 66 6c 61  ).../* Event fla
2800: 67 73 20 61 73 20 70 61 73 73 65 64 20 74 6f 20  gs as passed to 
2810: 54 63 6c 5f 44 6f 4f 6e 65 45 76 65 6e 74 2e 20  Tcl_DoOneEvent. 
2820: 2a 2f 0a 7b 0a 20 20 20 20 50 69 70 65 49 6e 66  */.{.    PipeInf
2830: 6f 20 2a 69 6e 66 6f 50 74 72 3b 0a 20 20 20 20  o *infoPtr;.    
2840: 50 69 70 65 45 76 65 6e 74 20 2a 65 76 50 74 72  PipeEvent *evPtr
2850: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 45 76  ;.    int needEv
2860: 65 6e 74 3b 0a 20 20 20 20 54 68 72 65 61 64 53  ent;.    ThreadS
2870: 70 65 63 69 66 69 63 44 61 74 61 20 2a 74 73 64  pecificData *tsd
2880: 50 74 72 20 3d 20 54 43 4c 5f 54 53 44 5f 49 4e  Ptr = TCL_TSD_IN
2890: 49 54 28 26 64 61 74 61 4b 65 79 29 3b 0a 0a 20  IT(&dataKey);.. 
28a0: 20 20 20 69 66 20 28 21 28 66 6c 61 67 73 20 26     if (!(flags &
28b0: 20 54 43 4c 5f 46 49 4c 45 5f 45 56 45 4e 54 53   TCL_FILE_EVENTS
28c0: 29 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  )) {..return;.  
28d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
28e0: 20 2a 20 51 75 65 75 65 20 65 76 65 6e 74 73 20   * Queue events 
28f0: 66 6f 72 20 61 6e 79 20 72 65 61 64 79 20 70 69  for any ready pi
2900: 70 65 73 20 74 68 61 74 20 64 6f 6e 27 74 20 61  pes that don't a
2910: 6c 72 65 61 64 79 20 68 61 76 65 20 65 76 65 6e  lready have even
2920: 74 73 20 71 75 65 75 65 64 2e 0a 20 20 20 20 20  ts queued..     
2930: 2a 2f 0a 0a 20 20 20 20 66 6f 72 20 28 69 6e 66  */..    for (inf
2940: 6f 50 74 72 20 3d 20 74 73 64 50 74 72 2d 3e 66  oPtr = tsdPtr->f
2950: 69 72 73 74 50 69 70 65 50 74 72 3b 20 69 6e 66  irstPipePtr; inf
2960: 6f 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 20  oPtr != NULL;.. 
2970: 20 20 20 69 6e 66 6f 50 74 72 20 3d 20 69 6e 66     infoPtr = inf
2980: 6f 50 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b  oPtr->nextPtr) {
2990: 0a 09 69 66 20 28 69 6e 66 6f 50 74 72 2d 3e 66  ..if (infoPtr->f
29a0: 6c 61 67 73 20 26 20 50 49 50 45 5f 50 45 4e 44  lags & PIPE_PEND
29b0: 49 4e 47 29 20 7b 0a 09 20 20 20 20 63 6f 6e 74  ING) {..    cont
29c0: 69 6e 75 65 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  inue;..}.../*.. 
29d0: 2a 20 51 75 65 75 65 20 61 6e 20 65 76 65 6e 74  * Queue an event
29e0: 20 69 66 20 74 68 65 20 70 69 70 65 20 69 73 20   if the pipe is 
29f0: 73 69 67 6e 61 6c 65 64 20 66 6f 72 20 72 65 61  signaled for rea
2a00: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e  ding or writing.
2a10: 0a 09 20 2a 2f 0a 0a 09 6e 65 65 64 45 76 65 6e  .. */...needEven
2a20: 74 20 3d 20 30 3b 0a 09 69 66 20 28 28 69 6e 66  t = 0;..if ((inf
2a30: 6f 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20  oPtr->watchMask 
2a40: 26 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 20  & TCL_WRITABLE) 
2a50: 26 26 0a 09 09 28 57 61 69 74 46 6f 72 53 69 6e  &&...(WaitForSin
2a60: 67 6c 65 4f 62 6a 65 63 74 28 69 6e 66 6f 50 74  gleObject(infoPt
2a70: 72 2d 3e 77 72 69 74 61 62 6c 65 2c 20 30 29 20  r->writable, 0) 
2a80: 21 3d 20 57 41 49 54 5f 54 49 4d 45 4f 55 54 29  != WAIT_TIMEOUT)
2a90: 29 20 7b 0a 09 20 20 20 20 6e 65 65 64 45 76 65  ) {..    needEve
2aa0: 6e 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20  nt = 1;..}...if 
2ab0: 28 28 69 6e 66 6f 50 74 72 2d 3e 77 61 74 63 68  ((infoPtr->watch
2ac0: 4d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41  Mask & TCL_READA
2ad0: 42 4c 45 29 20 26 26 0a 09 09 28 57 61 69 74 46  BLE) &&...(WaitF
2ae0: 6f 72 52 65 61 64 28 69 6e 66 6f 50 74 72 2c 20  orRead(infoPtr, 
2af0: 30 29 20 3e 3d 20 30 29 29 20 7b 0a 09 20 20 20  0) >= 0)) {..   
2b00: 20 6e 65 65 64 45 76 65 6e 74 20 3d 20 31 3b 0a   needEvent = 1;.
2b10: 09 7d 0a 0a 09 69 66 20 28 6e 65 65 64 45 76 65  .}...if (needEve
2b20: 6e 74 29 20 7b 0a 09 20 20 20 20 69 6e 66 6f 50  nt) {..    infoP
2b30: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 49 50  tr->flags |= PIP
2b40: 45 5f 50 45 4e 44 49 4e 47 3b 0a 09 20 20 20 20  E_PENDING;..    
2b50: 65 76 50 74 72 20 3d 20 28 50 69 70 65 45 76 65  evPtr = (PipeEve
2b60: 6e 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73  nt *)Tcl_Alloc(s
2b70: 69 7a 65 6f 66 28 50 69 70 65 45 76 65 6e 74 29  izeof(PipeEvent)
2b80: 29 3b 0a 09 20 20 20 20 65 76 50 74 72 2d 3e 68  );..    evPtr->h
2b90: 65 61 64 65 72 2e 70 72 6f 63 20 3d 20 50 69 70  eader.proc = Pip
2ba0: 65 45 76 65 6e 74 50 72 6f 63 3b 0a 09 20 20 20  eEventProc;..   
2bb0: 20 65 76 50 74 72 2d 3e 69 6e 66 6f 50 74 72 20   evPtr->infoPtr 
2bc0: 3d 20 69 6e 66 6f 50 74 72 3b 0a 09 20 20 20 20  = infoPtr;..    
2bd0: 54 63 6c 5f 51 75 65 75 65 45 76 65 6e 74 28 28  Tcl_QueueEvent((
2be0: 54 63 6c 5f 45 76 65 6e 74 20 2a 29 20 65 76 50  Tcl_Event *) evP
2bf0: 74 72 2c 20 54 43 4c 5f 51 55 45 55 45 5f 54 41  tr, TCL_QUEUE_TA
2c00: 49 4c 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a  IL);..}.    }.}.
2c10: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2c60: 0a 20 2a 20 54 63 6c 57 69 6e 4d 61 6b 65 46 69  . * TclWinMakeFi
2c70: 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  le --. *. *.This
2c80: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 73 74 72   function constr
2c90: 75 63 74 73 20 61 20 6e 65 77 20 54 63 6c 46 69  ucts a new TclFi
2ca0: 6c 65 20 66 72 6f 6d 20 61 20 67 69 76 65 6e 20  le from a given 
2cb0: 64 61 74 61 20 61 6e 64 20 74 79 70 65 0a 20 2a  data and type. *
2cc0: 09 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 52 65  .value.. *. * Re
2cd0: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e  sults:. *.Return
2ce0: 73 20 61 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  s a newly alloca
2cf0: 74 65 64 20 57 69 6e 46 69 6c 65 20 61 73 20 61  ted WinFile as a
2d00: 20 54 63 6c 46 69 6c 65 2e 0a 20 2a 0a 20 2a 20   TclFile.. *. * 
2d10: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
2d20: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d70: 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 46 69 6c 65 0a  --. */..TclFile.
2d80: 54 63 6c 57 69 6e 4d 61 6b 65 46 69 6c 65 28 0a  TclWinMakeFile(.
2d90: 20 20 20 20 48 41 4e 44 4c 45 20 68 61 6e 64 6c      HANDLE handl
2da0: 65 29 09 09 2f 2a 20 54 79 70 65 2d 73 70 65 63  e)../* Type-spec
2db0: 69 66 69 63 20 64 61 74 61 2e 20 2a 2f 0a 7b 0a  ific data. */.{.
2dc0: 20 20 20 20 57 69 6e 46 69 6c 65 20 2a 66 69 6c      WinFile *fil
2dd0: 65 50 74 72 3b 0a 0a 20 20 20 20 66 69 6c 65 50  ePtr;..    fileP
2de0: 74 72 20 3d 20 28 57 69 6e 46 69 6c 65 20 2a 29  tr = (WinFile *)
2df0: 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66  Tcl_Alloc(sizeof
2e00: 28 57 69 6e 46 69 6c 65 29 29 3b 0a 20 20 20 20  (WinFile));.    
2e10: 66 69 6c 65 50 74 72 2d 3e 74 79 70 65 20 3d 20  filePtr->type = 
2e20: 57 49 4e 5f 46 49 4c 45 3b 0a 20 20 20 20 66 69  WIN_FILE;.    fi
2e30: 6c 65 50 74 72 2d 3e 68 61 6e 64 6c 65 20 3d 20  lePtr->handle = 
2e40: 68 61 6e 64 6c 65 3b 0a 0a 20 20 20 20 72 65 74  handle;..    ret
2e50: 75 72 6e 20 28 54 63 6c 46 69 6c 65 29 66 69 6c  urn (TclFile)fil
2e60: 65 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  ePtr;.}.../*. *-
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2eb0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 65 6d 70  -----. *. * Temp
2ec0: 46 69 6c 65 4e 61 6d 65 20 2d 2d 0a 20 2a 0a 20  FileName --. *. 
2ed0: 2a 09 47 65 74 73 20 61 20 74 65 6d 70 6f 72 61  *.Gets a tempora
2ee0: 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  ry file name and
2ef0: 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
2f00: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 74 65  fact that the te
2f10: 6d 70 6f 72 61 72 79 0a 20 2a 09 66 69 6c 65 20  mporary. *.file 
2f20: 70 61 74 68 20 70 72 6f 76 69 64 65 64 20 62 79  path provided by
2f30: 20 57 69 6e 64 6f 77 73 20 6d 61 79 20 6e 6f 74   Windows may not
2f40: 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 20   actually exist 
2f50: 69 66 20 74 68 65 20 54 4d 50 20 6f 72 0a 20 2a  if the TMP or. *
2f60: 09 54 45 4d 50 20 65 6e 76 69 72 6f 6e 6d 65 6e  .TEMP environmen
2f70: 74 20 76 61 72 69 61 62 6c 65 73 20 72 65 66 65  t variables refe
2f80: 72 20 74 6f 20 61 20 6e 6f 6e 2d 65 78 69 73 74  r to a non-exist
2f90: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 2e 0a 20  ent directory.. 
2fa0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
2fb0: 09 30 20 69 66 20 65 72 72 6f 72 2c 20 6e 6f 6e  .0 if error, non
2fc0: 2d 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e  -zero otherwise.
2fd0: 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
2fe0: 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6e 61  returned, the na
2ff0: 6d 65 0a 20 2a 09 62 75 66 66 65 72 20 77 69 6c  me. *.buffer wil
3000: 6c 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  l be filled with
3010: 20 61 20 6e 61 6d 65 20 74 68 61 74 20 63 61 6e   a name that can
3020: 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6e 73   be used to cons
3030: 74 72 75 63 74 20 61 0a 20 2a 09 74 65 6d 70 6f  truct a. *.tempo
3040: 72 61 72 79 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a  rary file.. *. *
3050: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
3060: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
30c0: 69 6e 74 0a 54 65 6d 70 46 69 6c 65 4e 61 6d 65  int.TempFileName
30d0: 28 0a 20 20 20 20 57 43 48 41 52 20 6e 61 6d 65  (.    WCHAR name
30e0: 5b 4d 41 58 5f 50 41 54 48 5d 29 09 2f 2a 20 42  [MAX_PATH])./* B
30f0: 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 6e  uffer in which n
3100: 61 6d 65 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ame for temporar
3110: 79 20 66 69 6c 65 0a 09 09 09 09 20 2a 20 67 65  y file..... * ge
3120: 74 73 20 73 74 6f 72 65 64 2e 20 2a 2f 0a 7b 0a  ts stored. */.{.
3130: 20 20 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20      const WCHAR 
3140: 2a 70 72 65 66 69 78 20 3d 20 4c 22 54 43 4c 22  *prefix = L"TCL"
3150: 3b 0a 20 20 20 20 69 66 20 28 47 65 74 54 65 6d  ;.    if (GetTem
3160: 70 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2c  pPathW(MAX_PATH,
3170: 20 6e 61 6d 65 29 20 21 3d 20 30 29 20 7b 0a 09   name) != 0) {..
3180: 69 66 20 28 47 65 74 54 65 6d 70 46 69 6c 65 4e  if (GetTempFileN
3190: 61 6d 65 57 28 6e 61 6d 65 2c 20 70 72 65 66 69  ameW(name, prefi
31a0: 78 2c 20 30 2c 20 6e 61 6d 65 29 20 21 3d 20 30  x, 0, name) != 0
31b0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
31c0: 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20  1;..}.    }.    
31d0: 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b 0a 20  name[0] = '.';. 
31e0: 20 20 20 6e 61 6d 65 5b 31 5d 20 3d 20 27 5c 30     name[1] = '\0
31f0: 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 47 65  ';.    return Ge
3200: 74 54 65 6d 70 46 69 6c 65 4e 61 6d 65 57 28 6e  tTempFileNameW(n
3210: 61 6d 65 2c 20 70 72 65 66 69 78 2c 20 30 2c 20  ame, prefix, 0, 
3220: 6e 61 6d 65 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  name);.}.../*. *
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3270: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c  ------. *. * Tcl
3280: 70 4d 61 6b 65 46 69 6c 65 20 2d 2d 0a 20 2a 0a  pMakeFile --. *.
3290: 20 2a 09 4d 61 6b 65 20 61 20 54 63 6c 46 69 6c   *.Make a TclFil
32a0: 65 20 66 72 6f 6d 20 61 20 63 68 61 6e 6e 65 6c  e from a channel
32b0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
32c0: 0a 20 2a 09 52 65 74 75 72 6e 73 20 61 20 6e 65  . *.Returns a ne
32d0: 77 20 54 63 6c 46 69 6c 65 20 6f 72 20 4e 55 4c  w TclFile or NUL
32e0: 4c 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 20 2a  L on failure.. *
32f0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3300: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3330: 2d 2d 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 0a 20 2a 2f 0a 0a 54 63 6c 46  ------. */..TclF
3360: 69 6c 65 0a 54 63 6c 70 4d 61 6b 65 46 69 6c 65  ile.TclpMakeFile
3370: 28 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  (.    Tcl_Channe
3380: 6c 20 63 68 61 6e 6e 65 6c 2c 09 2f 2a 20 43 68  l channel,./* Ch
3390: 61 6e 6e 65 6c 20 74 6f 20 67 65 74 20 66 69 6c  annel to get fil
33a0: 65 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 69  e from. */.    i
33b0: 6e 74 20 64 69 72 65 63 74 69 6f 6e 29 09 09 2f  nt direction)../
33c0: 2a 20 45 69 74 68 65 72 20 54 43 4c 5f 52 45 41  * Either TCL_REA
33d0: 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49  DABLE or TCL_WRI
33e0: 54 41 42 4c 45 2e 20 2a 2f 0a 7b 0a 20 20 20 20  TABLE. */.{.    
33f0: 48 41 4e 44 4c 45 20 68 61 6e 64 6c 65 3b 0a 0a  HANDLE handle;..
3400: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
3410: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 63 68 61  hannelHandle(cha
3420: 6e 6e 65 6c 2c 20 64 69 72 65 63 74 69 6f 6e 2c  nnel, direction,
3430: 0a 09 20 20 20 20 28 76 6f 69 64 20 2a 2a 29 20  ..    (void **) 
3440: 26 68 61 6e 64 6c 65 29 20 3d 3d 20 54 43 4c 5f  &handle) == TCL_
3450: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 63  OK) {..return Tc
3460: 6c 57 69 6e 4d 61 6b 65 46 69 6c 65 28 68 61 6e  lWinMakeFile(han
3470: 64 6c 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  dle);.    } else
3480: 20 7b 0a 09 72 65 74 75 72 6e 20 28 54 63 6c 46   {..return (TclF
3490: 69 6c 65 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ile) NULL;.    }
34a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
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: 0a 20 2a 0a 20 2a 20 54 63 6c 70 4f 70 65 6e 46  . *. * TclpOpenF
3500: 69 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ile --. *. *.Thi
3510: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 70 65 6e 73  s function opens
3520: 20 66 69 6c 65 73 20 66 6f 72 20 75 73 65 20 69   files for use i
3530: 6e 20 61 20 70 69 70 65 6c 69 6e 65 2e 0a 20 2a  n a pipeline.. *
3540: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
3550: 52 65 74 75 72 6e 73 20 61 20 6e 65 77 6c 79 20  Returns a newly 
3560: 61 6c 6c 6f 63 61 74 65 64 20 54 63 6c 46 69 6c  allocated TclFil
3570: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
3580: 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 0a  aining the file.
3590: 20 2a 09 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a   *.handle.. *. *
35a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
35b0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 46 69 6c 65  ---. */..TclFile
3610: 0a 54 63 6c 70 4f 70 65 6e 46 69 6c 65 28 0a 20  .TclpOpenFile(. 
3620: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
3630: 61 74 68 2c 09 09 2f 2a 20 54 68 65 20 6e 61 6d  ath,../* The nam
3640: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
3650: 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e   open. */.    in
3660: 74 20 6d 6f 64 65 29 09 09 09 2f 2a 20 49 6e 20  t mode).../* In 
3670: 77 68 61 74 20 6d 6f 64 65 20 74 6f 20 6f 70 65  what mode to ope
3680: 6e 20 74 68 65 20 66 69 6c 65 3f 20 2a 2f 0a 7b  n the file? */.{
3690: 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 61 6e 64  .    HANDLE hand
36a0: 6c 65 3b 0a 20 20 20 20 44 57 4f 52 44 20 61 63  le;.    DWORD ac
36b0: 63 65 73 73 4d 6f 64 65 2c 20 63 72 65 61 74 65  cessMode, create
36c0: 4d 6f 64 65 2c 20 73 68 61 72 65 4d 6f 64 65 2c  Mode, shareMode,
36d0: 20 66 6c 61 67 73 3b 0a 20 20 20 20 54 63 6c 5f   flags;.    Tcl_
36e0: 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20  DString ds;.    
36f0: 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 6e 61 74  const WCHAR *nat
3700: 69 76 65 50 61 74 68 3b 0a 0a 20 20 20 20 2f 2a  ivePath;..    /*
3710: 0a 20 20 20 20 20 2a 20 4d 61 70 20 74 68 65 20  .     * Map the 
3720: 61 63 63 65 73 73 20 62 69 74 73 20 74 6f 20 74  access bits to t
3730: 68 65 20 4e 54 20 61 63 63 65 73 73 20 6d 6f 64  he NT access mod
3740: 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  e..     */..    
3750: 73 77 69 74 63 68 20 28 6d 6f 64 65 20 26 20 4f  switch (mode & O
3760: 5f 41 43 43 4d 4f 44 45 29 20 7b 0a 20 20 20 20  _ACCMODE) {.    
3770: 63 61 73 65 20 4f 5f 52 44 4f 4e 4c 59 3a 0a 09  case O_RDONLY:..
3780: 61 63 63 65 73 73 4d 6f 64 65 20 3d 20 47 45 4e  accessMode = GEN
3790: 45 52 49 43 5f 52 45 41 44 3b 0a 09 62 72 65 61  ERIC_READ;..brea
37a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 5f 57 52  k;.    case O_WR
37b0: 4f 4e 4c 59 3a 0a 09 61 63 63 65 73 73 4d 6f 64  ONLY:..accessMod
37c0: 65 20 3d 20 47 45 4e 45 52 49 43 5f 57 52 49 54  e = GENERIC_WRIT
37d0: 45 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  E;..break;.    c
37e0: 61 73 65 20 4f 5f 52 44 57 52 3a 0a 09 61 63 63  ase O_RDWR:..acc
37f0: 65 73 73 4d 6f 64 65 20 3d 20 28 47 45 4e 45 52  essMode = (GENER
3800: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
3810: 43 5f 57 52 49 54 45 29 3b 0a 09 62 72 65 61 6b  C_WRITE);..break
3820: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09  ;.    default:..
3830: 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45 72  Tcl_WinConvertEr
3840: 72 6f 72 28 45 52 52 4f 52 5f 49 4e 56 41 4c 49  ror(ERROR_INVALI
3850: 44 5f 46 55 4e 43 54 49 4f 4e 29 3b 0a 09 72 65  D_FUNCTION);..re
3860: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
3870: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
3880: 4d 61 70 20 74 68 65 20 63 72 65 61 74 69 6f 6e  Map the creation
3890: 20 66 6c 61 67 73 20 74 6f 20 74 68 65 20 4e 54   flags to the NT
38a0: 20 63 72 65 61 74 65 20 6d 6f 64 65 2e 0a 20 20   create mode..  
38b0: 20 20 20 2a 2f 0a 0a 20 20 20 20 73 77 69 74 63     */..    switc
38c0: 68 20 28 6d 6f 64 65 20 26 20 28 4f 5f 43 52 45  h (mode & (O_CRE
38d0: 41 54 20 7c 20 4f 5f 45 58 43 4c 20 7c 20 4f 5f  AT | O_EXCL | O_
38e0: 54 52 55 4e 43 29 29 20 7b 0a 20 20 20 20 63 61  TRUNC)) {.    ca
38f0: 73 65 20 28 4f 5f 43 52 45 41 54 20 7c 20 4f 5f  se (O_CREAT | O_
3900: 45 58 43 4c 29 3a 0a 20 20 20 20 63 61 73 65 20  EXCL):.    case 
3910: 28 4f 5f 43 52 45 41 54 20 7c 20 4f 5f 45 58 43  (O_CREAT | O_EXC
3920: 4c 20 7c 20 4f 5f 54 52 55 4e 43 29 3a 0a 09 63  L | O_TRUNC):..c
3930: 72 65 61 74 65 4d 6f 64 65 20 3d 20 43 52 45 41  reateMode = CREA
3940: 54 45 5f 4e 45 57 3b 0a 09 62 72 65 61 6b 3b 0a  TE_NEW;..break;.
3950: 20 20 20 20 63 61 73 65 20 28 4f 5f 43 52 45 41      case (O_CREA
3960: 54 20 7c 20 4f 5f 54 52 55 4e 43 29 3a 0a 09 63  T | O_TRUNC):..c
3970: 72 65 61 74 65 4d 6f 64 65 20 3d 20 43 52 45 41  reateMode = CREA
3980: 54 45 5f 41 4c 57 41 59 53 3b 0a 09 62 72 65 61  TE_ALWAYS;..brea
3990: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 5f 43 52  k;.    case O_CR
39a0: 45 41 54 3a 0a 09 63 72 65 61 74 65 4d 6f 64 65  EAT:..createMode
39b0: 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a   = OPEN_ALWAYS;.
39c0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
39d0: 20 4f 5f 54 52 55 4e 43 3a 0a 20 20 20 20 63 61   O_TRUNC:.    ca
39e0: 73 65 20 28 4f 5f 54 52 55 4e 43 20 7c 20 4f 5f  se (O_TRUNC | O_
39f0: 45 58 43 4c 29 3a 0a 09 63 72 65 61 74 65 4d 6f  EXCL):..createMo
3a00: 64 65 20 3d 20 54 52 55 4e 43 41 54 45 5f 45 58  de = TRUNCATE_EX
3a10: 49 53 54 49 4e 47 3b 0a 09 62 72 65 61 6b 3b 0a  ISTING;..break;.
3a20: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 63 72      default:..cr
3a30: 65 61 74 65 4d 6f 64 65 20 3d 20 4f 50 45 4e 5f  eateMode = OPEN_
3a40: 45 58 49 53 54 49 4e 47 3b 0a 09 62 72 65 61 6b  EXISTING;..break
3a50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
3a60: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
3a70: 29 3b 0a 20 20 20 20 6e 61 74 69 76 65 50 61 74  );.    nativePat
3a80: 68 20 3d 20 54 63 6c 5f 55 74 66 54 6f 57 43 68  h = Tcl_UtfToWCh
3a90: 61 72 44 53 74 72 69 6e 67 28 70 61 74 68 2c 20  arDString(path, 
3aa0: 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 2c 20  TCL_INDEX_NONE, 
3ab0: 26 64 73 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  &ds);..    /*.  
3ac0: 20 20 20 2a 20 49 66 20 74 68 65 20 66 69 6c 65     * If the file
3ad0: 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 63 72   is not being cr
3ae0: 65 61 74 65 64 2c 20 75 73 65 20 74 68 65 20 65  eated, use the e
3af0: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 61 74 74  xisting file att
3b00: 72 69 62 75 74 65 73 2e 0a 20 20 20 20 20 2a 2f  ributes..     */
3b10: 0a 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30 3b  ..    flags = 0;
3b20: 0a 20 20 20 20 69 66 20 28 21 28 6d 6f 64 65 20  .    if (!(mode 
3b30: 26 20 4f 5f 43 52 45 41 54 29 29 20 7b 0a 09 66  & O_CREAT)) {..f
3b40: 6c 61 67 73 20 3d 20 47 65 74 46 69 6c 65 41 74  lags = GetFileAt
3b50: 74 72 69 62 75 74 65 73 57 28 6e 61 74 69 76 65  tributesW(native
3b60: 50 61 74 68 29 3b 0a 09 69 66 20 28 66 6c 61 67  Path);..if (flag
3b70: 73 20 3d 3d 20 30 78 46 46 46 46 46 46 46 46 29  s == 0xFFFFFFFF)
3b80: 20 7b 0a 09 20 20 20 20 66 6c 61 67 73 20 3d 20   {..    flags = 
3b90: 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  0;..}.    }..   
3ba0: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 74 20 75   /*.     * Set u
3bb0: 70 20 74 68 65 20 66 69 6c 65 20 73 68 61 72 69  p the file shari
3bc0: 6e 67 20 6d 6f 64 65 2e 20 20 57 65 20 77 61 6e  ng mode.  We wan
3bd0: 74 20 74 6f 20 61 6c 6c 6f 77 20 73 69 6d 75 6c  t to allow simul
3be0: 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 2e 0a  taneous access..
3bf0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 68 61       */..    sha
3c00: 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48  reMode = FILE_SH
3c10: 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
3c20: 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20  SHARE_WRITE;..  
3c30: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 77 20    /*.     * Now 
3c40: 77 65 20 67 65 74 20 74 6f 20 63 72 65 61 74 65  we get to create
3c50: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 20   the file..     
3c60: 2a 2f 0a 0a 20 20 20 20 68 61 6e 64 6c 65 20 3d  */..    handle =
3c70: 20 43 72 65 61 74 65 46 69 6c 65 57 28 6e 61 74   CreateFileW(nat
3c80: 69 76 65 50 61 74 68 2c 20 61 63 63 65 73 73 4d  ivePath, accessM
3c90: 6f 64 65 2c 20 73 68 61 72 65 4d 6f 64 65 2c 0a  ode, shareMode,.
3ca0: 09 20 20 20 20 4e 55 4c 4c 2c 20 63 72 65 61 74  .    NULL, creat
3cb0: 65 4d 6f 64 65 2c 20 66 6c 61 67 73 2c 20 4e 55  eMode, flags, NU
3cc0: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  LL);.    Tcl_DSt
3cd0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a  ringFree(&ds);..
3ce0: 20 20 20 20 69 66 20 28 68 61 6e 64 6c 65 20 3d      if (handle =
3cf0: 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
3d00: 5f 56 41 4c 55 45 29 20 7b 0a 09 44 57 4f 52 44  _VALUE) {..DWORD
3d10: 20 65 72 72 3b 0a 0a 09 65 72 72 20 3d 20 47 65   err;...err = Ge
3d20: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 09 69  tLastError();..i
3d30: 66 20 28 28 65 72 72 20 26 20 30 78 46 46 46 46  f ((err & 0xFFFF
3d40: 4c 29 20 3d 3d 20 45 52 52 4f 52 5f 4f 50 45 4e  L) == ERROR_OPEN
3d50: 5f 46 41 49 4c 45 44 29 20 7b 0a 09 20 20 20 20  _FAILED) {..    
3d60: 65 72 72 20 3d 20 28 6d 6f 64 65 20 26 20 4f 5f  err = (mode & O_
3d70: 43 52 45 41 54 29 20 3f 20 45 52 52 4f 52 5f 46  CREAT) ? ERROR_F
3d80: 49 4c 45 5f 45 58 49 53 54 53 20 3a 20 45 52 52  ILE_EXISTS : ERR
3d90: 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
3da0: 44 3b 0a 09 7d 0a 09 54 63 6c 5f 57 69 6e 43 6f  D;..}..Tcl_WinCo
3db0: 6e 76 65 72 74 45 72 72 6f 72 28 65 72 72 29 3b  nvertError(err);
3dc0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
3dd0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
3de0: 20 20 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20    * Seek to the 
3df0: 65 6e 64 20 6f 66 20 66 69 6c 65 20 69 66 20 77  end of file if w
3e00: 65 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 20  e are writing.. 
3e10: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28      */..    if (
3e20: 6d 6f 64 65 20 26 20 28 4f 5f 57 52 4f 4e 4c 59  mode & (O_WRONLY
3e30: 7c 4f 5f 41 50 50 45 4e 44 29 29 20 7b 0a 09 53  |O_APPEND)) {..S
3e40: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 68 61  etFilePointer(ha
3e50: 6e 64 6c 65 2c 20 30 2c 20 4e 55 4c 4c 2c 20 46  ndle, 0, NULL, F
3e60: 49 4c 45 5f 45 4e 44 29 3b 0a 20 20 20 20 7d 0a  ILE_END);.    }.
3e70: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 57  .    return TclW
3e80: 69 6e 4d 61 6b 65 46 69 6c 65 28 68 61 6e 64 6c  inMakeFile(handl
3e90: 65 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  e);.}.../*. *---
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ee0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 43 72  ---. *. * TclpCr
3ef0: 65 61 74 65 54 65 6d 70 46 69 6c 65 20 2d 2d 0a  eateTempFile --.
3f00: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
3f10: 69 6f 6e 20 6f 70 65 6e 73 20 61 20 75 6e 69 71  ion opens a uniq
3f20: 75 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ue file with the
3f30: 20 70 72 6f 70 65 72 74 79 20 74 68 61 74 20 69   property that i
3f40: 74 20 77 69 6c 6c 20 62 65 0a 20 2a 09 64 65 6c  t will be. *.del
3f50: 65 74 65 64 20 77 68 65 6e 20 69 74 73 20 66 69  eted when its fi
3f60: 6c 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f  le handle is clo
3f70: 73 65 64 2e 20 54 68 65 20 74 65 6d 70 6f 72 61  sed. The tempora
3f80: 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
3f90: 65 64 0a 20 2a 09 69 6e 20 74 68 65 20 73 79 73  ed. *.in the sys
3fa0: 74 65 6d 20 74 65 6d 70 6f 72 61 72 79 20 64 69  tem temporary di
3fb0: 72 65 63 74 6f 72 79 2e 0a 20 2a 0a 20 2a 20 52  rectory.. *. * R
3fc0: 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72  esults:. *.Retur
3fd0: 6e 73 20 61 20 76 61 6c 69 64 20 54 63 6c 46 69  ns a valid TclFi
3fe0: 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 6f 6e 20 66  le, or NULL on f
3ff0: 61 69 6c 75 72 65 2e 0a 20 2a 0a 20 2a 20 53 69  ailure.. *. * Si
4000: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
4010: 72 65 61 74 65 73 20 61 20 6e 65 77 20 74 65 6d  reates a new tem
4020: 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 20 2a 0a  porary file.. *.
4030: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63  --------. */..Tc
4080: 6c 46 69 6c 65 0a 54 63 6c 70 43 72 65 61 74 65  lFile.TclpCreate
4090: 54 65 6d 70 46 69 6c 65 28 0a 20 20 20 20 63 6f  TempFile(.    co
40a0: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 74 65 6e  nst char *conten
40b0: 74 73 29 09 2f 2a 20 53 74 72 69 6e 67 20 74 6f  ts)./* String to
40c0: 20 77 72 69 74 65 20 69 6e 74 6f 20 74 65 6d 70   write into temp
40d0: 20 66 69 6c 65 2c 20 6f 72 20 4e 55 4c 4c 2e 20   file, or NULL. 
40e0: 2a 2f 0a 7b 0a 20 20 20 20 57 43 48 41 52 20 6e  */.{.    WCHAR n
40f0: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20  ame[MAX_PATH];. 
4100: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e     const char *n
4110: 61 74 69 76 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ative = NULL;.  
4120: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73    Tcl_DString ds
4130: 74 72 69 6e 67 3b 0a 20 20 20 20 48 41 4e 44 4c  tring;.    HANDL
4140: 45 20 68 61 6e 64 6c 65 3b 0a 0a 20 20 20 20 69  E handle;..    i
4150: 66 20 28 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  f (TempFileName(
4160: 6e 61 6d 65 29 20 3d 3d 20 30 29 20 7b 0a 09 72  name) == 0) {..r
4170: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
4180: 7d 0a 0a 20 20 20 20 68 61 6e 64 6c 65 20 3d 20  }..    handle = 
4190: 43 72 65 61 74 65 46 69 6c 65 57 28 6e 61 6d 65  CreateFileW(name
41a0: 2c 0a 09 20 20 20 20 47 45 4e 45 52 49 43 5f 52  ,..    GENERIC_R
41b0: 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52  EAD | GENERIC_WR
41c0: 49 54 45 2c 20 30 2c 20 4e 55 4c 4c 2c 20 43 52  ITE, 0, NULL, CR
41d0: 45 41 54 45 5f 41 4c 57 41 59 53 2c 0a 09 20 20  EATE_ALWAYS,..  
41e0: 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45    FILE_ATTRIBUTE
41f0: 5f 54 45 4d 50 4f 52 41 52 59 7c 46 49 4c 45 5f  _TEMPORARY|FILE_
4200: 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43  FLAG_DELETE_ON_C
4210: 4c 4f 53 45 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  LOSE, NULL);.   
4220: 20 69 66 20 28 68 61 6e 64 6c 65 20 3d 3d 20 49   if (handle == I
4230: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
4240: 4c 55 45 29 20 7b 0a 09 67 6f 74 6f 20 65 72 72  LUE) {..goto err
4250: 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  or;.    }..    /
4260: 2a 0a 20 20 20 20 20 2a 20 57 72 69 74 65 20 74  *.     * Write t
4270: 68 65 20 66 69 6c 65 20 6f 75 74 2c 20 64 6f 69  he file out, doi
4280: 6e 67 20 6c 69 6e 65 20 74 72 61 6e 73 6c 61 74  ng line translat
4290: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 77 61 79 2e  ions on the way.
42a0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
42b0: 20 28 63 6f 6e 74 65 6e 74 73 20 21 3d 20 4e 55   (contents != NU
42c0: 4c 4c 29 20 7b 0a 09 44 57 4f 52 44 20 72 65 73  LL) {..DWORD res
42d0: 75 6c 74 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c  ult;..Tcl_Size l
42e0: 65 6e 67 74 68 3b 0a 09 63 6f 6e 73 74 20 63 68  ength;..const ch
42f0: 61 72 20 2a 70 3b 0a 09 54 63 6c 5f 53 69 7a 65  ar *p;..Tcl_Size
4300: 20 74 6f 43 6f 70 79 3b 0a 0a 09 2f 2a 0a 09 20   toCopy;.../*.. 
4310: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f  * Convert the co
4320: 6e 74 65 6e 74 73 20 66 72 6f 6d 20 55 54 46 20  ntents from UTF 
4330: 74 6f 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  to native encodi
4340: 6e 67 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 54 63  ng.. */...if (Tc
4350: 6c 5f 55 74 66 54 6f 45 78 74 65 72 6e 61 6c 44  l_UtfToExternalD
4360: 53 74 72 69 6e 67 45 78 28 4e 55 4c 4c 2c 20 4e  StringEx(NULL, N
4370: 55 4c 4c 2c 20 63 6f 6e 74 65 6e 74 73 2c 20 54  ULL, contents, T
4380: 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 2c 20 30  CL_INDEX_NONE, 0
4390: 2c 0a 09 09 26 64 73 74 72 69 6e 67 2c 20 4e 55  ,...&dstring, NU
43a0: 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  LL) != TCL_OK) {
43b0: 0a 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  ..    goto error
43c0: 3b 0a 09 7d 0a 09 6e 61 74 69 76 65 20 3d 20 54  ;..}..native = T
43d0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
43e0: 26 64 73 74 72 69 6e 67 29 3b 0a 0a 09 74 6f 43  &dstring);...toC
43f0: 6f 70 79 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e  opy = Tcl_DStrin
4400: 67 4c 65 6e 67 74 68 28 26 64 73 74 72 69 6e 67  gLength(&dstring
4410: 29 3b 0a 09 66 6f 72 20 28 70 20 3d 20 6e 61 74  );..for (p = nat
4420: 69 76 65 3b 20 74 6f 43 6f 70 79 20 3e 20 30 3b  ive; toCopy > 0;
4430: 20 70 2b 2b 2c 20 74 6f 43 6f 70 79 2d 2d 29 20   p++, toCopy--) 
4440: 7b 0a 09 20 20 20 20 69 66 20 28 2a 70 20 3d 3d  {..    if (*p ==
4450: 20 27 5c 6e 27 29 20 7b 0a 09 09 6c 65 6e 67 74   '\n') {...lengt
4460: 68 20 3d 20 70 20 2d 20 6e 61 74 69 76 65 3b 0a  h = p - native;.
4470: 09 09 69 66 20 28 6c 65 6e 67 74 68 20 3e 20 30  ..if (length > 0
4480: 29 20 7b 0a 09 09 20 20 20 20 69 66 20 28 21 57  ) {...    if (!W
4490: 72 69 74 65 46 69 6c 65 28 68 61 6e 64 6c 65 2c  riteFile(handle,
44a0: 20 6e 61 74 69 76 65 2c 20 28 44 57 4f 52 44 29   native, (DWORD)
44b0: 6c 65 6e 67 74 68 2c 20 26 72 65 73 75 6c 74 2c  length, &result,
44c0: 20 4e 55 4c 4c 29 29 20 7b 0a 09 09 09 67 6f 74   NULL)) {....got
44d0: 6f 20 65 72 72 6f 72 3b 0a 09 09 20 20 20 20 7d  o error;...    }
44e0: 0a 09 09 7d 0a 09 09 69 66 20 28 21 57 72 69 74  ...}...if (!Writ
44f0: 65 46 69 6c 65 28 68 61 6e 64 6c 65 2c 20 22 5c  eFile(handle, "\
4500: 72 5c 6e 22 2c 20 32 2c 20 26 72 65 73 75 6c 74  r\n", 2, &result
4510: 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 09 20 20 20  , NULL)) {...   
4520: 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 09 7d   goto error;...}
4530: 0a 09 09 6e 61 74 69 76 65 20 3d 20 70 2b 31 3b  ...native = p+1;
4540: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 6c 65 6e 67  ..    }..}..leng
4550: 74 68 20 3d 20 70 20 2d 20 6e 61 74 69 76 65 3b  th = p - native;
4560: 0a 09 69 66 20 28 6c 65 6e 67 74 68 20 3e 20 30  ..if (length > 0
4570: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 57 72  ) {..    if (!Wr
4580: 69 74 65 46 69 6c 65 28 68 61 6e 64 6c 65 2c 20  iteFile(handle, 
4590: 6e 61 74 69 76 65 2c 20 28 44 57 4f 52 44 29 6c  native, (DWORD)l
45a0: 65 6e 67 74 68 2c 20 26 72 65 73 75 6c 74 2c 20  ength, &result, 
45b0: 4e 55 4c 4c 29 29 20 7b 0a 09 09 67 6f 74 6f 20  NULL)) {...goto 
45c0: 65 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 7d  error;..    }..}
45d0: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
45e0: 65 28 26 64 73 74 72 69 6e 67 29 3b 0a 09 69 66  e(&dstring);..if
45f0: 20 28 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   (SetFilePointer
4600: 28 68 61 6e 64 6c 65 2c 20 30 2c 20 4e 55 4c 4c  (handle, 0, NULL
4610: 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 20 3d 3d  , FILE_BEGIN) ==
4620: 20 30 78 46 46 46 46 46 46 46 46 29 20 7b 0a 09   0xFFFFFFFF) {..
4630: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a      goto error;.
4640: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  .}.    }..    re
4650: 74 75 72 6e 20 54 63 6c 57 69 6e 4d 61 6b 65 46  turn TclWinMakeF
4660: 69 6c 65 28 68 61 6e 64 6c 65 29 3b 0a 0a 20 20  ile(handle);..  
4670: 65 72 72 6f 72 3a 0a 20 20 20 20 2f 2a 0a 20 20  error:.    /*.  
4680: 20 20 20 2a 20 46 72 65 65 20 74 68 65 20 6e 61     * Free the na
4690: 74 69 76 65 20 72 65 70 72 65 73 65 6e 74 61 74  tive representat
46a0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ion of the conte
46b0: 6e 74 73 20 69 66 20 6e 65 63 65 73 73 61 72 79  nts if necessary
46c0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
46d0: 66 20 28 63 6f 6e 74 65 6e 74 73 20 21 3d 20 4e  f (contents != N
46e0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 53 74 72  ULL) {..Tcl_DStr
46f0: 69 6e 67 46 72 65 65 28 26 64 73 74 72 69 6e 67  ingFree(&dstring
4700: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
4710: 20 28 6e 61 74 69 76 65 20 21 3d 20 4e 55 4c 4c   (native != NULL
4720: 29 20 7b 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76  ) {..Tcl_WinConv
4730: 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74  ertError(GetLast
4740: 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a  Error());.    }.
4750: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
4760: 68 61 6e 64 6c 65 29 3b 0a 20 20 20 20 44 65 6c  handle);.    Del
4770: 65 74 65 46 69 6c 65 57 28 6e 61 6d 65 29 3b 0a  eteFileW(name);.
4780: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
4790: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 0a 20 2a 0a 20 2a 20 54 63 6c 70 54 65 6d 70 46  . *. * TclpTempF
47f0: 69 6c 65 4e 61 6d 65 20 2d 2d 0a 20 2a 0a 20 2a  ileName --. *. *
4800: 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72  .This function r
4810: 65 74 75 72 6e 73 20 61 20 75 6e 69 71 75 65 20  eturns a unique 
4820: 66 69 6c 65 6e 61 6d 65 2e 0a 20 2a 0a 20 2a 20  filename.. *. * 
4830: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75  Results:. *.Retu
4840: 72 6e 73 20 61 20 76 61 6c 69 64 20 54 63 6c 5f  rns a valid Tcl_
4850: 4f 62 6a 2a 20 77 69 74 68 20 72 65 66 43 6f 75  Obj* with refCou
4860: 6e 74 20 30 2c 20 6f 72 20 4e 55 4c 4c 20 6f 6e  nt 0, or NULL on
4870: 20 66 61 69 6c 75 72 65 2e 0a 20 2a 0a 20 2a 20   failure.. *. * 
4880: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4890: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a 20  --. */..Tcl_Obj 
48f0: 2a 0a 54 63 6c 70 54 65 6d 70 46 69 6c 65 4e 61  *.TclpTempFileNa
4900: 6d 65 28 76 6f 69 64 29 0a 7b 0a 20 20 20 20 57  me(void).{.    W
4910: 43 48 41 52 20 66 69 6c 65 4e 61 6d 65 5b 4d 41  CHAR fileName[MA
4920: 58 5f 50 41 54 48 5d 3b 0a 0a 20 20 20 20 69 66  X_PATH];..    if
4930: 20 28 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 66   (TempFileName(f
4940: 69 6c 65 4e 61 6d 65 29 20 3d 3d 20 30 29 20 7b  ileName) == 0) {
4950: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
4960: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
4970: 20 54 63 6c 70 4e 61 74 69 76 65 54 6f 4e 6f 72   TclpNativeToNor
4980: 6d 61 6c 69 7a 65 64 28 66 69 6c 65 4e 61 6d 65  malized(fileName
4990: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 43 72 65  --. *. * TclpCre
49f0: 61 74 65 50 69 70 65 20 2d 2d 0a 20 2a 0a 20 2a  atePipe --. *. *
4a00: 09 43 72 65 61 74 65 73 20 61 6e 20 61 6e 6f 6e  .Creates an anon
4a10: 79 6d 6f 75 73 20 70 69 70 65 2e 0a 20 2a 0a 20  ymous pipe.. *. 
4a20: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65  * Results:. *.Re
4a30: 74 75 72 6e 73 20 31 20 6f 6e 20 73 75 63 63 65  turns 1 on succe
4a40: 73 73 2c 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  ss, 0 on failure
4a50: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
4a60: 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73  ects:. *.Creates
4a70: 20 61 20 70 69 70 65 2e 0a 20 2a 0a 20 2a 2d 2d   a pipe.. *. *--
4a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ac0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63  ----. */..int.Tc
4ad0: 6c 70 43 72 65 61 74 65 50 69 70 65 28 0a 20 20  lpCreatePipe(.  
4ae0: 20 20 54 63 6c 46 69 6c 65 20 2a 72 65 61 64 50    TclFile *readP
4af0: 69 70 65 2c 09 09 2f 2a 20 4c 6f 63 61 74 69 6f  ipe,../* Locatio
4b00: 6e 20 74 6f 20 73 74 6f 72 65 20 66 69 6c 65 20  n to store file 
4b10: 68 61 6e 64 6c 65 20 66 6f 72 20 72 65 61 64 20  handle for read 
4b20: 73 69 64 65 0a 09 09 09 09 20 2a 20 6f 66 20 70  side..... * of p
4b30: 69 70 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 46  ipe. */.    TclF
4b40: 69 6c 65 20 2a 77 72 69 74 65 50 69 70 65 29 09  ile *writePipe).
4b50: 09 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 74 6f 20  ./* Location to 
4b60: 73 74 6f 72 65 20 66 69 6c 65 20 68 61 6e 64 6c  store file handl
4b70: 65 20 66 6f 72 20 77 72 69 74 65 0a 09 09 09 09  e for write.....
4b80: 20 2a 20 73 69 64 65 20 6f 66 20 70 69 70 65 2e   * side of pipe.
4b90: 20 2a 2f 0a 7b 0a 20 20 20 20 48 41 4e 44 4c 45   */.{.    HANDLE
4ba0: 20 72 65 61 64 48 61 6e 64 6c 65 2c 20 77 72 69   readHandle, wri
4bb0: 74 65 48 61 6e 64 6c 65 3b 0a 0a 20 20 20 20 69  teHandle;..    i
4bc0: 66 20 28 43 72 65 61 74 65 50 69 70 65 28 26 72  f (CreatePipe(&r
4bd0: 65 61 64 48 61 6e 64 6c 65 2c 20 26 77 72 69 74  eadHandle, &writ
4be0: 65 48 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 30  eHandle, NULL, 0
4bf0: 29 20 21 3d 20 30 29 20 7b 0a 09 2a 72 65 61 64  ) != 0) {..*read
4c00: 50 69 70 65 20 3d 20 54 63 6c 57 69 6e 4d 61 6b  Pipe = TclWinMak
4c10: 65 46 69 6c 65 28 72 65 61 64 48 61 6e 64 6c 65  eFile(readHandle
4c20: 29 3b 0a 09 2a 77 72 69 74 65 50 69 70 65 20 3d  );..*writePipe =
4c30: 20 54 63 6c 57 69 6e 4d 61 6b 65 46 69 6c 65 28   TclWinMakeFile(
4c40: 77 72 69 74 65 48 61 6e 64 6c 65 29 3b 0a 09 72  writeHandle);..r
4c50: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
4c60: 20 20 20 20 54 63 6c 5f 57 69 6e 43 6f 6e 76 65      Tcl_WinConve
4c70: 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45  rtError(GetLastE
4c80: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74  rror());.    ret
4c90: 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  urn 0;.}.../*. *
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ce0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c  ------. *. * Tcl
4cf0: 70 43 6c 6f 73 65 46 69 6c 65 20 2d 2d 0a 20 2a  pCloseFile --. *
4d00: 0a 20 2a 09 43 6c 6f 73 65 73 20 61 20 70 69 70  . *.Closes a pip
4d10: 65 6c 69 6e 65 20 66 69 6c 65 20 68 61 6e 64 6c  eline file handl
4d20: 65 2e 20 54 68 65 73 65 20 68 61 6e 64 6c 65 73  e. These handles
4d30: 20 61 72 65 20 63 72 65 61 74 65 64 20 62 79 0a   are created by.
4d40: 20 2a 09 54 63 6c 70 4f 70 65 6e 46 69 6c 65 2c   *.TclpOpenFile,
4d50: 20 54 63 6c 70 43 72 65 61 74 65 50 69 70 65 2c   TclpCreatePipe,
4d60: 20 6f 72 20 54 63 6c 70 4d 61 6b 65 46 69 6c 65   or TclpMakeFile
4d70: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
4d80: 0a 20 2a 09 30 20 6f 6e 20 73 75 63 63 65 73 73  . *.0 on success
4d90: 2c 20 2d 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e  , -1 on failure.
4da0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4db0: 63 74 73 3a 0a 20 2a 09 54 68 65 20 66 69 6c 65  cts:. *.The file
4dc0: 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   is closed and d
4dd0: 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 2a 0a 20  eallocated.. *. 
4de0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e20: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74  -------. */..int
4e30: 0a 54 63 6c 70 43 6c 6f 73 65 46 69 6c 65 28 0a  .TclpCloseFile(.
4e40: 20 20 20 20 54 63 6c 46 69 6c 65 20 66 69 6c 65      TclFile file
4e50: 29 09 09 2f 2a 20 54 68 65 20 66 69 6c 65 20 74  )../* The file t
4e60: 6f 20 63 6c 6f 73 65 2e 20 2a 2f 0a 7b 0a 20 20  o close. */.{.  
4e70: 20 20 57 69 6e 46 69 6c 65 20 2a 66 69 6c 65 50    WinFile *fileP
4e80: 74 72 20 3d 20 28 57 69 6e 46 69 6c 65 20 2a 29  tr = (WinFile *)
4e90: 20 66 69 6c 65 3b 0a 0a 20 20 20 20 73 77 69 74   file;..    swit
4ea0: 63 68 20 28 66 69 6c 65 50 74 72 2d 3e 74 79 70  ch (filePtr->typ
4eb0: 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20 57 49  e) {.    case WI
4ec0: 4e 5f 46 49 4c 45 3a 0a 09 2f 2a 0a 09 20 2a 20  N_FILE:../*.. * 
4ed0: 44 6f 6e 27 74 20 63 6c 6f 73 65 20 74 68 65 20  Don't close the 
4ee0: 57 69 6e 33 32 20 68 61 6e 64 6c 65 20 69 66 20  Win32 handle if 
4ef0: 74 68 65 20 68 61 6e 64 6c 65 20 69 73 20 61 20  the handle is a 
4f00: 73 74 61 6e 64 61 72 64 20 63 68 61 6e 6e 65 6c  standard channel
4f10: 0a 09 20 2a 20 64 75 72 69 6e 67 20 74 68 65 20  .. * during the 
4f20: 74 68 72 65 61 64 20 65 78 69 74 20 70 72 6f 63  thread exit proc
4f30: 65 73 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ess. Otherwise, 
4f40: 6f 6e 65 20 74 68 72 65 61 64 20 6d 61 79 20 6b  one thread may k
4f50: 69 6c 6c 20 74 68 65 0a 09 20 2a 20 73 74 64 69  ill the.. * stdi
4f60: 6f 20 6f 66 20 61 6e 6f 74 68 65 72 2e 0a 09 20  o of another... 
4f70: 2a 2f 0a 0a 09 69 66 20 28 21 54 63 6c 49 6e 54  */...if (!TclInT
4f80: 68 72 65 61 64 45 78 69 74 28 29 0a 09 09 7c 7c  hreadExit()...||
4f90: 20 28 28 47 65 74 53 74 64 48 61 6e 64 6c 65 28   ((GetStdHandle(
4fa0: 53 54 44 5f 49 4e 50 55 54 5f 48 41 4e 44 4c 45  STD_INPUT_HANDLE
4fb0: 29 20 21 3d 20 66 69 6c 65 50 74 72 2d 3e 68 61  ) != filePtr->ha
4fc0: 6e 64 6c 65 29 0a 09 09 20 20 20 20 26 26 20 28  ndle)...    && (
4fd0: 47 65 74 53 74 64 48 61 6e 64 6c 65 28 53 54 44  GetStdHandle(STD
4fe0: 5f 4f 55 54 50 55 54 5f 48 41 4e 44 4c 45 29 20  _OUTPUT_HANDLE) 
4ff0: 21 3d 20 66 69 6c 65 50 74 72 2d 3e 68 61 6e 64  != filePtr->hand
5000: 6c 65 29 0a 09 09 20 20 20 20 26 26 20 28 47 65  le)...    && (Ge
5010: 74 53 74 64 48 61 6e 64 6c 65 28 53 54 44 5f 45  tStdHandle(STD_E
5020: 52 52 4f 52 5f 48 41 4e 44 4c 45 29 20 21 3d 20  RROR_HANDLE) != 
5030: 66 69 6c 65 50 74 72 2d 3e 68 61 6e 64 6c 65 29  filePtr->handle)
5040: 29 29 20 7b 0a 09 20 20 20 20 69 66 20 28 66 69  )) {..    if (fi
5050: 6c 65 50 74 72 2d 3e 68 61 6e 64 6c 65 20 21 3d  lePtr->handle !=
5060: 20 4e 55 4c 4c 20 26 26 0a 09 09 20 20 20 20 43   NULL &&...    C
5070: 6c 6f 73 65 48 61 6e 64 6c 65 28 66 69 6c 65 50  loseHandle(fileP
5080: 74 72 2d 3e 68 61 6e 64 6c 65 29 20 3d 3d 20 46  tr->handle) == F
5090: 41 4c 53 45 29 20 7b 0a 09 09 54 63 6c 5f 57 69  ALSE) {...Tcl_Wi
50a0: 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65  nConvertError(Ge
50b0: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09  tLastError());..
50c0: 09 54 63 6c 5f 46 72 65 65 28 66 69 6c 65 50 74  .Tcl_Free(filePt
50d0: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b  r);...return -1;
50e0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61  ..    }..}..brea
50f0: 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
5100: 0a 09 54 63 6c 5f 50 61 6e 69 63 28 22 54 63 6c  ..Tcl_Panic("Tcl
5110: 70 43 6c 6f 73 65 46 69 6c 65 3a 20 75 6e 65 78  pCloseFile: unex
5120: 70 65 63 74 65 64 20 66 69 6c 65 20 74 79 70 65  pected file type
5130: 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  ");.    }..    T
5140: 63 6c 5f 46 72 65 65 28 66 69 6c 65 50 74 72 29  cl_Free(filePtr)
5150: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
5160: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51b0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 47 65  ---. *. * TclpGe
51c0: 74 50 69 64 20 2d 2d 0a 20 2a 0a 20 2a 09 47 69  tPid --. *. *.Gi
51d0: 76 65 6e 20 61 20 48 41 4e 44 4c 45 20 74 6f 20  ven a HANDLE to 
51e0: 61 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 2c  a child process,
51f0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 72 6f 63   return the proc
5200: 65 73 73 20 69 64 20 66 6f 72 20 74 68 61 74 0a  ess id for that.
5210: 20 2a 09 63 68 69 6c 64 20 70 72 6f 63 65 73 73   *.child process
5220: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
5230: 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 68 65 20  . *.Returns the 
5240: 70 72 6f 63 65 73 73 20 69 64 20 66 6f 72 20 74  process id for t
5250: 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73  he child process
5260: 2e 20 49 66 20 74 68 65 20 70 69 64 20 77 61 73  . If the pid was
5270: 20 6e 6f 74 20 6b 6e 6f 77 6e 0a 20 2a 09 62 79   not known. *.by
5280: 20 54 63 6c 2c 20 65 69 74 68 65 72 20 62 65 63   Tcl, either bec
5290: 61 75 73 65 20 74 68 65 20 70 69 64 20 77 61 73  ause the pid was
52a0: 20 6e 6f 74 20 63 72 65 61 74 65 64 20 62 79 20   not created by 
52b0: 54 63 6c 20 6f 72 20 74 68 65 20 63 68 69 6c 64  Tcl or the child
52c0: 0a 20 2a 09 70 72 6f 63 65 73 73 20 68 61 73 20  . *.process has 
52d0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61  already been rea
52e0: 70 65 64 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e  ped, TCL_INDEX_N
52f0: 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
5300: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
5310: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
5320: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5370: 2f 0a 0a 54 63 6c 5f 53 69 7a 65 0a 54 63 6c 70  /..Tcl_Size.Tclp
5380: 47 65 74 50 69 64 28 0a 20 20 20 20 54 63 6c 5f  GetPid(.    Tcl_
5390: 50 69 64 20 70 69 64 29 09 09 2f 2a 20 54 68 65  Pid pid)../* The
53a0: 20 48 41 4e 44 4c 45 20 6f 66 20 74 68 65 20 63   HANDLE of the c
53b0: 68 69 6c 64 20 70 72 6f 63 65 73 73 2e 20 2a 2f  hild process. */
53c0: 0a 7b 0a 20 20 20 20 50 72 6f 63 49 6e 66 6f 20  .{.    ProcInfo 
53d0: 2a 69 6e 66 6f 50 74 72 3b 0a 0a 20 20 20 20 50  *infoPtr;..    P
53e0: 69 70 65 49 6e 69 74 28 29 3b 0a 0a 20 20 20 20  ipeInit();..    
53f0: 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 70  Tcl_MutexLock(&p
5400: 69 70 65 4d 75 74 65 78 29 3b 0a 20 20 20 20 66  ipeMutex);.    f
5410: 6f 72 20 28 69 6e 66 6f 50 74 72 20 3d 20 70 72  or (infoPtr = pr
5420: 6f 63 4c 69 73 74 3b 20 69 6e 66 6f 50 74 72 20  ocList; infoPtr 
5430: 21 3d 20 4e 55 4c 4c 3b 20 69 6e 66 6f 50 74 72  != NULL; infoPtr
5440: 20 3d 20 69 6e 66 6f 50 74 72 2d 3e 6e 65 78 74   = infoPtr->next
5450: 50 74 72 29 20 7b 0a 09 69 66 20 28 69 6e 66 6f  Ptr) {..if (info
5460: 50 74 72 2d 3e 64 77 50 72 6f 63 65 73 73 49 64  Ptr->dwProcessId
5470: 20 3d 3d 20 28 54 63 6c 5f 53 69 7a 65 29 70 69   == (Tcl_Size)pi
5480: 64 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4d 75  d) {..    Tcl_Mu
5490: 74 65 78 55 6e 6c 6f 63 6b 28 26 70 69 70 65 4d  texUnlock(&pipeM
54a0: 75 74 65 78 29 3b 0a 09 20 20 20 20 72 65 74 75  utex);..    retu
54b0: 72 6e 20 69 6e 66 6f 50 74 72 2d 3e 64 77 50 72  rn infoPtr->dwPr
54c0: 6f 63 65 73 73 49 64 3b 0a 09 7d 0a 20 20 20 20  ocessId;..}.    
54d0: 7d 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55  }.    Tcl_MutexU
54e0: 6e 6c 6f 63 6b 28 26 70 69 70 65 4d 75 74 65 78  nlock(&pipeMutex
54f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  );.    return -1
5500: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70 43 72 65 61  -. *. * TclpCrea
5560: 74 65 50 72 6f 63 65 73 73 20 2d 2d 0a 20 2a 0a  teProcess --. *.
5570: 20 2a 09 43 72 65 61 74 65 20 61 20 63 68 69 6c   *.Create a chil
5580: 64 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 68  d process that h
5590: 61 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  as the specified
55a0: 20 66 69 6c 65 73 20 61 73 20 69 74 73 20 73 74   files as its st
55b0: 61 6e 64 61 72 64 0a 20 2a 09 69 6e 70 75 74 2c  andard. *.input,
55c0: 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72   output, and err
55d0: 6f 72 2e 20 54 68 65 20 63 68 69 6c 64 20 70 72  or. The child pr
55e0: 6f 63 65 73 73 20 72 75 6e 73 20 61 73 79 6e 63  ocess runs async
55f0: 68 72 6f 6e 6f 75 73 6c 79 20 75 6e 64 65 72 0a  hronously under.
5600: 20 2a 09 57 69 6e 64 6f 77 73 20 4e 54 20 61 6e   *.Windows NT an
5610: 64 20 57 69 6e 64 6f 77 73 20 39 78 2c 20 61 6e  d Windows 9x, an
5620: 64 20 72 75 6e 73 20 77 69 74 68 20 74 68 65 20  d runs with the 
5630: 73 61 6d 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  same environment
5640: 0a 20 2a 09 76 61 72 69 61 62 6c 65 73 20 61 73  . *.variables as
5650: 20 74 68 65 20 63 72 65 61 74 69 6e 67 20 70 72   the creating pr
5660: 6f 63 65 73 73 2e 0a 20 2a 0a 20 2a 09 54 68 65  ocess.. *. *.The
5670: 20 63 6f 6d 70 6c 65 74 65 20 57 69 6e 64 6f 77   complete Window
5680: 73 20 73 65 61 72 63 68 20 70 61 74 68 20 69 73  s search path is
5690: 20 73 65 61 72 63 68 65 64 20 74 6f 20 66 69 6e   searched to fin
56a0: 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  d the specified.
56b0: 20 2a 09 65 78 65 63 75 74 61 62 6c 65 2e 20 49   *.executable. I
56c0: 66 20 61 6e 20 65 78 65 63 75 74 61 62 6c 65 20  f an executable 
56d0: 62 79 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d  by the given nam
56e0: 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a  e is not found,.
56f0: 20 2a 09 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79   *.automatically
5700: 20 74 72 69 65 73 20 61 70 70 65 6e 64 69 6e 67   tries appending
5710: 20 73 74 61 6e 64 61 72 64 20 65 78 74 65 6e 73   standard extens
5720: 69 6f 6e 73 20 74 6f 20 74 68 65 0a 20 2a 09 65  ions to the. *.e
5730: 78 65 63 75 74 61 62 6c 65 20 6e 61 6d 65 2e 0a  xecutable name..
5740: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
5750: 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  *.The return val
5760: 75 65 20 69 73 20 54 43 4c 5f 45 52 52 4f 52 20  ue is TCL_ERROR 
5770: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
5780: 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20  sage is left in 
5790: 74 68 65 0a 20 2a 09 69 6e 74 65 72 70 27 73 20  the. *.interp's 
57a0: 72 65 73 75 6c 74 20 69 66 20 74 68 65 72 65 20  result if there 
57b0: 77 61 73 20 61 20 70 72 6f 62 6c 65 6d 20 63 72  was a problem cr
57c0: 65 61 74 69 6e 67 20 74 68 65 20 63 68 69 6c 64  eating the child
57d0: 20 70 72 6f 63 65 73 73 2e 0a 20 2a 09 4f 74 68   process.. *.Oth
57e0: 65 72 77 69 73 65 2c 20 74 68 65 20 72 65 74 75  erwise, the retu
57f0: 72 6e 20 76 61 6c 75 65 20 69 73 20 54 43 4c 5f  rn value is TCL_
5800: 4f 4b 20 61 6e 64 20 2a 70 69 64 50 74 72 20 69  OK and *pidPtr i
5810: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
5820: 65 0a 20 2a 09 70 72 6f 63 65 73 73 20 69 64 20  e. *.process id 
5830: 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 72 6f  of the child pro
5840: 63 65 73 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  cess.. *. * Side
5850: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 20 70   effects:. *.A p
5860: 72 6f 63 65 73 73 20 69 73 20 63 72 65 61 74 65  rocess is create
5870: 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d.. *. *--------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
58c0: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 70 43 72 65 61  */..int.TclpCrea
58d0: 74 65 50 72 6f 63 65 73 73 28 0a 20 20 20 20 54  teProcess(.    T
58e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
58f0: 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74  p,../* Interpret
5900: 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6c  er in which to l
5910: 65 61 76 65 20 65 72 72 6f 72 73 20 74 68 61 74  eave errors that
5920: 0a 09 09 09 09 20 2a 20 6f 63 63 75 72 72 65 64  ..... * occurred
5930: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 74   when creating t
5940: 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73  he child process
5950: 2e 0a 09 09 09 09 20 2a 20 45 72 72 6f 72 20 6d  ...... * Error m
5960: 65 73 73 61 67 65 73 20 66 72 6f 6d 20 74 68 65  essages from the
5970: 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 0a 09   child process..
5980: 09 09 09 20 2a 20 69 74 73 65 6c 66 20 61 72 65  ... * itself are
5990: 20 73 65 6e 74 20 74 6f 20 65 72 72 6f 72 46 69   sent to errorFi
59a0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 5f  le. */.    size_
59b0: 74 20 61 72 67 63 2c 09 09 2f 2a 20 4e 75 6d 62  t argc,../* Numb
59c0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
59d0: 69 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  in following arr
59e0: 61 79 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ay. */.    const
59f0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 09 09 2f   char **argv,../
5a00: 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
5a10: 65 6e 74 20 73 74 72 69 6e 67 73 2e 20 61 72 67  ent strings. arg
5a20: 76 5b 30 5d 20 63 6f 6e 74 61 69 6e 73 0a 09 09  v[0] contains...
5a30: 09 09 20 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  .. * the name of
5a40: 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 20   the executable 
5a50: 63 6f 6e 76 65 72 74 65 64 20 74 6f 0a 09 09 09  converted to....
5a60: 09 20 2a 20 6e 61 74 69 76 65 20 66 6f 72 6d 61  . * native forma
5a70: 74 20 28 75 73 69 6e 67 20 74 68 65 0a 09 09 09  t (using the....
5a80: 09 20 2a 20 54 63 6c 5f 54 72 61 6e 73 6c 61 74  . * Tcl_Translat
5a90: 65 46 69 6c 65 4e 61 6d 65 20 63 61 6c 6c 29 2e  eFileName call).
5aa0: 20 41 64 64 69 74 69 6f 6e 61 6c 0a 09 09 09 09   Additional.....
5ab0: 20 2a 20 61 72 67 75 6d 65 6e 74 73 20 68 61 76   * arguments hav
5ac0: 65 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 76 65  e not been conve
5ad0: 72 74 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  rted. */.    Tcl
5ae0: 46 69 6c 65 20 69 6e 70 75 74 46 69 6c 65 2c 09  File inputFile,.
5af0: 09 2f 2a 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ./* If non-NULL,
5b00: 20 67 69 76 65 73 20 74 68 65 20 66 69 6c 65 20   gives the file 
5b10: 74 6f 20 75 73 65 20 61 73 20 69 6e 70 75 74 0a  to use as input.
5b20: 09 09 09 09 20 2a 20 66 6f 72 20 74 68 65 20 63  .... * for the c
5b30: 68 69 6c 64 20 70 72 6f 63 65 73 73 2e 20 49 66  hild process. If
5b40: 20 69 6e 70 75 74 46 69 6c 65 20 66 69 6c 65 20   inputFile file 
5b50: 69 73 0a 09 09 09 09 20 2a 20 6e 6f 74 20 72 65  is..... * not re
5b60: 61 64 61 62 6c 65 20 6f 72 20 69 73 20 4e 55 4c  adable or is NUL
5b70: 4c 2c 20 74 68 65 20 63 68 69 6c 64 20 77 69 6c  L, the child wil
5b80: 6c 0a 09 09 09 09 20 2a 20 72 65 63 65 69 76 65  l..... * receive
5b90: 20 6e 6f 20 73 74 61 6e 64 61 72 64 20 69 6e 70   no standard inp
5ba0: 75 74 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 46 69  ut. */.    TclFi
5bb0: 6c 65 20 6f 75 74 70 75 74 46 69 6c 65 2c 09 09  le outputFile,..
5bc0: 2f 2a 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  /* If non-NULL, 
5bd0: 67 69 76 65 73 20 74 68 65 20 66 69 6c 65 20 74  gives the file t
5be0: 68 61 74 20 72 65 63 65 69 76 65 73 0a 09 09 09  hat receives....
5bf0: 09 20 2a 20 6f 75 74 70 75 74 20 66 72 6f 6d 20  . * output from 
5c00: 74 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73  the child proces
5c10: 73 2e 20 49 66 0a 09 09 09 09 20 2a 20 6f 75 74  s. If..... * out
5c20: 70 75 74 46 69 6c 65 20 66 69 6c 65 20 69 73 20  putFile file is 
5c30: 6e 6f 74 20 77 72 69 74 61 62 6c 65 20 6f 72 20  not writable or 
5c40: 69 73 0a 09 09 09 09 20 2a 20 4e 55 4c 4c 2c 20  is..... * NULL, 
5c50: 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20  output from the 
5c60: 63 68 69 6c 64 20 77 69 6c 6c 20 62 65 0a 09 09  child will be...
5c70: 09 09 20 2a 20 64 69 73 63 61 72 64 65 64 2e 20  .. * discarded. 
5c80: 2a 2f 0a 20 20 20 20 54 63 6c 46 69 6c 65 20 65  */.    TclFile e
5c90: 72 72 6f 72 46 69 6c 65 2c 09 09 2f 2a 20 49 66  rrorFile,../* If
5ca0: 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 67 69 76 65 73   non-NULL, gives
5cb0: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 72   the file that r
5cc0: 65 63 65 69 76 65 73 0a 09 09 09 09 20 2a 20 65  eceives..... * e
5cd0: 72 72 6f 72 73 20 66 72 6f 6d 20 74 68 65 20 63  rrors from the c
5ce0: 68 69 6c 64 20 70 72 6f 63 65 73 73 2e 20 49 66  hild process. If
5cf0: 20 65 72 72 6f 72 46 69 6c 65 0a 09 09 09 09 20   errorFile..... 
5d00: 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72  * file is not wr
5d10: 69 74 61 62 6c 65 20 6f 72 20 69 73 20 4e 55 4c  itable or is NUL
5d20: 4c 2c 20 65 72 72 6f 72 73 0a 09 09 09 09 20 2a  L, errors..... *
5d30: 20 66 72 6f 6d 20 74 68 65 20 63 68 69 6c 64 20   from the child 
5d40: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65  will be discarde
5d50: 64 2e 20 65 72 72 6f 72 46 69 6c 65 0a 09 09 09  d. errorFile....
5d60: 09 20 2a 20 6d 61 79 20 62 65 20 74 68 65 20 73  . * may be the s
5d70: 61 6d 65 20 61 73 20 6f 75 74 70 75 74 46 69 6c  ame as outputFil
5d80: 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 50 69  e. */.    Tcl_Pi
5d90: 64 20 2a 70 69 64 50 74 72 29 09 09 2f 2a 20 49  d *pidPtr)../* I
5da0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
5db0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70  is successful, p
5dc0: 69 64 50 74 72 20 69 73 0a 09 09 09 09 20 2a 20  idPtr is..... * 
5dd0: 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
5de0: 70 72 6f 63 65 73 73 20 69 64 20 6f 66 20 74 68  process id of th
5df0: 65 20 63 68 69 6c 64 0a 09 09 09 09 20 2a 20 70  e child..... * p
5e00: 72 6f 63 65 73 73 2e 20 2a 2f 0a 7b 0a 20 20 20  rocess. */.{.   
5e10: 20 69 6e 74 20 72 65 73 75 6c 74 2c 20 61 70 70   int result, app
5e20: 6c 54 79 70 65 2c 20 63 72 65 61 74 65 46 6c 61  lType, createFla
5e30: 67 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  gs;.    Tcl_DStr
5e40: 69 6e 67 20 63 6d 64 4c 69 6e 65 3b 09 2f 2a 20  ing cmdLine;./* 
5e50: 43 6f 6d 70 6c 65 74 65 20 63 6f 6d 6d 61 6e 64  Complete command
5e60: 20 6c 69 6e 65 20 28 57 43 48 41 52 29 2e 20 2a   line (WCHAR). *
5e70: 2f 0a 20 20 20 20 53 54 41 52 54 55 50 49 4e 46  /.    STARTUPINF
5e80: 4f 57 20 73 74 61 72 74 49 6e 66 6f 3b 0a 20 20  OW startInfo;.  
5e90: 20 20 50 52 4f 43 45 53 53 5f 49 4e 46 4f 52 4d    PROCESS_INFORM
5ea0: 41 54 49 4f 4e 20 70 72 6f 63 49 6e 66 6f 3b 0a  ATION procInfo;.
5eb0: 20 20 20 20 53 45 43 55 52 49 54 59 5f 41 54 54      SECURITY_ATT
5ec0: 52 49 42 55 54 45 53 20 73 65 63 41 74 74 73 3b  RIBUTES secAtts;
5ed0: 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 50 72 6f  .    HANDLE hPro
5ee0: 63 65 73 73 2c 20 68 2c 20 69 6e 70 75 74 48 61  cess, h, inputHa
5ef0: 6e 64 6c 65 2c 20 6f 75 74 70 75 74 48 61 6e 64  ndle, outputHand
5f00: 6c 65 2c 20 65 72 72 6f 72 48 61 6e 64 6c 65 3b  le, errorHandle;
5f10: 0a 20 20 20 20 63 68 61 72 20 65 78 65 63 50 61  .    char execPa
5f20: 74 68 5b 4d 41 58 5f 50 41 54 48 20 2a 20 33 5d  th[MAX_PATH * 3]
5f30: 3b 0a 20 20 20 20 57 69 6e 46 69 6c 65 20 2a 66  ;.    WinFile *f
5f40: 69 6c 65 50 74 72 3b 0a 0a 20 20 20 20 50 69 70  ilePtr;..    Pip
5f50: 65 49 6e 69 74 28 29 3b 0a 0a 20 20 20 20 61 70  eInit();..    ap
5f60: 70 6c 54 79 70 65 20 3d 20 41 70 70 6c 69 63 61  plType = Applica
5f70: 74 69 6f 6e 54 79 70 65 28 69 6e 74 65 72 70 2c  tionType(interp,
5f80: 20 61 72 67 76 5b 30 5d 2c 20 65 78 65 63 50 61   argv[0], execPa
5f90: 74 68 29 3b 0a 20 20 20 20 69 66 20 28 61 70 70  th);.    if (app
5fa0: 6c 54 79 70 65 20 3d 3d 20 41 50 50 4c 5f 4e 4f  lType == APPL_NO
5fb0: 4e 45 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  NE) {..return TC
5fc0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
5fd0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c      result = TCL
5fe0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
5ff0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 63 6d 64  DStringInit(&cmd
6000: 4c 69 6e 65 29 3b 0a 20 20 20 20 68 50 72 6f 63  Line);.    hProc
6010: 65 73 73 20 3d 20 47 65 74 43 75 72 72 65 6e 74  ess = GetCurrent
6020: 50 72 6f 63 65 73 73 28 29 3b 0a 0a 20 20 20 20  Process();..    
6030: 2f 2a 0a 20 20 20 20 20 2a 20 53 54 41 52 54 46  /*.     * STARTF
6040: 5f 55 53 45 53 54 44 48 41 4e 44 4c 45 53 20 6d  _USESTDHANDLES m
6050: 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 70  ust be used to p
6060: 61 73 73 20 68 61 6e 64 6c 65 73 20 74 6f 20 63  ass handles to c
6070: 68 69 6c 64 20 70 72 6f 63 65 73 73 2e 0a 20 20  hild process..  
6080: 20 20 20 2a 20 55 73 69 6e 67 20 53 65 74 53 74     * Using SetSt
6090: 64 48 61 6e 64 6c 65 28 29 20 61 6e 64 2f 6f 72  dHandle() and/or
60a0: 20 64 75 70 32 28 29 20 6f 6e 6c 79 20 77 6f 72   dup2() only wor
60b0: 6b 73 20 77 68 65 6e 20 61 20 63 6f 6e 73 6f 6c  ks when a consol
60c0: 65 20 6d 6f 64 65 0a 20 20 20 20 20 2a 20 70 61  e mode.     * pa
60d0: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 69 73 20  rent process is 
60e0: 73 70 61 77 6e 69 6e 67 20 61 6e 20 61 74 74 61  spawning an atta
60f0: 63 68 65 64 20 63 6f 6e 73 6f 6c 65 20 6d 6f 64  ched console mod
6100: 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 2e  e child process.
6110: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 5a 65  .     */..    Ze
6120: 72 6f 4d 65 6d 6f 72 79 28 26 73 74 61 72 74 49  roMemory(&startI
6130: 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 73 74 61 72  nfo, sizeof(star
6140: 74 49 6e 66 6f 29 29 3b 0a 20 20 20 20 73 74 61  tInfo));.    sta
6150: 72 74 49 6e 66 6f 2e 63 62 20 3d 20 73 69 7a 65  rtInfo.cb = size
6160: 6f 66 28 73 74 61 72 74 49 6e 66 6f 29 3b 0a 20  of(startInfo);. 
6170: 20 20 20 73 74 61 72 74 49 6e 66 6f 2e 64 77 46     startInfo.dwF
6180: 6c 61 67 73 09 3d 20 53 54 41 52 54 46 5f 55 53  lags.= STARTF_US
6190: 45 53 54 44 48 41 4e 44 4c 45 53 3b 0a 20 20 20  ESTDHANDLES;.   
61a0: 20 73 74 61 72 74 49 6e 66 6f 2e 68 53 74 64 49   startInfo.hStdI
61b0: 6e 70 75 74 09 3d 20 49 4e 56 41 4c 49 44 5f 48  nput.= INVALID_H
61c0: 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20  ANDLE_VALUE;.   
61d0: 20 73 74 61 72 74 49 6e 66 6f 2e 68 53 74 64 4f   startInfo.hStdO
61e0: 75 74 70 75 74 3d 20 49 4e 56 41 4c 49 44 5f 48  utput= INVALID_H
61f0: 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20  ANDLE_VALUE;.   
6200: 20 73 74 61 72 74 49 6e 66 6f 2e 68 53 74 64 45   startInfo.hStdE
6210: 72 72 6f 72 20 3d 20 49 4e 56 41 4c 49 44 5f 48  rror = INVALID_H
6220: 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20  ANDLE_VALUE;..  
6230: 20 20 73 65 63 41 74 74 73 2e 6e 4c 65 6e 67 74    secAtts.nLengt
6240: 68 20 3d 20 73 69 7a 65 6f 66 28 53 45 43 55 52  h = sizeof(SECUR
6250: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 29 3b  ITY_ATTRIBUTES);
6260: 0a 20 20 20 20 73 65 63 41 74 74 73 2e 6c 70 53  .    secAtts.lpS
6270: 65 63 75 72 69 74 79 44 65 73 63 72 69 70 74 6f  ecurityDescripto
6280: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 65  r = NULL;.    se
6290: 63 41 74 74 73 2e 62 49 6e 68 65 72 69 74 48 61  cAtts.bInheritHa
62a0: 6e 64 6c 65 20 3d 20 54 52 55 45 3b 0a 0a 20 20  ndle = TRUE;..  
62b0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 68    /*.     * We h
62c0: 61 76 65 20 74 6f 20 63 68 65 63 6b 20 74 68 65  ave to check the
62d0: 20 74 79 70 65 20 6f 66 20 65 61 63 68 20 66 69   type of each fi
62e0: 6c 65 2c 20 73 69 6e 63 65 20 77 65 20 63 61 6e  le, since we can
62f0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 20 73 6f  not duplicate so
6300: 6d 65 0a 20 20 20 20 20 2a 20 66 69 6c 65 20 74  me.     * file t
6310: 79 70 65 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  ypes..     */.. 
6320: 20 20 20 69 6e 70 75 74 48 61 6e 64 6c 65 20 3d     inputHandle =
6330: 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
6340: 56 41 4c 55 45 3b 0a 20 20 20 20 69 66 20 28 69  VALUE;.    if (i
6350: 6e 70 75 74 46 69 6c 65 20 21 3d 20 4e 55 4c 4c  nputFile != NULL
6360: 29 20 7b 0a 09 66 69 6c 65 50 74 72 20 3d 20 28  ) {..filePtr = (
6370: 57 69 6e 46 69 6c 65 20 2a 29 69 6e 70 75 74 46  WinFile *)inputF
6380: 69 6c 65 3b 0a 09 69 66 20 28 66 69 6c 65 50 74  ile;..if (filePt
6390: 72 2d 3e 74 79 70 65 20 3d 3d 20 57 49 4e 5f 46  r->type == WIN_F
63a0: 49 4c 45 29 20 7b 0a 09 20 20 20 20 69 6e 70 75  ILE) {..    inpu
63b0: 74 48 61 6e 64 6c 65 20 3d 20 66 69 6c 65 50 74  tHandle = filePt
63c0: 72 2d 3e 68 61 6e 64 6c 65 3b 0a 09 7d 0a 20 20  r->handle;..}.  
63d0: 20 20 7d 0a 20 20 20 20 6f 75 74 70 75 74 48 61    }.    outputHa
63e0: 6e 64 6c 65 20 3d 20 49 4e 56 41 4c 49 44 5f 48  ndle = INVALID_H
63f0: 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20  ANDLE_VALUE;.   
6400: 20 69 66 20 28 6f 75 74 70 75 74 46 69 6c 65 20   if (outputFile 
6410: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 66 69 6c 65  != NULL) {..file
6420: 50 74 72 20 3d 20 28 57 69 6e 46 69 6c 65 20 2a  Ptr = (WinFile *
6430: 29 6f 75 74 70 75 74 46 69 6c 65 3b 0a 09 69 66  )outputFile;..if
6440: 20 28 66 69 6c 65 50 74 72 2d 3e 74 79 70 65 20   (filePtr->type 
6450: 3d 3d 20 57 49 4e 5f 46 49 4c 45 29 20 7b 0a 09  == WIN_FILE) {..
6460: 20 20 20 20 6f 75 74 70 75 74 48 61 6e 64 6c 65      outputHandle
6470: 20 3d 20 66 69 6c 65 50 74 72 2d 3e 68 61 6e 64   = filePtr->hand
6480: 6c 65 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20  le;..}.    }.   
6490: 20 65 72 72 6f 72 48 61 6e 64 6c 65 20 3d 20 49   errorHandle = I
64a0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
64b0: 4c 55 45 3b 0a 20 20 20 20 69 66 20 28 65 72 72  LUE;.    if (err
64c0: 6f 72 46 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  orFile != NULL) 
64d0: 7b 0a 09 66 69 6c 65 50 74 72 20 3d 20 28 57 69  {..filePtr = (Wi
64e0: 6e 46 69 6c 65 20 2a 29 65 72 72 6f 72 46 69 6c  nFile *)errorFil
64f0: 65 3b 0a 09 69 66 20 28 66 69 6c 65 50 74 72 2d  e;..if (filePtr-
6500: 3e 74 79 70 65 20 3d 3d 20 57 49 4e 5f 46 49 4c  >type == WIN_FIL
6510: 45 29 20 7b 0a 09 20 20 20 20 65 72 72 6f 72 48  E) {..    errorH
6520: 61 6e 64 6c 65 20 3d 20 66 69 6c 65 50 74 72 2d  andle = filePtr-
6530: 3e 68 61 6e 64 6c 65 3b 0a 09 7d 0a 20 20 20 20  >handle;..}.    
6540: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
6550: 20 44 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 74   Duplicate all t
6560: 68 65 20 68 61 6e 64 6c 65 73 20 77 68 69 63 68  he handles which
6570: 20 77 69 6c 6c 20 62 65 20 70 61 73 73 65 64 20   will be passed 
6580: 6f 66 66 20 61 73 20 73 74 64 69 6e 2c 20 73 74  off as stdin, st
6590: 64 6f 75 74 20 61 6e 64 0a 20 20 20 20 20 2a 20  dout and.     * 
65a0: 73 74 64 65 72 72 20 6f 66 20 74 68 65 20 63 68  stderr of the ch
65b0: 69 6c 64 20 70 72 6f 63 65 73 73 2e 20 54 68 65  ild process. The
65c0: 20 64 75 70 6c 69 63 61 74 65 20 68 61 6e 64 6c   duplicate handl
65d0: 65 73 20 61 72 65 20 73 65 74 20 74 6f 20 62 65  es are set to be
65e0: 0a 20 20 20 20 20 2a 20 69 6e 68 65 72 69 74 61  .     * inherita
65f0: 62 6c 65 2c 20 73 6f 20 74 68 65 20 63 68 69 6c  ble, so the chil
6600: 64 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73  d process can us
6610: 65 20 74 68 65 6d 2e 0a 20 20 20 20 20 2a 2f 0a  e them..     */.
6620: 0a 20 20 20 20 69 66 20 28 69 6e 70 75 74 48 61  .    if (inputHa
6630: 6e 64 6c 65 20 3d 3d 20 49 4e 56 41 4c 49 44 5f  ndle == INVALID_
6640: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a  HANDLE_VALUE) {.
6650: 09 2f 2a 0a 09 20 2a 20 49 66 20 68 61 6e 64 6c  ./*.. * If handl
6660: 65 20 77 61 73 20 6e 6f 74 20 73 65 74 2c 20 73  e was not set, s
6670: 74 64 69 6e 20 73 68 6f 75 6c 64 20 72 65 74 75  tdin should retu
6680: 72 6e 20 69 6d 6d 65 64 69 61 74 65 20 45 4f 46  rn immediate EOF
6690: 2e 20 55 6e 64 65 72 0a 09 20 2a 20 57 69 6e 64  . Under.. * Wind
66a0: 6f 77 73 39 35 2c 20 73 6f 6d 65 20 61 70 70 6c  ows95, some appl
66b0: 69 63 61 74 69 6f 6e 73 20 28 62 6f 74 68 20 31  ications (both 1
66c0: 36 20 61 6e 64 20 33 32 20 62 69 74 21 29 20 63  6 and 32 bit!) c
66d0: 61 6e 6e 6f 74 20 72 65 61 64 20 66 72 6f 6d 0a  annot read from.
66e0: 09 20 2a 20 74 68 65 20 4e 55 4c 20 64 65 76 69  . * the NUL devi
66f0: 63 65 3b 20 74 68 65 79 20 72 65 61 64 20 66 72  ce; they read fr
6700: 6f 6d 20 63 6f 6e 73 6f 6c 65 20 69 6e 73 74 65  om console inste
6710: 61 64 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  ad. When running
6720: 20 74 6b 2c 0a 09 20 2a 20 74 68 69 73 20 69 73   tk,.. * this is
6730: 20 66 61 74 61 6c 20 62 65 63 61 75 73 65 20 74   fatal because t
6740: 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73  he child process
6750: 20 77 6f 75 6c 64 20 68 61 6e 67 20 66 6f 72 65   would hang fore
6760: 76 65 72 20 77 61 69 74 69 6e 67 0a 09 20 2a 20  ver waiting.. * 
6770: 66 6f 72 20 45 4f 46 20 66 72 6f 6d 20 74 68 65  for EOF from the
6780: 20 75 6e 6d 61 70 70 65 64 20 63 6f 6e 73 6f 6c   unmapped consol
6790: 65 20 77 69 6e 64 6f 77 20 75 73 65 64 20 62 79  e window used by
67a0: 20 74 68 65 20 68 65 6c 70 65 72 0a 09 20 2a 20   the helper.. * 
67b0: 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 09 20 2a  application... *
67c0: 0a 09 20 2a 20 46 6f 72 74 75 6e 61 74 65 6c 79  .. * Fortunately
67d0: 2c 20 74 68 65 20 68 65 6c 70 65 72 20 61 70 70  , the helper app
67e0: 6c 69 63 61 74 69 6f 6e 20 64 65 74 65 63 74 73  lication detects
67f0: 20 61 20 63 6c 6f 73 65 64 20 70 69 70 65 20 61   a closed pipe a
6800: 73 20 61 6e 0a 09 20 2a 20 69 6d 6d 65 64 69 61  s an.. * immedia
6810: 74 65 20 45 4f 46 20 61 6e 64 20 63 61 6e 20 70  te EOF and can p
6820: 61 73 73 20 74 68 61 74 20 69 6e 66 6f 72 6d 61  ass that informa
6830: 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 68 69 6c  tion to the chil
6840: 64 20 70 72 6f 63 65 73 73 2e 0a 09 20 2a 2f 0a  d process... */.
6850: 0a 09 69 66 20 28 43 72 65 61 74 65 50 69 70 65  ..if (CreatePipe
6860: 28 26 73 74 61 72 74 49 6e 66 6f 2e 68 53 74 64  (&startInfo.hStd
6870: 49 6e 70 75 74 2c 20 26 68 2c 20 26 73 65 63 41  Input, &h, &secA
6880: 74 74 73 2c 20 30 29 20 21 3d 20 46 41 4c 53 45  tts, 0) != FALSE
6890: 29 20 7b 0a 09 20 20 20 20 43 6c 6f 73 65 48 61  ) {..    CloseHa
68a0: 6e 64 6c 65 28 68 29 3b 0a 09 7d 0a 20 20 20 20  ndle(h);..}.    
68b0: 7d 20 65 6c 73 65 20 7b 0a 09 44 75 70 6c 69 63  } else {..Duplic
68c0: 61 74 65 48 61 6e 64 6c 65 28 68 50 72 6f 63 65  ateHandle(hProce
68d0: 73 73 2c 20 69 6e 70 75 74 48 61 6e 64 6c 65 2c  ss, inputHandle,
68e0: 20 68 50 72 6f 63 65 73 73 2c 20 26 73 74 61 72   hProcess, &star
68f0: 74 49 6e 66 6f 2e 68 53 74 64 49 6e 70 75 74 2c  tInfo.hStdInput,
6900: 0a 09 09 30 2c 20 54 52 55 45 2c 20 44 55 50 4c  ...0, TRUE, DUPL
6910: 49 43 41 54 45 5f 53 41 4d 45 5f 41 43 43 45 53  ICATE_SAME_ACCES
6920: 53 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  S);.    }.    if
6930: 20 28 73 74 61 72 74 49 6e 66 6f 2e 68 53 74 64   (startInfo.hStd
6940: 49 6e 70 75 74 20 3d 3d 20 49 4e 56 41 4c 49 44  Input == INVALID
6950: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b  _HANDLE_VALUE) {
6960: 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74  ..Tcl_WinConvert
6970: 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72  Error(GetLastErr
6980: 6f 72 28 29 29 3b 0a 09 54 63 6c 5f 53 65 74 4f  or());..Tcl_SetO
6990: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
69a0: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a   Tcl_ObjPrintf(.
69b0: 09 09 22 63 6f 75 6c 64 6e 27 74 20 64 75 70 6c  .."couldn't dupl
69c0: 69 63 61 74 65 20 69 6e 70 75 74 20 68 61 6e 64  icate input hand
69d0: 6c 65 3a 20 25 73 22 2c 0a 09 09 54 63 6c 5f 50  le: %s",...Tcl_P
69e0: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70  osixError(interp
69f0: 29 29 29 3b 0a 09 67 6f 74 6f 20 65 6e 64 3b 0a  )));..goto end;.
6a00: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6f      }..    if (o
6a10: 75 74 70 75 74 48 61 6e 64 6c 65 20 3d 3d 20 49  utputHandle == I
6a20: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
6a30: 4c 55 45 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49  LUE) {../*.. * I
6a40: 66 20 68 61 6e 64 6c 65 20 77 61 73 20 6e 6f 74  f handle was not
6a50: 20 73 65 74 2c 20 6f 75 74 70 75 74 20 73 68 6f   set, output sho
6a60: 75 6c 64 20 62 65 20 73 65 6e 74 20 74 6f 20 61  uld be sent to a
6a70: 6e 20 69 6e 66 69 6e 69 74 65 6c 79 20 64 65 65  n infinitely dee
6a80: 70 0a 09 20 2a 20 73 69 6e 6b 2e 20 55 6e 64 65  p.. * sink. Unde
6a90: 72 20 57 69 6e 64 6f 77 73 20 39 35 2c 20 73 6f  r Windows 95, so
6aa0: 6d 65 20 31 36 20 62 69 74 20 61 70 70 6c 69 63  me 16 bit applic
6ab0: 61 74 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 68 61  ations cannot ha
6ac0: 76 65 20 73 74 64 6f 75 74 0a 09 20 2a 20 72 65  ve stdout.. * re
6ad0: 64 69 72 65 63 74 65 64 20 74 6f 20 4e 55 4c 3b  directed to NUL;
6ae0: 20 74 68 65 79 20 73 65 6e 64 20 74 68 65 69 72   they send their
6af0: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 63   output to the c
6b00: 6f 6e 73 6f 6c 65 20 69 6e 73 74 65 61 64 2e 0a  onsole instead..
6b10: 09 20 2a 20 53 6f 6d 65 20 61 70 70 6c 69 63 61  . * Some applica
6b20: 74 69 6f 6e 73 2c 20 6c 69 6b 65 20 22 6d 6f 72  tions, like "mor
6b30: 65 22 20 6f 72 20 22 64 69 72 20 2f 70 22 2c 20  e" or "dir /p", 
6b40: 77 68 65 6e 20 6f 75 74 70 75 74 74 69 6e 67 0a  when outputting.
6b50: 09 20 2a 20 6d 75 6c 74 69 70 6c 65 20 70 61 67  . * multiple pag
6b60: 65 73 20 74 6f 20 74 68 65 20 63 6f 6e 73 6f 6c  es to the consol
6b70: 65 2c 20 61 6c 73 6f 20 74 68 65 6e 20 74 72 79  e, also then try
6b80: 20 61 6e 64 20 72 65 61 64 20 66 72 6f 6d 20 74   and read from t
6b90: 68 65 0a 09 20 2a 20 63 6f 6e 73 6f 6c 65 20 74  he.. * console t
6ba0: 6f 20 67 6f 20 74 68 65 20 6e 65 78 74 20 70 61  o go the next pa
6bb0: 67 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  ge. When running
6bc0: 20 74 6b 2c 20 74 68 69 73 20 69 73 20 66 61 74   tk, this is fat
6bd0: 61 6c 20 62 65 63 61 75 73 65 0a 09 20 2a 20 74  al because.. * t
6be0: 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73  he child process
6bf0: 20 77 6f 75 6c 64 20 68 61 6e 67 20 66 6f 72 65   would hang fore
6c00: 76 65 72 20 77 61 69 74 69 6e 67 20 66 6f 72 20  ver waiting for 
6c10: 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 0a 09  input from the..
6c20: 20 2a 20 75 6e 6d 61 70 70 65 64 20 63 6f 6e 73   * unmapped cons
6c30: 6f 6c 65 20 77 69 6e 64 6f 77 20 75 73 65 64 20  ole window used 
6c40: 62 79 20 74 68 65 20 68 65 6c 70 65 72 20 61 70  by the helper ap
6c50: 70 6c 69 63 61 74 69 6f 6e 2e 0a 09 20 2a 0a 09  plication... *..
6c60: 20 2a 20 46 6f 72 74 75 6e 61 74 65 6c 79 2c 20   * Fortunately, 
6c70: 74 68 65 20 68 65 6c 70 65 72 20 61 70 70 6c 69  the helper appli
6c80: 63 61 74 69 6f 6e 20 77 69 6c 6c 20 64 65 74 65  cation will dete
6c90: 63 74 20 61 20 63 6c 6f 73 65 64 20 70 69 70 65  ct a closed pipe
6ca0: 20 61 73 20 61 0a 09 20 2a 20 73 69 6e 6b 2e 0a   as a.. * sink..
6cb0: 09 20 2a 2f 0a 0a 09 73 74 61 72 74 49 6e 66 6f  . */...startInfo
6cc0: 2e 68 53 74 64 4f 75 74 70 75 74 20 3d 20 43 72  .hStdOutput = Cr
6cd0: 65 61 74 65 46 69 6c 65 57 28 4c 22 4e 55 4c 3a  eateFileW(L"NUL:
6ce0: 22 2c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45  ", GENERIC_WRITE
6cf0: 2c 20 30 2c 0a 09 09 26 73 65 63 41 74 74 73 2c  , 0,...&secAtts,
6d00: 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 20 46 49   OPEN_ALWAYS, FI
6d10: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
6d20: 4d 41 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  MAL, NULL);.    
6d30: 7d 20 65 6c 73 65 20 7b 0a 09 44 75 70 6c 69 63  } else {..Duplic
6d40: 61 74 65 48 61 6e 64 6c 65 28 68 50 72 6f 63 65  ateHandle(hProce
6d50: 73 73 2c 20 6f 75 74 70 75 74 48 61 6e 64 6c 65  ss, outputHandle
6d60: 2c 20 68 50 72 6f 63 65 73 73 2c 0a 09 09 26 73  , hProcess,...&s
6d70: 74 61 72 74 49 6e 66 6f 2e 68 53 74 64 4f 75 74  tartInfo.hStdOut
6d80: 70 75 74 2c 20 30 2c 20 54 52 55 45 2c 20 44 55  put, 0, TRUE, DU
6d90: 50 4c 49 43 41 54 45 5f 53 41 4d 45 5f 41 43 43  PLICATE_SAME_ACC
6da0: 45 53 53 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ESS);.    }.    
6db0: 69 66 20 28 73 74 61 72 74 49 6e 66 6f 2e 68 53  if (startInfo.hS
6dc0: 74 64 4f 75 74 70 75 74 20 3d 3d 20 49 4e 56 41  tdOutput == INVA
6dd0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
6de0: 29 20 7b 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76  ) {..Tcl_WinConv
6df0: 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74  ertError(GetLast
6e00: 45 72 72 6f 72 28 29 29 3b 0a 09 54 63 6c 5f 53  Error());..Tcl_S
6e10: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
6e20: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74  rp, Tcl_ObjPrint
6e30: 66 28 0a 09 09 22 63 6f 75 6c 64 6e 27 74 20 64  f(..."couldn't d
6e40: 75 70 6c 69 63 61 74 65 20 6f 75 74 70 75 74 20  uplicate output 
6e50: 68 61 6e 64 6c 65 3a 20 25 73 22 2c 0a 09 09 54  handle: %s",...T
6e60: 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  cl_PosixError(in
6e70: 74 65 72 70 29 29 29 3b 0a 09 67 6f 74 6f 20 65  terp)));..goto e
6e80: 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  nd;.    }..    i
6e90: 66 20 28 65 72 72 6f 72 48 61 6e 64 6c 65 20 3d  f (errorHandle =
6ea0: 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
6eb0: 5f 56 41 4c 55 45 29 20 7b 0a 09 2f 2a 0a 09 20  _VALUE) {../*.. 
6ec0: 2a 20 49 66 20 68 61 6e 64 6c 65 20 77 61 73 20  * If handle was 
6ed0: 6e 6f 74 20 73 65 74 2c 20 65 72 72 6f 72 73 20  not set, errors 
6ee0: 73 68 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 74  should be sent t
6ef0: 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65 6c 79 20  o an infinitely 
6f00: 64 65 65 70 0a 09 20 2a 20 73 69 6e 6b 2e 0a 09  deep.. * sink...
6f10: 20 2a 2f 0a 0a 09 73 74 61 72 74 49 6e 66 6f 2e   */...startInfo.
6f20: 68 53 74 64 45 72 72 6f 72 20 3d 20 43 72 65 61  hStdError = Crea
6f30: 74 65 46 69 6c 65 57 28 4c 22 4e 55 4c 3a 22 2c  teFileW(L"NUL:",
6f40: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 20   GENERIC_WRITE, 
6f50: 30 2c 0a 09 09 26 73 65 63 41 74 74 73 2c 20 4f  0,...&secAtts, O
6f60: 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c 20 46 49  PEN_EXISTING, FI
6f70: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
6f80: 4d 41 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  MAL, NULL);.    
6f90: 7d 20 65 6c 73 65 20 7b 0a 09 44 75 70 6c 69 63  } else {..Duplic
6fa0: 61 74 65 48 61 6e 64 6c 65 28 68 50 72 6f 63 65  ateHandle(hProce
6fb0: 73 73 2c 20 65 72 72 6f 72 48 61 6e 64 6c 65 2c  ss, errorHandle,
6fc0: 20 68 50 72 6f 63 65 73 73 2c 20 26 73 74 61 72   hProcess, &star
6fd0: 74 49 6e 66 6f 2e 68 53 74 64 45 72 72 6f 72 2c  tInfo.hStdError,
6fe0: 0a 09 09 30 2c 20 54 52 55 45 2c 20 44 55 50 4c  ...0, TRUE, DUPL
6ff0: 49 43 41 54 45 5f 53 41 4d 45 5f 41 43 43 45 53  ICATE_SAME_ACCES
7000: 53 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  S);.    }.    if
7010: 20 28 73 74 61 72 74 49 6e 66 6f 2e 68 53 74 64   (startInfo.hStd
7020: 45 72 72 6f 72 20 3d 3d 20 49 4e 56 41 4c 49 44  Error == INVALID
7030: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b  _HANDLE_VALUE) {
7040: 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74  ..Tcl_WinConvert
7050: 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45 72 72  Error(GetLastErr
7060: 6f 72 28 29 29 3b 0a 09 54 63 6c 5f 53 65 74 4f  or());..Tcl_SetO
7070: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
7080: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a   Tcl_ObjPrintf(.
7090: 09 09 22 63 6f 75 6c 64 6e 27 74 20 64 75 70 6c  .."couldn't dupl
70a0: 69 63 61 74 65 20 65 72 72 6f 72 20 68 61 6e 64  icate error hand
70b0: 6c 65 3a 20 25 73 22 2c 0a 09 09 54 63 6c 5f 50  le: %s",...Tcl_P
70c0: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70  osixError(interp
70d0: 29 29 29 3b 0a 09 67 6f 74 6f 20 65 6e 64 3b 0a  )));..goto end;.
70e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
70f0: 20 20 20 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f     * If we do no
7100: 74 20 68 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65  t have a console
7110: 20 77 69 6e 64 6f 77 2c 20 74 68 65 6e 20 77 65   window, then we
7120: 20 6d 75 73 74 20 72 75 6e 20 44 4f 53 20 61 6e   must run DOS an
7130: 64 20 57 49 4e 33 32 0a 20 20 20 20 20 2a 20 63  d WIN32.     * c
7140: 6f 6e 73 6f 6c 65 20 6d 6f 64 65 20 61 70 70 6c  onsole mode appl
7150: 69 63 61 74 69 6f 6e 73 20 61 73 20 64 65 74 61  ications as deta
7160: 63 68 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20  ched processes. 
7170: 54 68 69 73 20 74 65 6c 6c 73 20 74 68 65 20 6c  This tells the l
7180: 6f 61 64 65 72 0a 20 20 20 20 20 2a 20 74 68 61  oader.     * tha
7190: 74 20 74 68 65 20 63 68 69 6c 64 20 61 70 70 6c  t the child appl
71a0: 69 63 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e  ication should n
71b0: 6f 74 20 69 6e 68 65 72 69 74 20 74 68 65 20 63  ot inherit the c
71c0: 6f 6e 73 6f 6c 65 2c 20 61 6e 64 20 74 68 61 74  onsole, and that
71d0: 20 69 74 0a 20 20 20 20 20 2a 20 73 68 6f 75 6c   it.     * shoul
71e0: 64 20 6e 6f 74 20 63 72 65 61 74 65 20 61 20 6e  d not create a n
71f0: 65 77 20 63 6f 6e 73 6f 6c 65 20 77 69 6e 64 6f  ew console windo
7200: 77 20 66 6f 72 20 74 68 65 20 63 68 69 6c 64 20  w for the child 
7210: 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 54 68 65  application. The
7220: 0a 20 20 20 20 20 2a 20 63 68 69 6c 64 20 61 70  .     * child ap
7230: 70 6c 69 63 61 74 69 6f 6e 20 73 68 6f 75 6c 64  plication should
7240: 20 67 65 74 20 69 74 73 20 73 74 64 69 6f 20 66   get its stdio f
7250: 72 6f 6d 20 74 68 65 20 72 65 64 69 72 65 63 74  rom the redirect
7260: 69 6f 6e 20 68 61 6e 64 6c 65 73 0a 20 20 20 20  ion handles.    
7270: 20 2a 20 70 72 6f 76 69 64 65 64 20 62 79 20 74   * provided by t
7280: 68 69 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 2c  his application,
7290: 20 61 6e 64 20 72 75 6e 20 69 6e 20 74 68 65 20   and run in the 
72a0: 62 61 63 6b 67 72 6f 75 6e 64 2e 0a 20 20 20 20  background..    
72b0: 20 2a 0a 20 20 20 20 20 2a 20 49 66 20 77 65 20   *.     * If we 
72c0: 61 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 47  are starting a G
72d0: 55 49 20 70 72 6f 63 65 73 73 2c 20 74 68 65 79  UI process, they
72e0: 20 64 6f 6e 27 74 20 61 75 74 6f 6d 61 74 69 63   don't automatic
72f0: 61 6c 6c 79 20 67 65 74 20 61 0a 20 20 20 20 20  ally get a.     
7300: 2a 20 63 6f 6e 73 6f 6c 65 2c 20 73 6f 20 69 74  * console, so it
7310: 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
7320: 69 66 20 74 68 65 79 20 61 72 65 20 73 74 61 72  if they are star
7330: 74 65 64 20 61 73 20 66 6f 72 65 67 72 6f 75 6e  ted as foregroun
7340: 64 20 6f 72 0a 20 20 20 20 20 2a 20 64 65 74 61  d or.     * deta
7350: 63 68 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20  ched processes. 
7360: 54 68 65 20 47 55 49 20 77 69 6e 64 6f 77 20 77  The GUI window w
7370: 69 6c 6c 20 73 74 69 6c 6c 20 70 6f 70 20 75 70  ill still pop up
7380: 20 74 6f 20 74 68 65 20 66 6f 72 65 67 72 6f 75   to the foregrou
7390: 6e 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  nd..     */..   
73a0: 20 69 66 20 28 48 61 73 43 6f 6e 73 6f 6c 65 28   if (HasConsole(
73b0: 29 29 20 7b 0a 09 63 72 65 61 74 65 46 6c 61 67  )) {..createFlag
73c0: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73  s = 0;.    } els
73d0: 65 20 69 66 20 28 61 70 70 6c 54 79 70 65 20 3d  e if (applType =
73e0: 3d 20 41 50 50 4c 5f 44 4f 53 29 20 7b 0a 09 2f  = APPL_DOS) {../
73f0: 2a 0a 09 20 2a 20 55 6e 64 65 72 20 4e 54 2c 20  *.. * Under NT, 
7400: 31 36 2d 62 69 74 20 44 4f 53 20 61 70 70 6c 69  16-bit DOS appli
7410: 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20 6e 6f 74  cations will not
7420: 20 72 75 6e 20 75 6e 6c 65 73 73 20 74 68 65 79   run unless they
7430: 20 63 61 6e 0a 09 20 2a 20 62 65 20 61 74 74 61   can.. * be atta
7440: 63 68 65 64 20 74 6f 20 61 20 63 6f 6e 73 6f 6c  ched to a consol
7450: 65 2e 20 49 66 20 77 65 20 61 72 65 20 72 75 6e  e. If we are run
7460: 6e 69 6e 67 20 77 69 74 68 6f 75 74 20 61 20 63  ning without a c
7470: 6f 6e 73 6f 6c 65 2c 0a 09 20 2a 20 72 75 6e 20  onsole,.. * run 
7480: 74 68 65 20 31 36 2d 62 69 74 20 70 72 6f 67 72  the 16-bit progr
7490: 61 6d 20 61 73 20 61 6e 20 6e 6f 72 6d 61 6c 20  am as an normal 
74a0: 70 72 6f 63 65 73 73 20 69 6e 73 69 64 65 20 6f  process inside o
74b0: 66 20 61 20 68 69 64 64 65 6e 0a 09 20 2a 20 63  f a hidden.. * c
74c0: 6f 6e 73 6f 6c 65 20 61 70 70 6c 69 63 61 74 69  onsole applicati
74d0: 6f 6e 2c 20 61 6e 64 20 74 68 65 6e 20 72 75 6e  on, and then run
74e0: 20 74 68 61 74 20 68 69 64 64 65 6e 20 63 6f 6e   that hidden con
74f0: 73 6f 6c 65 20 61 73 20 61 0a 09 20 2a 20 64 65  sole as a.. * de
7500: 74 61 63 68 65 64 20 70 72 6f 63 65 73 73 2e 0a  tached process..
7510: 09 20 2a 2f 0a 0a 09 73 74 61 72 74 49 6e 66 6f  . */...startInfo
7520: 2e 77 53 68 6f 77 57 69 6e 64 6f 77 20 3d 20 53  .wShowWindow = S
7530: 57 5f 48 49 44 45 3b 0a 09 73 74 61 72 74 49 6e  W_HIDE;..startIn
7540: 66 6f 2e 64 77 46 6c 61 67 73 20 7c 3d 20 53 54  fo.dwFlags |= ST
7550: 41 52 54 46 5f 55 53 45 53 48 4f 57 57 49 4e 44  ARTF_USESHOWWIND
7560: 4f 57 3b 0a 09 63 72 65 61 74 65 46 6c 61 67 73  OW;..createFlags
7570: 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 5f 43 4f   = CREATE_NEW_CO
7580: 4e 53 4f 4c 45 3b 0a 09 54 63 6c 44 53 74 72 69  NSOLE;..TclDStri
7590: 6e 67 41 70 70 65 6e 64 4c 69 74 65 72 61 6c 28  ngAppendLiteral(
75a0: 26 63 6d 64 4c 69 6e 65 2c 20 22 63 6d 64 2e 65  &cmdLine, "cmd.e
75b0: 78 65 20 2f 63 22 29 3b 0a 20 20 20 20 7d 20 65  xe /c");.    } e
75c0: 6c 73 65 20 7b 0a 09 63 72 65 61 74 65 46 6c 61  lse {..createFla
75d0: 67 73 20 3d 20 44 45 54 41 43 48 45 44 5f 50 52  gs = DETACHED_PR
75e0: 4f 43 45 53 53 3b 0a 20 20 20 20 7d 0a 0a 20 20  OCESS;.    }..  
75f0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 63 6d 64 4c    /*.     * cmdL
7600: 69 6e 65 20 67 65 74 73 20 74 68 65 20 66 75 6c  ine gets the ful
7610: 6c 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 75  l command line u
7620: 73 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  sed to invoke th
7630: 65 20 65 78 65 63 75 74 61 62 6c 65 2c 0a 20 20  e executable,.  
7640: 20 20 20 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74     * including t
7650: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 65  he name of the e
7660: 78 65 63 75 74 61 62 6c 65 20 69 74 73 65 6c 66  xecutable itself
7670: 2e 20 54 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  . The command li
7680: 6e 65 20 61 72 67 75 6d 65 6e 74 73 0a 20 20 20  ne arguments.   
7690: 20 20 2a 20 69 6e 20 61 72 67 76 5b 5d 20 61 72    * in argv[] ar
76a0: 65 20 73 74 6f 72 65 64 20 69 6e 20 63 6d 64 4c  e stored in cmdL
76b0: 69 6e 65 20 73 65 70 61 72 61 74 65 64 20 62 79  ine separated by
76c0: 20 73 70 61 63 65 73 2e 20 53 70 65 63 69 61 6c   spaces. Special
76d0: 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20   characters.    
76e0: 20 2a 20 69 6e 20 69 6e 64 69 76 69 64 75 61 6c   * in individual
76f0: 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20   arguments from 
7700: 61 72 67 76 5b 5d 20 6d 75 73 74 20 62 65 20 71  argv[] must be q
7710: 75 6f 74 65 64 20 77 68 65 6e 20 62 65 69 6e 67  uoted when being
7720: 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20 20   stored in.     
7730: 2a 20 63 6d 64 4c 69 6e 65 2e 0a 20 20 20 20 20  * cmdLine..     
7740: 2a 0a 20 20 20 20 20 2a 20 57 68 65 6e 20 63 61  *.     * When ca
7750: 6c 6c 69 6e 67 20 61 6e 79 20 61 70 70 6c 69 63  lling any applic
7760: 61 74 69 6f 6e 2c 20 62 65 61 72 20 69 6e 20 6d  ation, bear in m
7770: 69 6e 64 20 74 68 61 74 20 61 72 67 75 6d 65 6e  ind that argumen
7780: 74 73 20 74 68 61 74 20 73 70 65 63 69 66 79 0a  ts that specify.
7790: 20 20 20 20 20 2a 20 61 20 70 61 74 68 20 6e 61       * a path na
77a0: 6d 65 20 61 72 65 20 6e 6f 74 20 63 6f 6e 76 65  me are not conve
77b0: 72 74 65 64 2e 20 49 66 20 61 6e 20 61 72 67 75  rted. If an argu
77c0: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 66 6f  ment contains fo
77d0: 72 77 61 72 64 20 73 6c 61 73 68 65 73 0a 20 20  rward slashes.  
77e0: 20 20 20 2a 20 61 73 20 70 61 74 68 20 73 65 70     * as path sep
77f0: 61 72 61 74 6f 72 73 2c 20 69 74 20 6d 61 79 20  arators, it may 
7800: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 72 65  or may not be re
7810: 63 6f 67 6e 69 7a 65 64 20 61 73 20 61 20 70 61  cognized as a pa
7820: 74 68 20 6e 61 6d 65 2c 0a 20 20 20 20 20 2a 20  th name,.     * 
7830: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
7840: 20 70 72 6f 67 72 61 6d 2e 20 49 6e 20 67 65 6e   program. In gen
7850: 65 72 61 6c 2c 20 6d 6f 73 74 20 61 70 70 6c 69  eral, most appli
7860: 63 61 74 69 6f 6e 73 20 61 63 63 65 70 74 20 66  cations accept f
7870: 6f 72 77 61 72 64 0a 20 20 20 20 20 2a 20 73 6c  orward.     * sl
7880: 61 73 68 65 73 20 6f 6e 6c 79 20 61 73 20 6f 70  ashes only as op
7890: 74 69 6f 6e 20 64 65 6c 69 6d 69 74 65 72 73 20  tion delimiters 
78a0: 61 6e 64 20 62 61 63 6b 73 6c 61 73 68 65 73 20  and backslashes 
78b0: 6f 6e 6c 79 20 61 73 20 70 61 74 68 73 2e 0a 20  only as paths.. 
78c0: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 64 64      *.     * Add
78d0: 69 74 69 6f 6e 61 6c 6c 79 2c 20 77 68 65 6e 20  itionally, when 
78e0: 63 61 6c 6c 69 6e 67 20 61 20 31 36 2d 62 69 74  calling a 16-bit
78f0: 20 64 6f 73 20 6f 72 20 77 69 6e 64 6f 77 73 20   dos or windows 
7900: 61 70 70 6c 69 63 61 74 69 6f 6e 2c 20 61 6c 6c  application, all
7910: 0a 20 20 20 20 20 2a 20 70 61 74 68 20 6e 61 6d  .     * path nam
7920: 65 73 20 6d 75 73 74 20 75 73 65 20 74 68 65 20  es must use the 
7930: 73 68 6f 72 74 2c 20 63 72 79 70 74 69 63 2c 20  short, cryptic, 
7940: 70 61 74 68 20 66 6f 72 6d 61 74 20 28 65 2e 67  path format (e.g
7950: 2e 2c 20 75 73 69 6e 67 0a 20 20 20 20 20 2a 20  ., using.     * 
7960: 61 62 7e 31 2e 64 65 66 20 69 6e 73 74 65 61 64  ab~1.def instead
7970: 20 6f 66 20 22 61 20 62 2e 64 65 66 61 75 6c 74   of "a b.default
7980: 22 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ")..     */..   
7990: 20 42 75 69 6c 64 43 6f 6d 6d 61 6e 64 4c 69 6e   BuildCommandLin
79a0: 65 28 65 78 65 63 50 61 74 68 2c 20 61 72 67 63  e(execPath, argc
79b0: 2c 20 61 72 67 76 2c 20 26 63 6d 64 4c 69 6e 65  , argv, &cmdLine
79c0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 43 72 65 61  );..    if (Crea
79d0: 74 65 50 72 6f 63 65 73 73 57 28 4e 55 4c 4c 2c  teProcessW(NULL,
79e0: 20 28 57 43 48 41 52 20 2a 29 20 54 63 6c 5f 44   (WCHAR *) Tcl_D
79f0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 63 6d 64  StringValue(&cmd
7a00: 4c 69 6e 65 29 2c 0a 09 20 20 20 20 4e 55 4c 4c  Line),..    NULL
7a10: 2c 20 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 28 44  , NULL, TRUE, (D
7a20: 57 4f 52 44 29 20 63 72 65 61 74 65 46 6c 61 67  WORD) createFlag
7a30: 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26  s, NULL, NULL, &
7a40: 73 74 61 72 74 49 6e 66 6f 2c 0a 09 20 20 20 20  startInfo,..    
7a50: 26 70 72 6f 63 49 6e 66 6f 29 20 3d 3d 20 30 29  &procInfo) == 0)
7a60: 20 7b 0a 09 54 63 6c 5f 57 69 6e 43 6f 6e 76 65   {..Tcl_WinConve
7a70: 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74 45  rtError(GetLastE
7a80: 72 72 6f 72 28 29 29 3b 0a 09 54 63 6c 5f 53 65  rror());..Tcl_Se
7a90: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
7aa0: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66  p, Tcl_ObjPrintf
7ab0: 28 22 63 6f 75 6c 64 6e 27 74 20 65 78 65 63 75  ("couldn't execu
7ac0: 74 65 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c 0a  te \"%s\": %s",.
7ad0: 09 09 61 72 67 76 5b 30 5d 2c 20 54 63 6c 5f 50  ..argv[0], Tcl_P
7ae0: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70  osixError(interp
7af0: 29 29 29 3b 0a 09 67 6f 74 6f 20 65 6e 64 3b 0a  )));..goto end;.
7b00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
7b10: 20 20 20 2a 20 54 68 69 73 20 77 61 69 74 20 69     * This wait i
7b20: 73 20 75 73 65 64 20 74 6f 20 66 6f 72 63 65 20  s used to force 
7b30: 74 68 65 20 4f 53 20 74 6f 20 67 69 76 65 20 73  the OS to give s
7b40: 6f 6d 65 20 74 69 6d 65 20 74 6f 20 74 68 65 20  ome time to the 
7b50: 44 4f 53 20 70 72 6f 63 65 73 73 2e 0a 20 20 20  DOS process..   
7b60: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 61 70    */..    if (ap
7b70: 70 6c 54 79 70 65 20 3d 3d 20 41 50 50 4c 5f 44  plType == APPL_D
7b80: 4f 53 29 20 7b 0a 09 57 61 69 74 46 6f 72 53 69  OS) {..WaitForSi
7b90: 6e 67 6c 65 4f 62 6a 65 63 74 28 70 72 6f 63 49  ngleObject(procI
7ba0: 6e 66 6f 2e 68 50 72 6f 63 65 73 73 2c 20 35 30  nfo.hProcess, 50
7bb0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
7bc0: 0a 20 20 20 20 20 2a 20 22 57 68 65 6e 20 61 6e  .     * "When an
7bd0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 73 70 61   application spa
7be0: 77 6e 73 20 61 20 70 72 6f 63 65 73 73 20 72 65  wns a process re
7bf0: 70 65 61 74 65 64 6c 79 2c 20 61 20 6e 65 77 20  peatedly, a new 
7c00: 74 68 72 65 61 64 20 69 6e 73 74 61 6e 63 65 0a  thread instance.
7c10: 20 20 20 20 20 2a 20 77 69 6c 6c 20 62 65 20 63       * will be c
7c20: 72 65 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  reated for each 
7c30: 70 72 6f 63 65 73 73 20 62 75 74 20 74 68 65 20  process but the 
7c40: 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63  previous instanc
7c50: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 0a 20 20  es may not be.  
7c60: 20 20 20 2a 20 63 6c 65 61 6e 65 64 20 75 70 2e     * cleaned up.
7c70: 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
7c80: 20 61 20 73 69 67 6e 69 66 69 63 61 6e 74 20 76   a significant v
7c90: 69 72 74 75 61 6c 20 6d 65 6d 6f 72 79 20 6c 6f  irtual memory lo
7ca0: 73 73 20 65 61 63 68 20 74 69 6d 65 0a 20 20 20  ss each time.   
7cb0: 20 20 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20    * the process 
7cc0: 69 73 20 73 70 61 77 6e 65 64 2e 20 49 66 20 74  is spawned. If t
7cd0: 68 65 72 65 20 69 73 20 61 20 57 61 69 74 46 6f  here is a WaitFo
7ce0: 72 49 6e 70 75 74 49 64 6c 65 28 29 20 63 61 6c  rInputIdle() cal
7cf0: 6c 20 62 65 74 77 65 65 6e 0a 20 20 20 20 20 2a  l between.     *
7d00: 20 43 72 65 61 74 65 50 72 6f 63 65 73 73 57 28   CreateProcessW(
7d10: 29 20 61 6e 64 20 43 6c 6f 73 65 48 61 6e 64 6c  ) and CloseHandl
7d20: 65 28 29 2c 20 74 68 65 20 70 72 6f 62 6c 65 6d  e(), the problem
7d30: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 2e   does not occur.
7d40: 22 20 50 53 53 20 49 44 0a 20 20 20 20 20 2a 20  " PSS ID.     * 
7d50: 4e 75 6d 62 65 72 3a 20 51 31 32 34 31 32 31 0a  Number: Q124121.
7d60: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 57 61 69       */..    Wai
7d70: 74 46 6f 72 49 6e 70 75 74 49 64 6c 65 28 70 72  tForInputIdle(pr
7d80: 6f 63 49 6e 66 6f 2e 68 50 72 6f 63 65 73 73 2c  ocInfo.hProcess,
7d90: 20 35 30 30 30 29 3b 0a 20 20 20 20 43 6c 6f 73   5000);.    Clos
7da0: 65 48 61 6e 64 6c 65 28 70 72 6f 63 49 6e 66 6f  eHandle(procInfo
7db0: 2e 68 54 68 72 65 61 64 29 3b 0a 0a 20 20 20 20  .hThread);..    
7dc0: 2a 70 69 64 50 74 72 20 3d 20 28 54 63 6c 5f 50  *pidPtr = (Tcl_P
7dd0: 69 64 29 49 4e 54 32 50 54 52 28 70 72 6f 63 49  id)INT2PTR(procI
7de0: 6e 66 6f 2e 64 77 50 72 6f 63 65 73 73 49 64 29  nfo.dwProcessId)
7df0: 3b 0a 20 20 20 20 69 66 20 28 2a 70 69 64 50 74  ;.    if (*pidPt
7e00: 72 20 21 3d 20 30 29 20 7b 0a 09 54 63 6c 57 69  r != 0) {..TclWi
7e10: 6e 41 64 64 50 72 6f 63 65 73 73 28 70 72 6f 63  nAddProcess(proc
7e20: 49 6e 66 6f 2e 68 50 72 6f 63 65 73 73 2c 20 70  Info.hProcess, p
7e30: 72 6f 63 49 6e 66 6f 2e 64 77 50 72 6f 63 65 73  rocInfo.dwProces
7e40: 73 49 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sId);.    }.    
7e50: 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b 3b  result = TCL_OK;
7e60: 0a 0a 20 20 65 6e 64 3a 0a 20 20 20 20 54 63 6c  ..  end:.    Tcl
7e70: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 63 6d  _DStringFree(&cm
7e80: 64 4c 69 6e 65 29 3b 0a 20 20 20 20 69 66 20 28  dLine);.    if (
7e90: 73 74 61 72 74 49 6e 66 6f 2e 68 53 74 64 49 6e  startInfo.hStdIn
7ea0: 70 75 74 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48  put != INVALID_H
7eb0: 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a 09  ANDLE_VALUE) {..
7ec0: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 74 61 72  CloseHandle(star
7ed0: 74 49 6e 66 6f 2e 68 53 74 64 49 6e 70 75 74 29  tInfo.hStdInput)
7ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
7ef0: 73 74 61 72 74 49 6e 66 6f 2e 68 53 74 64 4f 75  startInfo.hStdOu
7f00: 74 70 75 74 20 21 3d 20 49 4e 56 41 4c 49 44 5f  tput != INVALID_
7f10: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a  HANDLE_VALUE) {.
7f20: 09 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 74 61  .CloseHandle(sta
7f30: 72 74 49 6e 66 6f 2e 68 53 74 64 4f 75 74 70 75  rtInfo.hStdOutpu
7f40: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
7f50: 20 28 73 74 61 72 74 49 6e 66 6f 2e 68 53 74 64   (startInfo.hStd
7f60: 45 72 72 6f 72 20 21 3d 20 49 4e 56 41 4c 49 44  Error != INVALID
7f70: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b  _HANDLE_VALUE) {
7f80: 0a 09 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 74  ..CloseHandle(st
7f90: 61 72 74 49 6e 66 6f 2e 68 53 74 64 45 72 72 6f  artInfo.hStdErro
7fa0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  r);.    }.    re
7fb0: 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c  turn result;.}..
7fc0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
8010: 20 2a 20 48 61 73 43 6f 6e 73 6f 6c 65 20 2d 2d   * HasConsole --
8020: 0a 20 2a 0a 20 2a 09 44 65 74 65 72 6d 69 6e 65  . *. *.Determine
8030: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 63 75  s whether the cu
8040: 72 72 65 6e 74 20 61 70 70 6c 69 63 61 74 69 6f  rrent applicatio
8050: 6e 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  n is attached to
8060: 20 61 20 63 6f 6e 73 6f 6c 65 2e 0a 20 2a 0a 20   a console.. *. 
8070: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65  * Results:. *.Re
8080: 74 75 72 6e 73 20 54 52 55 45 20 69 66 20 74 68  turns TRUE if th
8090: 69 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68  is application h
80a0: 61 73 20 61 20 63 6f 6e 73 6f 6c 65 2c 20 65 6c  as a console, el
80b0: 73 65 20 46 41 4c 53 45 2e 0a 20 2a 0a 20 2a 20  se FALSE.. *. * 
80c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
80d0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8120: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 42  --. */..static B
8130: 4f 4f 4c 0a 48 61 73 43 6f 6e 73 6f 6c 65 28 76  OOL.HasConsole(v
8140: 6f 69 64 29 0a 7b 0a 20 20 20 20 48 41 4e 44 4c  oid).{.    HANDL
8150: 45 20 68 61 6e 64 6c 65 3b 0a 0a 20 20 20 20 68  E handle;..    h
8160: 61 6e 64 6c 65 20 3d 20 43 72 65 61 74 65 46 69  andle = CreateFi
8170: 6c 65 57 28 4c 22 43 4f 4e 4f 55 54 24 22 2c 20  leW(L"CONOUT$", 
8180: 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 20 46  GENERIC_WRITE, F
8190: 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c  ILE_SHARE_WRITE,
81a0: 0a 09 20 20 20 20 4e 55 4c 4c 2c 20 4f 50 45 4e  ..    NULL, OPEN
81b0: 5f 45 58 49 53 54 49 4e 47 2c 20 46 49 4c 45 5f  _EXISTING, FILE_
81c0: 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
81d0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66  , NULL);..    if
81e0: 20 28 68 61 6e 64 6c 65 20 21 3d 20 49 4e 56 41   (handle != INVA
81f0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
8200: 29 20 7b 0a 09 43 6c 6f 73 65 48 61 6e 64 6c 65  ) {..CloseHandle
8210: 28 68 61 6e 64 6c 65 29 3b 0a 09 72 65 74 75 72  (handle);..retur
8220: 6e 20 54 52 55 45 3b 0a 20 20 20 20 7d 20 65 6c  n TRUE;.    } el
8230: 73 65 20 7b 0a 09 72 65 74 75 72 6e 20 46 41 4c  se {..return FAL
8240: 53 45 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a  SE;.    }.}.../*
8250: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8290: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 70  -------. *. * Ap
82a0: 70 6c 69 63 61 74 69 6f 6e 54 79 70 65 20 2d 2d  plicationType --
82b0: 0a 20 2a 0a 20 2a 09 53 65 61 72 63 68 20 66 6f  . *. *.Search fo
82c0: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
82d0: 70 72 6f 67 72 61 6d 20 61 6e 64 20 69 64 65 6e  program and iden
82e0: 74 69 66 79 20 69 66 20 69 74 20 72 65 66 65 72  tify if it refer
82f0: 73 20 74 6f 20 61 20 44 4f 53 2c 0a 20 2a 09 57  s to a DOS,. *.W
8300: 69 6e 64 6f 77 73 20 33 2e 58 2c 20 6f 72 20 57  indows 3.X, or W
8310: 69 6e 33 32 20 70 72 6f 67 72 61 6d 2e 09 55 73  in32 program..Us
8320: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
8330: 68 6f 77 20 74 6f 20 69 6e 76 6f 6b 65 20 61 0a  how to invoke a.
8340: 20 2a 09 70 72 6f 67 72 61 6d 2c 20 6f 72 20 69   *.program, or i
8350: 66 20 69 74 20 63 61 6e 20 65 76 65 6e 20 62 65  f it can even be
8360: 20 69 6e 76 6f 6b 65 64 2e 0a 20 2a 0a 20 2a 09   invoked.. *. *.
8370: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
8380: 6f 20 61 6c 6d 6f 73 74 20 70 6f 73 69 74 69 76  o almost positiv
8390: 65 6c 79 20 69 64 65 6e 74 69 66 79 20 44 4f 53  ely identify DOS
83a0: 20 61 6e 64 20 57 69 6e 64 6f 77 73 0a 20 2a 09   and Windows. *.
83b0: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61  applications tha
83c0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 70  t contain the ap
83d0: 70 72 6f 70 72 69 61 74 65 20 6d 61 67 69 63 20  propriate magic 
83e0: 6e 75 6d 62 65 72 73 2e 20 48 6f 77 65 76 65 72  numbers. However
83f0: 2c 20 44 4f 53 0a 20 2a 09 2e 63 6f 6d 20 66 69  , DOS. *..com fi
8400: 6c 65 73 20 64 6f 20 6e 6f 74 20 73 65 65 6d 20  les do not seem 
8410: 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 67  to contain a mag
8420: 69 63 20 6e 75 6d 62 65 72 3b 20 69 66 20 74 68  ic number; if th
8430: 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 0a 20  e program name. 
8440: 2a 09 65 6e 64 73 20 77 69 74 68 20 2e 63 6f 6d  *.ends with .com
8450: 20 61 6e 64 20 63 6f 75 6c 64 20 6e 6f 74 20 62   and could not b
8460: 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 73 20  e identified as 
8470: 61 20 57 69 6e 64 6f 77 73 20 2e 63 6f 6d 20 66  a Windows .com f
8480: 69 6c 65 2c 20 69 74 0a 20 2a 09 77 69 6c 6c 20  ile, it. *.will 
8490: 62 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  be assumed to be
84a0: 20 61 20 44 4f 53 20 61 70 70 6c 69 63 61 74 69   a DOS applicati
84b0: 6f 6e 2c 20 65 76 65 6e 20 69 66 20 69 74 20 77  on, even if it w
84c0: 61 73 20 6a 75 73 74 20 72 61 6e 64 6f 6d 0a 20  as just random. 
84d0: 2a 09 64 61 74 61 2e 20 49 66 20 74 68 65 20 70  *.data. If the p
84e0: 72 6f 67 72 61 6d 20 6e 61 6d 65 20 64 6f 65 73  rogram name does
84f0: 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 2e 63   not end with .c
8500: 6f 6d 2c 20 6e 6f 20 73 75 63 68 20 61 73 73 75  om, no such assu
8510: 6d 70 74 69 6f 6e 0a 20 2a 09 69 73 20 6d 61 64  mption. *.is mad
8520: 65 2e 0a 20 2a 0a 20 2a 09 54 68 65 20 57 69 6e  e.. *. *.The Win
8530: 33 32 20 66 75 6e 63 74 69 6f 6e 20 47 65 74 42  32 function GetB
8540: 69 6e 61 72 79 54 79 70 65 20 69 6e 63 6f 72 72  inaryType incorr
8550: 65 63 74 6c 79 20 69 64 65 6e 74 69 66 69 65 73  ectly identifies
8560: 20 61 6e 79 20 6a 75 6e 6b 20 66 69 6c 65 0a 20   any junk file. 
8570: 2a 09 74 68 61 74 20 65 6e 64 73 20 77 69 74 68  *.that ends with
8580: 20 2e 65 78 65 20 61 73 20 61 20 64 6f 73 20 65   .exe as a dos e
8590: 78 65 63 75 74 61 62 6c 65 20 61 6e 64 20 73 6f  xecutable and so
85a0: 6d 65 20 65 78 65 63 75 74 61 62 6c 65 73 20 74  me executables t
85b0: 68 61 74 0a 20 2a 09 64 6f 6e 27 74 20 65 6e 64  hat. *.don't end
85c0: 20 77 69 74 68 20 2e 65 78 65 20 61 73 20 6e 6f   with .exe as no
85d0: 74 20 65 78 65 63 75 74 61 62 6c 65 2e 20 50 6c  t executable. Pl
85e0: 75 73 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78  us it doesn't ex
85f0: 69 73 74 20 75 6e 64 65 72 0a 20 2a 09 77 69 6e  ist under. *.win
8600: 39 35 2c 20 73 6f 20 49 20 77 6f 6e 27 74 20 66  95, so I won't f
8610: 65 65 6c 20 62 61 64 20 61 62 6f 75 74 20 72 65  eel bad about re
8620: 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 66 75 6e  implementing fun
8630: 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 20 2a 0a 20  ctionality.. *. 
8640: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68  * Results:. *.Th
8650: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
8660: 73 20 6f 6e 65 20 6f 66 20 41 50 50 4c 5f 44 4f  s one of APPL_DO
8670: 53 2c 20 41 50 50 4c 5f 57 49 4e 33 58 2c 20 6f  S, APPL_WIN3X, o
8680: 72 20 41 50 50 4c 5f 57 49 4e 33 32 20 69 66 20  r APPL_WIN32 if 
8690: 74 68 65 0a 20 2a 09 66 69 6c 65 6e 61 6d 65 20  the. *.filename 
86a0: 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
86b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 70  corresponding ap
86c0: 70 6c 69 63 61 74 69 6f 6e 20 74 79 70 65 2e 20  plication type. 
86d0: 49 66 20 74 68 65 20 66 69 6c 65 0a 20 2a 09 6e  If the file. *.n
86e0: 61 6d 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ame could not be
86f0: 20 66 6f 75 6e 64 20 6f 72 20 64 69 64 20 6e 6f   found or did no
8700: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6b  t refer to any k
8710: 6e 6f 77 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e  nown application
8720: 0a 20 2a 09 74 79 70 65 2c 20 41 50 50 4c 5f 4e  . *.type, APPL_N
8730: 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 20  ONE is returned 
8740: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
8750: 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20  sage is left in 
8760: 69 6e 74 65 72 70 2e 0a 20 2a 09 2e 62 61 74 20  interp.. *..bat 
8770: 66 69 6c 65 73 20 61 72 65 20 69 64 65 6e 74 69  files are identi
8780: 66 69 65 64 20 61 73 20 41 50 50 4c 5f 44 4f 53  fied as APPL_DOS
8790: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
87a0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
87b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
87c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
8800: 73 74 61 74 69 63 20 69 6e 74 0a 41 70 70 6c 69  static int.Appli
8810: 63 61 74 69 6f 6e 54 79 70 65 28 0a 20 20 20 20  cationType(.    
8820: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8830: 72 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70 2c 20  rp,../* Interp, 
8840: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
8850: 65 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  e. */.    const 
8860: 63 68 61 72 20 2a 6f 72 69 67 69 6e 61 6c 4e 61  char *originalNa
8870: 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  me,./* Name of t
8880: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74  he application t
8890: 6f 20 66 69 6e 64 2e 20 2a 2f 0a 20 20 20 20 63  o find. */.    c
88a0: 68 61 72 20 66 75 6c 6c 4e 61 6d 65 5b 5d 29 09  har fullName[]).
88b0: 09 2f 2a 20 46 69 6c 6c 65 64 20 77 69 74 68 20  ./* Filled with 
88c0: 63 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 74 6f  complete path to
88d0: 0a 09 09 09 09 20 2a 20 61 70 70 6c 69 63 61 74  ..... * applicat
88e0: 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e  ion. */.{.    in
88f0: 74 20 61 70 70 6c 54 79 70 65 2c 20 69 2c 20 66  t applType, i, f
8900: 6f 75 6e 64 3b 0a 20 20 20 20 54 63 6c 5f 53 69  ound;.    Tcl_Si
8910: 7a 65 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 20 20  ze nameLen;.    
8920: 48 41 4e 44 4c 45 20 68 46 69 6c 65 3b 0a 20 20  HANDLE hFile;.  
8930: 20 20 57 43 48 41 52 20 2a 72 65 73 74 3b 0a 20    WCHAR *rest;. 
8940: 20 20 20 63 68 61 72 20 2a 65 78 74 3b 0a 20 20     char *ext;.  
8950: 20 20 63 68 61 72 20 62 75 66 5b 32 5d 3b 0a 20    char buf[2];. 
8960: 20 20 20 44 57 4f 52 44 20 61 74 74 72 2c 20 72     DWORD attr, r
8970: 65 61 64 3b 0a 20 20 20 20 49 4d 41 47 45 5f 44  ead;.    IMAGE_D
8980: 4f 53 5f 48 45 41 44 45 52 20 68 65 61 64 65 72  OS_HEADER header
8990: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
89a0: 67 20 6e 61 6d 65 42 75 66 2c 20 64 73 3b 0a 20  g nameBuf, ds;. 
89b0: 20 20 20 63 6f 6e 73 74 20 57 43 48 41 52 20 2a     const WCHAR *
89c0: 6e 61 74 69 76 65 4e 61 6d 65 3b 0a 20 20 20 20  nativeName;.    
89d0: 57 43 48 41 52 20 6e 61 74 69 76 65 46 75 6c 6c  WCHAR nativeFull
89e0: 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a  Path[MAX_PATH];.
89f0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
8a00: 20 63 68 61 72 20 65 78 74 65 6e 73 69 6f 6e 73   char extensions
8a10: 5b 5d 5b 35 5d 20 3d 20 7b 22 22 2c 20 22 2e 63  [][5] = {"", ".c
8a20: 6f 6d 22 2c 20 22 2e 65 78 65 22 2c 20 22 2e 62  om", ".exe", ".b
8a30: 61 74 22 2c 20 22 2e 63 6d 64 22 7d 3b 0a 0a 20  at", ".cmd"};.. 
8a40: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4c 6f 6f     /*.     * Loo
8a50: 6b 20 66 6f 72 20 74 68 65 20 70 72 6f 67 72 61  k for the progra
8a60: 6d 20 61 73 20 61 6e 20 65 78 74 65 72 6e 61 6c  m as an external
8a70: 20 70 72 6f 67 72 61 6d 2e 20 46 69 72 73 74 20   program. First 
8a80: 74 72 79 20 74 68 65 20 6e 61 6d 65 20 61 73 20  try the name as 
8a90: 69 74 0a 20 20 20 20 20 2a 20 69 73 2c 20 74 68  it.     * is, th
8aa0: 65 6e 20 74 72 79 20 61 64 64 69 6e 67 20 2e 63  en try adding .c
8ab0: 6f 6d 2c 20 2e 65 78 65 2c 20 2e 62 61 74 20 61  om, .exe, .bat a
8ac0: 6e 64 20 2e 63 6d 64 2c 20 69 6e 20 74 68 61 74  nd .cmd, in that
8ad0: 20 6f 72 64 65 72 2c 20 74 6f 20 74 68 65 20 6e   order, to the n
8ae0: 61 6d 65 2c 0a 20 20 20 20 20 2a 20 6c 6f 6f 6b  ame,.     * look
8af0: 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 65 63 75  ing for an execu
8b00: 74 61 62 6c 65 2e 0a 20 20 20 20 20 2a 0a 20 20  table..     *.  
8b10: 20 20 20 2a 20 55 73 69 6e 67 20 74 68 65 20 72     * Using the r
8b20: 61 77 20 53 65 61 72 63 68 50 61 74 68 57 28 29  aw SearchPathW()
8b30: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 6e 27   function doesn'
8b40: 74 20 64 6f 20 71 75 69 74 65 20 77 68 61 74 20  t do quite what 
8b50: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
8b60: 20 20 20 2a 20 49 66 20 74 68 65 20 6e 61 6d 65     * If the name
8b70: 20 6f 66 20 74 68 65 20 65 78 65 63 75 74 61 62   of the executab
8b80: 6c 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  le already conta
8b90: 69 6e 73 20 61 20 27 2e 27 20 63 68 61 72 61 63  ins a '.' charac
8ba0: 74 65 72 2c 20 69 74 20 77 69 6c 6c 0a 20 20 20  ter, it will.   
8bb0: 20 20 2a 20 6e 6f 74 20 74 72 79 20 61 70 70 65    * not try appe
8bc0: 6e 64 69 6e 67 20 74 68 65 20 73 70 65 63 69 66  nding the specif
8bd0: 69 65 64 20 65 78 74 65 6e 73 69 6f 6e 20 77 68  ied extension wh
8be0: 65 6e 20 73 65 61 72 63 68 69 6e 67 20 28 69 6e  en searching (in
8bf0: 20 6f 74 68 65 72 0a 20 20 20 20 20 2a 20 77 6f   other.     * wo
8c00: 72 64 73 2c 20 53 65 61 72 63 68 50 61 74 68 20  rds, SearchPath 
8c10: 77 69 6c 6c 20 6e 6f 74 20 66 69 6e 64 20 74 68  will not find th
8c20: 65 20 70 72 6f 67 72 61 6d 20 22 61 2e 62 2e 65  e program "a.b.e
8c30: 78 65 22 20 69 66 20 74 68 65 20 61 72 67 75 6d  xe" if the argum
8c40: 65 6e 74 73 0a 20 20 20 20 20 2a 20 73 70 65 63  ents.     * spec
8c50: 69 66 69 65 64 20 22 61 2e 62 22 20 61 6e 64 20  ified "a.b" and 
8c60: 22 2e 65 78 65 22 29 2e 20 53 6f 2c 20 66 69 72  ".exe"). So, fir
8c70: 73 74 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 20  st look for the 
8c80: 66 69 6c 65 20 61 73 20 69 74 20 69 73 0a 20 20  file as it is.  
8c90: 20 20 20 2a 20 6e 61 6d 65 64 2e 20 54 68 65 6e     * named. Then
8ca0: 20 6d 61 6e 75 61 6c 6c 79 20 61 70 70 65 6e 64   manually append
8cb0: 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 73 2c   the extensions,
8cc0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 6d   looking for a m
8cd0: 61 74 63 68 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  atch..     */.. 
8ce0: 20 20 20 61 70 70 6c 54 79 70 65 20 3d 20 41 50     applType = AP
8cf0: 50 4c 5f 4e 4f 4e 45 3b 0a 20 20 20 20 54 63 6c  PL_NONE;.    Tcl
8d00: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 6e 61  _DStringInit(&na
8d10: 6d 65 42 75 66 29 3b 0a 20 20 20 20 54 63 6c 5f  meBuf);.    Tcl_
8d20: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 6e  DStringAppend(&n
8d30: 61 6d 65 42 75 66 2c 20 6f 72 69 67 69 6e 61 6c  ameBuf, original
8d40: 4e 61 6d 65 2c 20 54 43 4c 5f 49 4e 44 45 58 5f  Name, TCL_INDEX_
8d50: 4e 4f 4e 45 29 3b 0a 20 20 20 20 6e 61 6d 65 4c  NONE);.    nameL
8d60: 65 6e 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67  en = Tcl_DString
8d70: 4c 65 6e 67 74 68 28 26 6e 61 6d 65 42 75 66 29  Length(&nameBuf)
8d80: 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20  ;..    for (i = 
8d90: 30 3b 20 69 20 3c 20 28 69 6e 74 29 20 28 73 69  0; i < (int) (si
8da0: 7a 65 6f 66 28 65 78 74 65 6e 73 69 6f 6e 73 29  zeof(extensions)
8db0: 20 2f 20 73 69 7a 65 6f 66 28 65 78 74 65 6e 73   / sizeof(extens
8dc0: 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 2b 2b 29 20  ions[0])); i++) 
8dd0: 7b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 53 65  {..Tcl_DStringSe
8de0: 74 4c 65 6e 67 74 68 28 26 6e 61 6d 65 42 75 66  tLength(&nameBuf
8df0: 2c 20 6e 61 6d 65 4c 65 6e 29 3b 0a 09 54 63 6c  , nameLen);..Tcl
8e00: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
8e10: 6e 61 6d 65 42 75 66 2c 20 65 78 74 65 6e 73 69  nameBuf, extensi
8e20: 6f 6e 73 5b 69 5d 2c 20 54 43 4c 5f 49 4e 44 45  ons[i], TCL_INDE
8e30: 58 5f 4e 4f 4e 45 29 3b 0a 09 54 63 6c 5f 44 53  X_NONE);..Tcl_DS
8e40: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
8e50: 09 6e 61 74 69 76 65 4e 61 6d 65 20 3d 20 54 63  .nativeName = Tc
8e60: 6c 5f 55 74 66 54 6f 57 43 68 61 72 44 53 74 72  l_UtfToWCharDStr
8e70: 69 6e 67 28 54 63 6c 5f 44 53 74 72 69 6e 67 56  ing(Tcl_DStringV
8e80: 61 6c 75 65 28 26 6e 61 6d 65 42 75 66 29 2c 0a  alue(&nameBuf),.
8e90: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e  ..Tcl_DStringLen
8ea0: 67 74 68 28 26 6e 61 6d 65 42 75 66 29 2c 20 26  gth(&nameBuf), &
8eb0: 64 73 29 3b 0a 09 66 6f 75 6e 64 20 3d 20 53 65  ds);..found = Se
8ec0: 61 72 63 68 50 61 74 68 57 28 4e 55 4c 4c 2c 20  archPathW(NULL, 
8ed0: 6e 61 74 69 76 65 4e 61 6d 65 2c 20 4e 55 4c 4c  nativeName, NULL
8ee0: 2c 20 4d 41 58 5f 50 41 54 48 2c 0a 09 09 6e 61  , MAX_PATH,...na
8ef0: 74 69 76 65 46 75 6c 6c 50 61 74 68 2c 20 26 72  tiveFullPath, &r
8f00: 65 73 74 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  est);..Tcl_DStri
8f10: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 69 66  ngFree(&ds);..if
8f20: 20 28 66 6f 75 6e 64 20 3d 3d 20 30 29 20 7b 0a   (found == 0) {.
8f30: 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09  .    continue;..
8f40: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 49 67 6e 6f 72  }.../*.. * Ignor
8f50: 65 20 6d 61 74 63 68 65 73 20 6f 6e 20 64 69 72  e matches on dir
8f60: 65 63 74 6f 72 69 65 73 20 6f 72 20 64 61 74 61  ectories or data
8f70: 20 66 69 6c 65 73 2c 20 72 65 74 75 72 6e 20 69   files, return i
8f80: 66 20 69 64 65 6e 74 69 66 69 65 64 20 61 0a 09  f identified a..
8f90: 20 2a 20 6b 6e 6f 77 6e 20 74 79 70 65 2e 0a 09   * known type...
8fa0: 20 2a 2f 0a 0a 09 61 74 74 72 20 3d 20 47 65 74   */...attr = Get
8fb0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
8fc0: 6e 61 74 69 76 65 46 75 6c 6c 50 61 74 68 29 3b  nativeFullPath);
8fd0: 0a 09 69 66 20 28 28 61 74 74 72 20 3d 3d 20 30  ..if ((attr == 0
8fe0: 78 46 46 46 46 46 46 46 46 29 20 7c 7c 20 28 61  xFFFFFFFF) || (a
8ff0: 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49  ttr & FILE_ATTRI
9000: 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 29  BUTE_DIRECTORY))
9010: 20 7b 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65   {..    continue
9020: 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e  ;..}..Tcl_DStrin
9030: 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 73 74 72  gInit(&ds);..str
9040: 63 70 79 28 66 75 6c 6c 4e 61 6d 65 2c 20 54 63  cpy(fullName, Tc
9050: 6c 5f 57 43 68 61 72 54 6f 55 74 66 44 53 74 72  l_WCharToUtfDStr
9060: 69 6e 67 28 6e 61 74 69 76 65 46 75 6c 6c 50 61  ing(nativeFullPa
9070: 74 68 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f  th, TCL_INDEX_NO
9080: 4e 45 2c 20 26 64 73 29 29 3b 0a 09 54 63 6c 5f  NE, &ds));..Tcl_
9090: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
90a0: 3b 0a 0a 09 65 78 74 20 3d 20 73 74 72 72 63 68  ;...ext = strrch
90b0: 72 28 66 75 6c 6c 4e 61 6d 65 2c 20 27 2e 27 29  r(fullName, '.')
90c0: 3b 0a 09 69 66 20 28 28 65 78 74 20 21 3d 20 4e  ;..if ((ext != N
90d0: 55 4c 4c 29 20 26 26 0a 09 09 28 73 74 72 63 61  ULL) &&...(strca
90e0: 73 65 63 6d 70 28 65 78 74 2c 20 22 2e 63 6d 64  secmp(ext, ".cmd
90f0: 22 29 20 3d 3d 20 30 20 7c 7c 20 73 74 72 63 61  ") == 0 || strca
9100: 73 65 63 6d 70 28 65 78 74 2c 20 22 2e 62 61 74  secmp(ext, ".bat
9110: 22 29 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20  ") == 0)) {..   
9120: 20 61 70 70 6c 54 79 70 65 20 3d 20 41 50 50 4c   applType = APPL
9130: 5f 44 4f 53 3b 0a 09 20 20 20 20 62 72 65 61 6b  _DOS;..    break
9140: 3b 0a 09 7d 0a 0a 09 68 46 69 6c 65 20 3d 20 43  ;..}...hFile = C
9150: 72 65 61 74 65 46 69 6c 65 57 28 6e 61 74 69 76  reateFileW(nativ
9160: 65 46 75 6c 6c 50 61 74 68 2c 0a 09 09 47 45 4e  eFullPath,...GEN
9170: 45 52 49 43 5f 52 45 41 44 2c 20 46 49 4c 45 5f  ERIC_READ, FILE_
9180: 53 48 41 52 45 5f 52 45 41 44 2c 20 4e 55 4c 4c  SHARE_READ, NULL
9190: 2c 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c  , OPEN_EXISTING,
91a0: 0a 09 09 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ...FILE_ATTRIBUT
91b0: 45 5f 4e 4f 52 4d 41 4c 7c 46 49 4c 45 5f 46 4c  E_NORMAL|FILE_FL
91c0: 41 47 5f 4f 50 45 4e 5f 52 45 50 41 52 53 45 5f  AG_OPEN_REPARSE_
91d0: 50 4f 49 4e 54 2c 20 4e 55 4c 4c 29 3b 0a 09 69  POINT, NULL);..i
91e0: 66 20 28 68 46 69 6c 65 20 3d 3d 20 49 4e 56 41  f (hFile == INVA
91f0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
9200: 29 20 7b 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75  ) {..    continu
9210: 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 74 74 72  e;..}...if (attr
9220: 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
9230: 45 5f 52 45 50 41 52 53 45 5f 50 4f 49 4e 54 29  E_REPARSE_POINT)
9240: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20   {..    /*..    
9250: 20 2a 20 42 75 74 20 5b 34 66 30 62 35 37 36 37   * But [4f0b5767
9260: 61 63 5d 2e 20 4c 69 6b 65 6c 79 20 61 20 41 70  ac]. Likely a Ap
9270: 70 20 45 78 65 63 75 74 69 6f 6e 20 41 6c 69 61  p Execution Alia
9280: 73 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  s. This can only
9290: 0a 09 20 20 20 20 20 2a 20 62 65 20 61 20 57 69  ..     * be a Wi
92a0: 6e 33 32 20 41 50 50 2e 20 41 74 74 65 6d 70 74  n32 APP. Attempt
92b0: 20 74 6f 20 52 65 61 64 46 69 6c 65 20 62 65 6c   to ReadFile bel
92c0: 6f 77 20 77 69 6c 6c 20 66 61 69 6c 2e 20 57 65  ow will fail. We
92d0: 20 61 73 73 75 6d 65 0a 09 20 20 20 20 20 2a 20   assume..     * 
92e0: 74 68 61 74 20 69 66 20 69 74 20 69 73 20 6f 6e  that if it is on
92f0: 20 74 68 65 20 50 41 54 48 2c 20 61 6e 64 20 69   the PATH, and i
9300: 74 20 69 73 20 61 20 72 65 70 61 72 73 65 20 70  t is a reparse p
9310: 6f 69 6e 74 2c 20 69 74 20 69 73 20 61 6e 0a 09  oint, it is an..
9320: 20 20 20 20 20 2a 20 41 70 70 20 45 78 65 63 75       * App Execu
9330: 74 69 6f 6e 20 41 6c 69 61 73 2e 0a 09 20 20 20  tion Alias...   
9340: 20 20 2a 2f 0a 09 20 20 20 20 43 6c 6f 73 65 48    */..    CloseH
9350: 61 6e 64 6c 65 28 68 46 69 6c 65 29 3b 0a 09 20  andle(hFile);.. 
9360: 20 20 20 61 70 70 6c 54 79 70 65 20 3d 20 41 50     applType = AP
9370: 50 4c 5f 57 49 4e 33 32 3b 0a 09 20 20 20 20 62  PL_WIN32;..    b
9380: 72 65 61 6b 3b 0a 09 7d 0a 0a 09 68 65 61 64 65  reak;..}...heade
9390: 72 2e 65 5f 6d 61 67 69 63 20 3d 20 30 3b 0a 09  r.e_magic = 0;..
93a0: 52 65 61 64 46 69 6c 65 28 68 46 69 6c 65 2c 20  ReadFile(hFile, 
93b0: 28 76 6f 69 64 20 2a 29 26 68 65 61 64 65 72 2c  (void *)&header,
93c0: 20 73 69 7a 65 6f 66 28 68 65 61 64 65 72 29 2c   sizeof(header),
93d0: 20 26 72 65 61 64 2c 20 4e 55 4c 4c 29 3b 0a 09   &read, NULL);..
93e0: 69 66 20 28 68 65 61 64 65 72 2e 65 5f 6d 61 67  if (header.e_mag
93f0: 69 63 20 21 3d 20 49 4d 41 47 45 5f 44 4f 53 5f  ic != IMAGE_DOS_
9400: 53 49 47 4e 41 54 55 52 45 29 20 7b 0a 09 20 20  SIGNATURE) {..  
9410: 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 44 6f 65    /*..     * Doe
9420: 73 6e 27 74 20 68 61 76 65 20 74 68 65 20 6d 61  sn't have the ma
9430: 67 69 63 20 6e 75 6d 62 65 72 20 66 6f 72 20 72  gic number for r
9440: 65 6c 6f 63 61 74 61 62 6c 65 20 65 78 65 63 75  elocatable execu
9450: 74 61 62 6c 65 73 2e 20 49 66 0a 09 20 20 20 20  tables. If..    
9460: 20 2a 20 66 69 6c 65 6e 61 6d 65 20 65 6e 64 73   * filename ends
9470: 20 77 69 74 68 20 2e 63 6f 6d 2c 20 61 73 73 75   with .com, assu
9480: 6d 65 20 69 74 27 73 20 61 20 44 4f 53 20 61 70  me it's a DOS ap
9490: 70 6c 69 63 61 74 69 6f 6e 20 61 6e 79 68 6f 77  plication anyhow
94a0: 2e 0a 09 20 20 20 20 20 2a 20 4e 6f 74 65 20 74  ...     * Note t
94b0: 68 61 74 20 77 65 20 64 69 64 6e 27 74 20 6d 61  hat we didn't ma
94c0: 6b 65 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  ke this assumpti
94d0: 6f 6e 20 61 74 20 66 69 72 73 74 2c 20 62 65 63  on at first, bec
94e0: 61 75 73 65 20 73 6f 6d 65 0a 09 20 20 20 20 20  ause some..     
94f0: 2a 20 73 75 70 70 6f 73 65 64 20 2e 63 6f 6d 20  * supposed .com 
9500: 66 69 6c 65 73 20 61 72 65 20 72 65 61 6c 6c 79  files are really
9510: 20 33 32 2d 62 69 74 20 65 78 65 63 75 74 61 62   32-bit executab
9520: 6c 65 73 20 77 69 74 68 20 61 6c 6c 20 74 68 65  les with all the
9530: 0a 09 20 20 20 20 20 2a 20 6d 61 67 69 63 20 6e  ..     * magic n
9540: 75 6d 62 65 72 73 20 61 6e 64 20 65 76 65 72 79  umbers and every
9550: 74 68 69 6e 67 2e 0a 09 20 20 20 20 20 2a 2f 0a  thing...     */.
9560: 0a 09 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c  ..    CloseHandl
9570: 65 28 68 46 69 6c 65 29 3b 0a 09 20 20 20 20 69  e(hFile);..    i
9580: 66 20 28 28 65 78 74 20 21 3d 20 4e 55 4c 4c 29  f ((ext != NULL)
9590: 20 26 26 20 28 73 74 72 63 61 73 65 63 6d 70 28   && (strcasecmp(
95a0: 65 78 74 2c 20 22 2e 63 6f 6d 22 29 20 3d 3d 20  ext, ".com") == 
95b0: 30 29 29 20 7b 0a 09 09 61 70 70 6c 54 79 70 65  0)) {...applType
95c0: 20 3d 20 41 50 50 4c 5f 44 4f 53 3b 0a 09 09 62   = APPL_DOS;...b
95d0: 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20  reak;..    }..  
95e0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 7d 0a 09    continue;..}..
95f0: 69 66 20 28 68 65 61 64 65 72 2e 65 5f 6c 66 61  if (header.e_lfa
9600: 72 6c 63 20 21 3d 20 73 69 7a 65 6f 66 28 68 65  rlc != sizeof(he
9610: 61 64 65 72 29 29 20 7b 0a 09 20 20 20 20 2f 2a  ader)) {..    /*
9620: 0a 09 20 20 20 20 20 2a 20 41 6c 6c 20 57 69 6e  ..     * All Win
9630: 64 6f 77 73 20 33 2e 58 20 61 6e 64 20 57 69 6e  dows 3.X and Win
9640: 33 32 20 61 6e 64 20 73 6f 6d 65 20 44 4f 53 20  32 and some DOS 
9650: 70 72 6f 67 72 61 6d 73 20 68 61 76 65 20 74 68  programs have th
9660: 69 73 20 76 61 6c 75 65 0a 09 20 20 20 20 20 2a  is value..     *
9670: 20 73 65 74 20 68 65 72 65 2e 20 49 66 20 69 74   set here. If it
9680: 20 64 6f 65 73 6e 27 74 2c 20 61 73 73 75 6d 65   doesn't, assume
9690: 20 74 68 61 74 20 73 69 6e 63 65 20 69 74 20 61   that since it a
96a0: 6c 72 65 61 64 79 20 68 61 64 20 74 68 65 0a 09  lready had the..
96b0: 20 20 20 20 20 2a 20 6f 74 68 65 72 20 6d 61 67       * other mag
96c0: 69 63 20 6e 75 6d 62 65 72 20 69 74 20 77 61 73  ic number it was
96d0: 20 61 20 44 4f 53 20 61 70 70 6c 69 63 61 74 69   a DOS applicati
96e0: 6f 6e 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  on...     */... 
96f0: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68     CloseHandle(h
9700: 46 69 6c 65 29 3b 0a 09 20 20 20 20 61 70 70 6c  File);..    appl
9710: 54 79 70 65 20 3d 20 41 50 50 4c 5f 44 4f 53 3b  Type = APPL_DOS;
9720: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a  ..    break;..}.
9730: 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 44 57 4f  ../*.. * The DWO
9740: 52 44 20 61 74 20 68 65 61 64 65 72 2e 65 5f 6c  RD at header.e_l
9750: 66 61 6e 65 77 20 70 6f 69 6e 74 73 20 74 6f 20  fanew points to 
9760: 79 65 74 20 61 6e 6f 74 68 65 72 20 6d 61 67 69  yet another magi
9770: 63 20 6e 75 6d 62 65 72 2e 0a 09 20 2a 2f 0a 0a  c number... */..
9780: 09 62 75 66 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  .buf[0] = '\0';.
9790: 09 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28  .SetFilePointer(
97a0: 68 46 69 6c 65 2c 20 68 65 61 64 65 72 2e 65 5f  hFile, header.e_
97b0: 6c 66 61 6e 65 77 2c 20 4e 55 4c 4c 2c 20 46 49  lfanew, NULL, FI
97c0: 4c 45 5f 42 45 47 49 4e 29 3b 0a 09 52 65 61 64  LE_BEGIN);..Read
97d0: 46 69 6c 65 28 68 46 69 6c 65 2c 20 28 76 6f 69  File(hFile, (voi
97e0: 64 20 2a 29 62 75 66 2c 20 32 2c 20 26 72 65 61  d *)buf, 2, &rea
97f0: 64 2c 20 4e 55 4c 4c 29 3b 0a 09 43 6c 6f 73 65  d, NULL);..Close
9800: 48 61 6e 64 6c 65 28 68 46 69 6c 65 29 3b 0a 0a  Handle(hFile);..
9810: 09 69 66 20 28 28 62 75 66 5b 30 5d 20 3d 3d 20  .if ((buf[0] == 
9820: 27 4e 27 29 20 26 26 20 28 62 75 66 5b 31 5d 20  'N') && (buf[1] 
9830: 3d 3d 20 27 45 27 29 29 20 7b 0a 09 20 20 20 20  == 'E')) {..    
9840: 61 70 70 6c 54 79 70 65 20 3d 20 41 50 50 4c 5f  applType = APPL_
9850: 57 49 4e 33 58 3b 0a 09 7d 20 65 6c 73 65 20 69  WIN3X;..} else i
9860: 66 20 28 28 62 75 66 5b 30 5d 20 3d 3d 20 27 50  f ((buf[0] == 'P
9870: 27 29 20 26 26 20 28 62 75 66 5b 31 5d 20 3d 3d  ') && (buf[1] ==
9880: 20 27 45 27 29 29 20 7b 0a 09 20 20 20 20 61 70   'E')) {..    ap
9890: 70 6c 54 79 70 65 20 3d 20 41 50 50 4c 5f 57 49  plType = APPL_WI
98a0: 4e 33 32 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  N32;..} else {..
98b0: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 53      /*..     * S
98c0: 74 72 69 63 74 6c 79 20 73 70 65 61 6b 69 6e 67  trictly speaking
98d0: 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  , there should b
98e0: 65 20 61 20 74 65 73 74 20 74 68 61 74 20 74 68  e a test that th
98f0: 65 72 65 20 69 73 20 61 6e 20 27 4c 27 0a 09 20  ere is an 'L'.. 
9900: 20 20 20 20 2a 20 61 6e 64 20 27 45 27 20 61 74      * and 'E' at
9910: 20 62 75 66 5b 30 2e 2e 31 5d 2c 20 74 6f 20 69   buf[0..1], to i
9920: 64 65 6e 74 69 66 79 20 74 68 65 20 74 79 70 65  dentify the type
9930: 20 61 73 20 44 4f 53 2c 20 62 75 74 20 6f 66 0a   as DOS, but of.
9940: 09 20 20 20 20 20 2a 20 63 6f 75 72 73 65 20 77  .     * course w
9950: 65 20 72 61 6e 20 69 6e 74 6f 20 61 20 44 4f 53  e ran into a DOS
9960: 20 65 78 65 63 75 74 61 62 6c 65 20 74 68 61 74   executable that
9970: 20 5f 64 6f 65 73 6e 27 74 5f 20 68 61 76 65 20   _doesn't_ have 
9980: 74 68 65 0a 09 20 20 20 20 20 2a 20 6d 61 67 69  the..     * magi
9990: 63 20 6e 75 6d 62 65 72 20 2d 20 73 70 65 63 69  c number - speci
99a0: 66 69 63 61 6c 6c 79 2c 20 6f 6e 65 20 63 6f 6d  fically, one com
99b0: 70 69 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  piled using the 
99c0: 4c 61 68 65 79 0a 09 20 20 20 20 20 2a 20 46 6f  Lahey..     * Fo
99d0: 72 74 72 61 6e 39 30 20 63 6f 6d 70 69 6c 65 72  rtran90 compiler
99e0: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  ...     */...   
99f0: 20 61 70 70 6c 54 79 70 65 20 3d 20 41 50 50 4c   applType = APPL
9a00: 5f 44 4f 53 3b 0a 09 7d 0a 09 62 72 65 61 6b 3b  _DOS;..}..break;
9a10: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
9a20: 53 74 72 69 6e 67 46 72 65 65 28 26 6e 61 6d 65  StringFree(&name
9a30: 42 75 66 29 3b 0a 0a 20 20 20 20 69 66 20 28 61  Buf);..    if (a
9a40: 70 70 6c 54 79 70 65 20 3d 3d 20 41 50 50 4c 5f  pplType == APPL_
9a50: 4e 4f 4e 45 29 20 7b 0a 09 54 63 6c 5f 57 69 6e  NONE) {..Tcl_Win
9a60: 43 6f 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74  ConvertError(Get
9a70: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 54  LastError());..T
9a80: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
9a90: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50  interp, Tcl_ObjP
9aa0: 72 69 6e 74 66 28 22 63 6f 75 6c 64 6e 27 74 20  rintf("couldn't 
9ab0: 65 78 65 63 75 74 65 20 5c 22 25 73 5c 22 3a 20  execute \"%s\": 
9ac0: 25 73 22 2c 0a 09 09 6f 72 69 67 69 6e 61 6c 4e  %s",...originalN
9ad0: 61 6d 65 2c 20 54 63 6c 5f 50 6f 73 69 78 45 72  ame, Tcl_PosixEr
9ae0: 72 6f 72 28 69 6e 74 65 72 70 29 29 29 3b 0a 09  ror(interp)));..
9af0: 72 65 74 75 72 6e 20 41 50 50 4c 5f 4e 4f 4e 45  return APPL_NONE
9b00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
9b10: 28 61 70 70 6c 54 79 70 65 20 3d 3d 20 41 50 50  (applType == APP
9b20: 4c 5f 57 49 4e 33 58 29 20 7b 0a 09 2f 2a 0a 09  L_WIN3X) {../*..
9b30: 20 2a 20 52 65 70 6c 61 63 65 20 6c 6f 6e 67 20   * Replace long 
9b40: 70 61 74 68 20 6e 61 6d 65 20 6f 66 20 65 78 65  path name of exe
9b50: 63 75 74 61 62 6c 65 20 77 69 74 68 20 73 68 6f  cutable with sho
9b60: 72 74 20 70 61 74 68 20 6e 61 6d 65 20 66 6f 72  rt path name for
9b70: 0a 09 20 2a 20 31 36 2d 62 69 74 20 61 70 70 6c  .. * 16-bit appl
9b80: 69 63 61 74 69 6f 6e 73 2e 20 4f 74 68 65 72 77  ications. Otherw
9b90: 69 73 65 20 74 68 65 20 61 70 70 6c 69 63 61 74  ise the applicat
9ba0: 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ion may not be a
9bb0: 62 6c 65 20 74 6f 0a 09 20 2a 20 63 6f 72 72 65  ble to.. * corre
9bc0: 63 74 6c 79 20 70 61 72 73 65 20 69 74 73 20 6f  ctly parse its o
9bd0: 77 6e 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  wn command line 
9be0: 74 6f 20 73 65 70 61 72 61 74 65 20 6f 66 66 20  to separate off 
9bf0: 74 68 65 0a 09 20 2a 20 61 70 70 6c 69 63 61 74  the.. * applicat
9c00: 69 6f 6e 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ion name from th
9c10: 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 09 20 2a  e arguments... *
9c20: 2f 0a 0a 09 47 65 74 53 68 6f 72 74 50 61 74 68  /...GetShortPath
9c30: 4e 61 6d 65 57 28 6e 61 74 69 76 65 46 75 6c 6c  NameW(nativeFull
9c40: 50 61 74 68 2c 20 6e 61 74 69 76 65 46 75 6c 6c  Path, nativeFull
9c50: 50 61 74 68 2c 20 4d 41 58 5f 50 41 54 48 29 3b  Path, MAX_PATH);
9c60: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69  ..Tcl_DStringIni
9c70: 74 28 26 64 73 29 3b 0a 09 73 74 72 63 70 79 28  t(&ds);..strcpy(
9c80: 66 75 6c 6c 4e 61 6d 65 2c 20 54 63 6c 5f 57 43  fullName, Tcl_WC
9c90: 68 61 72 54 6f 55 74 66 44 53 74 72 69 6e 67 28  harToUtfDString(
9ca0: 6e 61 74 69 76 65 46 75 6c 6c 50 61 74 68 2c 20  nativeFullPath, 
9cb0: 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 2c 20  TCL_INDEX_NONE, 
9cc0: 26 64 73 29 29 3b 0a 09 54 63 6c 5f 44 53 74 72  &ds));..Tcl_DStr
9cd0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20  ingFree(&ds);.  
9ce0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 61    }.    return a
9cf0: 70 70 6c 54 79 70 65 3b 0a 7d 0a 0c 0a 2f 2a 0a  pplType;.}.../*.
9d00: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
9d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42  --------. *. * B
9d50: 75 69 6c 64 43 6f 6d 6d 61 6e 64 4c 69 6e 65 20  uildCommandLine 
9d60: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 65 20 63 6f 6d  --. *. *.The com
9d70: 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65  mand line argume
9d80: 6e 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  nts are stored i
9d90: 6e 20 6c 69 6e 65 50 74 72 20 73 65 70 61 72 61  n linePtr separa
9da0: 74 65 64 20 62 79 20 73 70 61 63 65 73 2c 0a 20  ted by spaces,. 
9db0: 2a 09 69 6e 20 61 20 66 6f 72 6d 20 74 68 61 74  *.in a form that
9dc0: 20 43 72 65 61 74 65 50 72 6f 63 65 73 73 57 28   CreateProcessW(
9dd0: 29 20 75 6e 64 65 72 73 74 61 6e 64 73 2e 20 53  ) understands. S
9de0: 70 65 63 69 61 6c 20 63 68 61 72 61 63 74 65 72  pecial character
9df0: 73 20 69 6e 0a 20 2a 09 69 6e 64 69 76 69 64 75  s in. *.individu
9e00: 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  al arguments fro
9e10: 6d 20 61 72 67 76 5b 5d 20 6d 75 73 74 20 62 65  m argv[] must be
9e20: 20 71 75 6f 74 65 64 20 77 68 65 6e 20 62 65 69   quoted when bei
9e30: 6e 67 20 73 74 6f 72 65 64 20 69 6e 0a 20 2a 09  ng stored in. *.
9e40: 63 6d 64 4c 69 6e 65 2e 0a 20 2a 0a 20 2a 20 52  cmdLine.. *. * R
9e50: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
9e60: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
9e70: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
9e80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
9e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
9ed0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
9ee0: 20 2a 0a 42 75 69 6c 64 43 6d 64 4c 69 6e 65 42   *.BuildCmdLineB
9ef0: 79 70 61 73 73 42 53 28 0a 20 20 20 20 63 6f 6e  ypassBS(.    con
9f00: 73 74 20 63 68 61 72 20 2a 63 75 72 72 65 6e 74  st char *current
9f10: 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ,.    const char
9f20: 20 2a 2a 62 73 70 6f 73 29 0a 7b 0a 20 20 20 20   **bspos).{.    
9f30: 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 72 6b 20 66  /*.     * Mark f
9f40: 69 72 73 74 20 62 61 63 6b 73 6c 61 73 68 20 70  irst backslash p
9f50: 6f 73 69 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 2f  osition..     */
9f60: 0a 0a 20 20 20 20 69 66 20 28 21 2a 62 73 70 6f  ..    if (!*bspo
9f70: 73 29 20 7b 0a 09 2a 62 73 70 6f 73 20 3d 20 63  s) {..*bspos = c
9f80: 75 72 72 65 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  urrent;.    }.  
9f90: 20 20 64 6f 20 7b 0a 09 63 75 72 72 65 6e 74 2b    do {..current+
9fa0: 2b 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28  +;.    } while (
9fb0: 2a 63 75 72 72 65 6e 74 20 3d 3d 20 27 5c 5c 27  *current == '\\'
9fc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 75  );.    return cu
9fd0: 72 72 65 6e 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  rrent;.}..static
9fe0: 20 76 6f 69 64 0a 51 75 6f 74 65 43 6d 64 4c 69   void.QuoteCmdLi
9ff0: 6e 65 42 61 63 6b 73 6c 61 73 68 28 0a 20 20 20  neBackslash(.   
a000: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73   Tcl_DString *ds
a010: 50 74 72 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63  Ptr,.    const c
a020: 68 61 72 20 2a 73 74 61 72 74 2c 0a 20 20 20 20  har *start,.    
a030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 75 72 72  const char *curr
a040: 65 6e 74 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63  ent,.    const c
a050: 68 61 72 20 2a 62 73 70 6f 73 29 0a 7b 0a 20 20  har *bspos).{.  
a060: 20 20 69 66 20 28 21 62 73 70 6f 73 29 20 7b 0a    if (!bspos) {.
a070: 09 69 66 20 28 63 75 72 72 65 6e 74 20 3e 20 73  .if (current > s
a080: 74 61 72 74 29 20 7b 09 2f 2a 20 70 61 72 74 20  tart) {./* part 
a090: 62 65 66 6f 72 65 20 63 75 72 72 65 6e 74 20 28  before current (
a0a0: 73 70 65 63 69 61 6c 29 20 2a 2f 0a 09 20 20 20  special) */..   
a0b0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
a0c0: 6e 64 28 64 73 50 74 72 2c 20 73 74 61 72 74 2c  nd(dsPtr, start,
a0d0: 20 28 69 6e 74 29 20 28 63 75 72 72 65 6e 74 20   (int) (current 
a0e0: 2d 20 73 74 61 72 74 29 29 3b 0a 09 7d 0a 20 20  - start));..}.  
a0f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28    } else {..if (
a100: 62 73 70 6f 73 20 3e 20 73 74 61 72 74 29 20 7b  bspos > start) {
a110: 09 2f 2a 20 70 61 72 74 20 62 65 66 6f 72 65 20  ./* part before 
a120: 66 69 72 73 74 20 62 61 63 6b 73 6c 61 73 68 20  first backslash 
a130: 2a 2f 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  */..    Tcl_DStr
a140: 69 6e 67 41 70 70 65 6e 64 28 64 73 50 74 72 2c  ingAppend(dsPtr,
a150: 20 73 74 61 72 74 2c 20 28 69 6e 74 29 20 28 62   start, (int) (b
a160: 73 70 6f 73 20 2d 20 73 74 61 72 74 29 29 3b 0a  spos - start));.
a170: 09 7d 0a 09 77 68 69 6c 65 20 28 62 73 70 6f 73  .}..while (bspos
a180: 2b 2b 20 3c 20 63 75 72 72 65 6e 74 29 20 7b 20  ++ < current) { 
a190: 2f 2a 20 65 61 63 68 20 62 61 63 6b 73 6c 61 73  /* each backslas
a1a0: 68 20 74 77 69 63 65 20 2a 2f 0a 09 20 20 20 20  h twice */..    
a1b0: 54 63 6c 44 53 74 72 69 6e 67 41 70 70 65 6e 64  TclDStringAppend
a1c0: 4c 69 74 65 72 61 6c 28 64 73 50 74 72 2c 20 22  Literal(dsPtr, "
a1d0: 5c 5c 5c 5c 22 29 3b 0a 09 7d 0a 20 20 20 20 7d  \\\\");..}.    }
a1e0: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
a1f0: 20 63 68 61 72 20 2a 0a 51 75 6f 74 65 43 6d 64   char *.QuoteCmd
a200: 4c 69 6e 65 50 61 72 74 28 0a 20 20 20 20 54 63  LinePart(.    Tc
a210: 6c 5f 44 53 74 72 69 6e 67 20 2a 64 73 50 74 72  l_DString *dsPtr
a220: 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ,.    const char
a230: 20 2a 73 74 61 72 74 2c 0a 20 20 20 20 63 6f 6e   *start,.    con
a240: 73 74 20 63 68 61 72 20 2a 73 70 65 63 69 61 6c  st char *special
a250: 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ,.    const char
a260: 20 2a 73 70 65 63 4d 65 74 61 43 68 61 72 73 2c   *specMetaChars,
a270: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
a280: 2a 2a 62 73 70 6f 73 29 0a 7b 0a 20 20 20 20 69  **bspos).{.    i
a290: 66 20 28 21 2a 62 73 70 6f 73 29 20 7b 0a 09 2f  f (!*bspos) {../
a2a0: 2a 0a 09 20 2a 20 52 65 73 74 20 62 65 66 6f 72  *.. * Rest befor
a2b0: 65 20 73 70 65 63 69 61 6c 20 28 62 65 66 6f 72  e special (befor
a2c0: 65 20 71 75 6f 74 65 29 2e 0a 09 20 2a 2f 0a 0a  e quote)... */..
a2d0: 09 51 75 6f 74 65 43 6d 64 4c 69 6e 65 42 61 63  .QuoteCmdLineBac
a2e0: 6b 73 6c 61 73 68 28 64 73 50 74 72 2c 20 73 74  kslash(dsPtr, st
a2f0: 61 72 74 2c 20 73 70 65 63 69 61 6c 2c 20 4e 55  art, special, NU
a300: 4c 4c 29 3b 0a 09 73 74 61 72 74 20 3d 20 73 70  LL);..start = sp
a310: 65 63 69 61 6c 3b 0a 20 20 20 20 7d 20 65 6c 73  ecial;.    } els
a320: 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 73 74  e {../*.. * Rest
a330: 20 62 65 66 6f 72 65 20 66 69 72 73 74 20 62 61   before first ba
a340: 63 6b 73 6c 61 73 68 20 61 6e 64 20 62 61 63 6b  ckslash and back
a350: 73 6c 61 73 68 65 73 20 69 6e 74 6f 20 6e 65 77  slashes into new
a360: 20 71 75 6f 74 65 64 20 62 6c 6f 63 6b 2e 0a 09   quoted block...
a370: 20 2a 2f 0a 0a 09 51 75 6f 74 65 43 6d 64 4c 69   */...QuoteCmdLi
a380: 6e 65 42 61 63 6b 73 6c 61 73 68 28 64 73 50 74  neBackslash(dsPt
a390: 72 2c 20 73 74 61 72 74 2c 20 2a 62 73 70 6f 73  r, start, *bspos
a3a0: 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74 20  , NULL);..start 
a3b0: 3d 20 2a 62 73 70 6f 73 3b 0a 20 20 20 20 7d 0a  = *bspos;.    }.
a3c0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 65  .    /*.     * e
a3d0: 73 63 61 70 65 20 61 6c 6c 20 73 70 65 63 69 61  scape all specia
a3e0: 6c 20 63 68 61 72 73 20 65 6e 63 6c 6f 73 65 64  l chars enclosed
a3f0: 20 69 6e 20 71 75 6f 74 65 73 20 6c 69 6b 65 20   in quotes like 
a400: 60 22 2e 2e 2e 22 60 2c 20 6e 6f 74 65 20 74 68  `"..."`, note th
a410: 61 74 0a 20 20 20 20 20 2a 20 68 65 72 65 20 77  at.     * here w
a420: 65 20 64 6f 6e 27 74 20 6d 75 73 74 20 65 73 63  e don't must esc
a430: 61 70 65 20 60 5c 60 20 28 77 69 74 68 20 60 5c  ape `\` (with `\
a440: 60 29 2c 20 62 65 63 61 75 73 65 20 69 74 27 73  `), because it's
a450: 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68 65 0a   outside of the.
a460: 20 20 20 20 20 2a 20 6d 61 69 6e 20 71 75 6f 74       * main quot
a470: 65 73 2c 20 73 6f 20 60 5c 60 20 72 65 6d 61 69  es, so `\` remai
a480: 6e 73 20 60 5c 60 2c 20 62 75 74 20 69 6d 70 6f  ns `\`, but impo
a490: 72 74 61 6e 74 20 2d 20 6e 6f 74 20 61 74 20 65  rtant - not at e
a4a0: 6e 64 20 6f 66 20 70 61 72 74 2c 0a 20 20 20 20  nd of part,.    
a4b0: 20 2a 20 62 65 63 61 75 73 65 20 72 65 73 75 6c   * because resul
a4c0: 74 73 20 61 73 20 62 65 66 6f 72 65 20 74 68 65  ts as before the
a4d0: 20 71 75 6f 74 65 2c 20 73 6f 20 60 25 5c 25 5c   quote, so `%\%\
a4e0: 60 20 73 68 6f 75 6c 64 20 62 65 20 65 73 63 61  ` should be esca
a4f0: 70 65 64 20 61 73 0a 20 20 20 20 20 2a 20 60 22  ped as.     * `"
a500: 25 5c 25 22 5c 5c 60 29 2e 0a 20 20 20 20 20 2a  %\%"\\`)..     *
a510: 2f 0a 0a 20 20 20 20 54 63 6c 44 53 74 72 69 6e  /..    TclDStrin
a520: 67 41 70 70 65 6e 64 4c 69 74 65 72 61 6c 28 64  gAppendLiteral(d
a530: 73 50 74 72 2c 20 22 5c 22 22 29 3b 20 2f 2a 20  sPtr, "\""); /* 
a540: 6f 70 65 6e 69 6e 67 20 65 73 63 61 70 65 20 71  opening escape q
a550: 75 6f 74 65 2d 63 68 61 72 20 2a 2f 0a 20 20 20  uote-char */.   
a560: 20 64 6f 20 7b 0a 09 2a 62 73 70 6f 73 20 3d 20   do {..*bspos = 
a570: 4e 55 4c 4c 3b 0a 09 73 70 65 63 69 61 6c 2b 2b  NULL;..special++
a580: 3b 0a 09 69 66 20 28 2a 73 70 65 63 69 61 6c 20  ;..if (*special 
a590: 3d 3d 20 27 5c 5c 27 29 20 7b 0a 09 20 20 20 20  == '\\') {..    
a5a0: 2f 2a 0a 09 20 20 20 20 20 2a 20 42 79 70 61 73  /*..     * Bypas
a5b0: 73 20 62 61 63 6b 73 6c 61 73 68 65 73 20 28 61  s backslashes (a
a5c0: 6e 64 20 6d 61 72 6b 20 66 69 72 73 74 20 62 61  nd mark first ba
a5d0: 63 6b 73 6c 61 73 68 20 70 6f 73 69 74 69 6f 6e  ckslash position
a5e0: 29 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  )...     */...  
a5f0: 20 20 73 70 65 63 69 61 6c 20 3d 20 42 75 69 6c    special = Buil
a600: 64 43 6d 64 4c 69 6e 65 42 79 70 61 73 73 42 53  dCmdLineBypassBS
a610: 28 73 70 65 63 69 61 6c 2c 20 62 73 70 6f 73 29  (special, bspos)
a620: 3b 0a 09 20 20 20 20 69 66 20 28 2a 73 70 65 63  ;..    if (*spec
a630: 69 61 6c 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09  ial == '\0') {..
a640: 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09  .break;..    }..
a650: 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2a  }.    } while (*
a660: 73 70 65 63 69 61 6c 20 26 26 20 73 74 72 63 68  special && strch
a670: 72 28 73 70 65 63 4d 65 74 61 43 68 61 72 73 2c  r(specMetaChars,
a680: 20 2a 73 70 65 63 69 61 6c 29 29 3b 0a 20 20 20   *special));.   
a690: 20 69 66 20 28 21 2a 62 73 70 6f 73 29 20 7b 0a   if (!*bspos) {.
a6a0: 09 2f 2a 0a 09 20 2a 20 55 6e 65 73 63 61 70 65  ./*.. * Unescape
a6b0: 64 20 72 65 73 74 20 62 65 66 6f 72 65 20 71 75  d rest before qu
a6c0: 6f 74 65 2e 0a 09 20 2a 2f 0a 0a 09 51 75 6f 74  ote... */...Quot
a6d0: 65 43 6d 64 4c 69 6e 65 42 61 63 6b 73 6c 61 73  eCmdLineBackslas
a6e0: 68 28 64 73 50 74 72 2c 20 73 74 61 72 74 2c 20  h(dsPtr, start, 
a6f0: 73 70 65 63 69 61 6c 2c 20 4e 55 4c 4c 29 3b 0a  special, NULL);.
a700: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a      } else {../*
a710: 0a 09 20 2a 20 55 6e 65 73 63 61 70 65 64 20 72  .. * Unescaped r
a720: 65 73 74 20 62 65 66 6f 72 65 20 66 69 72 73 74  est before first
a730: 20 62 61 63 6b 73 6c 61 73 68 20 28 72 61 74 68   backslash (rath
a740: 65 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 74 68  er belongs to th
a750: 65 20 6d 61 69 6e 0a 09 20 2a 20 62 6c 6f 63 6b  e main.. * block
a760: 29 2e 0a 09 20 2a 2f 0a 0a 09 51 75 6f 74 65 43  )... */...QuoteC
a770: 6d 64 4c 69 6e 65 42 61 63 6b 73 6c 61 73 68 28  mdLineBackslash(
a780: 64 73 50 74 72 2c 20 73 74 61 72 74 2c 20 2a 62  dsPtr, start, *b
a790: 73 70 6f 73 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  spos, NULL);.   
a7a0: 20 7d 0a 20 20 20 20 54 63 6c 44 53 74 72 69 6e   }.    TclDStrin
a7b0: 67 41 70 70 65 6e 64 4c 69 74 65 72 61 6c 28 64  gAppendLiteral(d
a7c0: 73 50 74 72 2c 20 22 5c 22 22 29 3b 20 2f 2a 20  sPtr, "\""); /* 
a7d0: 63 6c 6f 73 69 6e 67 20 65 73 63 61 70 65 20 71  closing escape q
a7e0: 75 6f 74 65 2d 63 68 61 72 20 2a 2f 0a 20 20 20  uote-char */.   
a7f0: 20 72 65 74 75 72 6e 20 73 70 65 63 69 61 6c 3b   return special;
a800: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a  .}..static void.
a810: 42 75 69 6c 64 43 6f 6d 6d 61 6e 64 4c 69 6e 65  BuildCommandLine
a820: 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
a830: 20 2a 65 78 65 63 75 74 61 62 6c 65 2c 09 2f 2a   *executable,./*
a840: 20 46 75 6c 6c 20 70 61 74 68 20 6f 66 20 65 78   Full path of ex
a850: 65 63 75 74 61 62 6c 65 20 28 69 6e 63 6c 75 64  ecutable (includ
a860: 69 6e 67 0a 09 09 09 09 20 2a 20 65 78 74 65 6e  ing..... * exten
a870: 73 69 6f 6e 29 2e 20 52 65 70 6c 61 63 65 6d 65  sion). Replaceme
a880: 6e 74 20 66 6f 72 20 61 72 67 76 5b 30 5d 2e 20  nt for argv[0]. 
a890: 2a 2f 0a 20 20 20 20 73 69 7a 65 5f 74 20 61 72  */.    size_t ar
a8a0: 67 63 2c 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f  gc,../* Number o
a8b0: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a  f arguments. */.
a8c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a8d0: 2a 61 72 67 76 2c 09 09 2f 2a 20 41 72 67 75 6d  *argv,../* Argum
a8e0: 65 6e 74 20 73 74 72 69 6e 67 73 20 69 6e 20 55  ent strings in U
a8f0: 54 46 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44  TF. */.    Tcl_D
a900: 53 74 72 69 6e 67 20 2a 6c 69 6e 65 50 74 72 29  String *linePtr)
a910: 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20  ./* Initialized 
a920: 54 63 6c 5f 44 53 74 72 69 6e 67 20 74 68 61 74  Tcl_DString that
a930: 20 72 65 63 65 69 76 65 73 20 74 68 65 0a 09 09   receives the...
a940: 09 09 20 2a 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  .. * command lin
a950: 65 20 28 57 43 48 41 52 29 2e 20 2a 2f 0a 7b 0a  e (WCHAR). */.{.
a960: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a970: 61 72 67 2c 20 2a 73 74 61 72 74 2c 20 2a 73 70  arg, *start, *sp
a980: 65 63 69 61 6c 2c 20 2a 62 73 70 6f 73 3b 0a 20  ecial, *bspos;. 
a990: 20 20 20 69 6e 74 20 71 75 6f 74 65 20 3d 20 30     int quote = 0
a9a0: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 69 3b 0a  ;.    size_t i;.
a9b0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
a9c0: 64 73 3b 0a 23 69 66 64 65 66 20 54 43 4c 5f 57  ds;.#ifdef TCL_W
a9d0: 49 4e 5f 50 49 50 45 5f 46 55 4c 4c 45 53 43 0a  IN_PIPE_FULLESC.
a9e0: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 65 73 63 61      /* full esca
a9f0: 70 65 20 69 6e 63 6c 75 73 69 76 65 20 25 2d 73  pe inclusive %-s
aa00: 75 62 73 74 20 61 76 6f 69 64 61 6e 63 65 20 2a  ubst avoidance *
aa10: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
aa20: 73 74 20 63 68 61 72 20 73 70 65 63 4d 65 74 61  st char specMeta
aa30: 43 68 61 72 73 5b 5d 20 3d 20 22 26 7c 5e 3c 3e  Chars[] = "&|^<>
aa40: 21 28 29 25 22 3b 0a 09 09 09 09 2f 2a 20 43 68  !()%";...../* Ch
aa50: 61 72 61 63 74 65 72 73 20 74 6f 20 65 6e 63 6c  aracters to encl
aa60: 6f 73 65 20 69 6e 20 71 75 6f 74 65 73 20 69 66  ose in quotes if
aa70: 20 75 6e 70 61 69 72 65 64 0a 09 09 09 09 20 2a   unpaired..... *
aa80: 20 71 75 6f 74 65 20 66 6c 61 67 20 73 65 74 2e   quote flag set.
aa90: 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
aaa0: 6f 6e 73 74 20 63 68 61 72 20 73 70 65 63 4d 65  onst char specMe
aab0: 74 61 43 68 61 72 73 32 5b 5d 20 3d 20 22 25 22  taChars2[] = "%"
aac0: 3b 0a 09 09 09 09 2f 2a 20 43 68 61 72 61 63 74  ;...../* Charact
aad0: 65 72 20 74 6f 20 65 6e 63 6c 6f 73 65 20 69 6e  er to enclose in
aae0: 20 71 75 6f 74 65 73 20 69 6e 20 61 6e 79 20 63   quotes in any c
aaf0: 61 73 65 0a 09 09 09 09 20 2a 20 28 72 65 67 61  ase..... * (rega
ab00: 72 64 6c 65 73 73 20 6f 66 20 75 6e 70 61 69 72  rdless of unpair
ab10: 65 64 2d 66 6c 61 67 29 2e 20 2a 2f 0a 23 65 6c  ed-flag). */.#el
ab20: 73 65 0a 20 20 20 20 2f 2a 20 65 73 63 61 70 65  se.    /* escape
ab30: 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 71 75 6f   considering quo
ab40: 74 61 74 69 6f 6e 20 6f 6e 6c 79 20 28 6e 6f 20  tation only (no 
ab50: 25 2d 73 75 62 73 74 20 61 76 6f 69 64 61 6e 63  %-subst avoidanc
ab60: 65 29 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  e) */.    static
ab70: 20 63 6f 6e 73 74 20 63 68 61 72 20 73 70 65 63   const char spec
ab80: 4d 65 74 61 43 68 61 72 73 5b 5d 20 3d 20 22 26  MetaChars[] = "&
ab90: 7c 5e 3c 3e 21 28 29 22 3b 0a 09 09 09 09 2f 2a  |^<>!()";...../*
aba0: 20 43 68 61 72 61 63 74 65 72 73 20 74 6f 20 65   Characters to e
abb0: 6e 63 6c 6f 73 65 20 69 6e 20 71 75 6f 74 65 73  nclose in quotes
abc0: 20 69 66 20 75 6e 70 61 69 72 65 64 0a 09 09 09   if unpaired....
abd0: 09 20 2a 20 71 75 6f 74 65 20 66 6c 61 67 20 73  . * quote flag s
abe0: 65 74 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  et. */.#endif.  
abf0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 51 75 6f 74    /*.     * Quot
ac00: 65 20 66 6c 61 67 73 3a 0a 20 20 20 20 20 2a 20  e flags:.     * 
ac10: 20 20 43 4c 5f 45 53 43 41 50 45 20 20 20 2d 20    CL_ESCAPE   - 
ac20: 65 73 63 61 70 65 20 61 72 67 75 6d 65 6e 74 3b  escape argument;
ac30: 0a 20 20 20 20 20 2a 20 20 20 43 4c 5f 51 55 4f  .     *   CL_QUO
ac40: 54 45 20 20 20 20 2d 20 65 6e 63 6c 6f 73 65 20  TE    - enclose 
ac50: 69 6e 20 71 75 6f 74 65 73 3b 0a 20 20 20 20 20  in quotes;.     
ac60: 2a 20 20 20 43 4c 5f 55 4e 50 41 49 52 45 44 20  *   CL_UNPAIRED 
ac70: 2d 20 70 72 65 76 69 6f 75 73 20 61 72 67 75 6d  - previous argum
ac80: 65 6e 74 73 20 63 68 61 69 6e 20 63 6f 6e 74 61  ents chain conta
ac90: 69 6e 73 20 75 6e 70 61 69 72 65 64 20 71 75 6f  ins unpaired quo
aca0: 74 65 2d 63 68 61 72 3b 0a 20 20 20 20 20 2a 2f  te-char;.     */
acb0: 0a 20 20 20 20 65 6e 75 6d 20 7b 43 4c 5f 45 53  .    enum {CL_ES
acc0: 43 41 50 45 20 3d 20 31 2c 20 43 4c 5f 51 55 4f  CAPE = 1, CL_QUO
acd0: 54 45 20 3d 20 32 2c 20 43 4c 5f 55 4e 50 41 49  TE = 2, CL_UNPAI
ace0: 52 45 44 20 3d 20 34 7d 3b 0a 0a 20 20 20 20 54  RED = 4};..    T
acf0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
ad00: 64 73 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ds);..    /*.   
ad10: 20 20 2a 20 50 72 69 6d 65 20 74 68 65 20 70 61    * Prime the pa
ad20: 74 68 2e 20 41 64 64 20 61 20 73 70 61 63 65 20  th. Add a space 
ad30: 73 65 70 61 72 61 74 6f 72 20 69 66 20 77 65 20  separator if we 
ad40: 77 65 72 65 20 70 72 69 6d 65 64 20 77 69 74 68  were primed with
ad50: 20 73 6f 6d 65 74 68 69 6e 67 2e 0a 20 20 20 20   something..    
ad60: 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 44 53 74 72   */..    TclDStr
ad70: 69 6e 67 41 70 70 65 6e 64 44 53 74 72 69 6e 67  ingAppendDString
ad80: 28 26 64 73 2c 20 6c 69 6e 65 50 74 72 29 3b 0a  (&ds, linePtr);.
ad90: 20 20 20 20 69 66 20 28 54 63 6c 5f 44 53 74 72      if (Tcl_DStr
ada0: 69 6e 67 4c 65 6e 67 74 68 28 6c 69 6e 65 50 74  ingLength(linePt
adb0: 72 29 20 3e 20 30 29 20 7b 0a 09 54 63 6c 44 53  r) > 0) {..TclDS
adc0: 74 72 69 6e 67 41 70 70 65 6e 64 4c 69 74 65 72  tringAppendLiter
add0: 61 6c 28 26 64 73 2c 20 22 20 22 29 3b 0a 20 20  al(&ds, " ");.  
ade0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 20    }..    for (i 
adf0: 3d 20 30 3b 20 69 20 3c 20 61 72 67 63 3b 20 69  = 0; i < argc; i
ae00: 2b 2b 29 20 7b 0a 09 69 66 20 28 69 20 3d 3d 20  ++) {..if (i == 
ae10: 30 29 20 7b 0a 09 20 20 20 20 61 72 67 20 3d 20  0) {..    arg = 
ae20: 65 78 65 63 75 74 61 62 6c 65 3b 0a 09 7d 20 65  executable;..} e
ae30: 6c 73 65 20 7b 0a 09 20 20 20 20 61 72 67 20 3d  lse {..    arg =
ae40: 20 61 72 67 76 5b 69 5d 3b 0a 09 20 20 20 20 54   argv[i];..    T
ae50: 63 6c 44 53 74 72 69 6e 67 41 70 70 65 6e 64 4c  clDStringAppendL
ae60: 69 74 65 72 61 6c 28 26 64 73 2c 20 22 20 22 29  iteral(&ds, " ")
ae70: 3b 0a 09 7d 0a 0a 09 71 75 6f 74 65 20 26 3d 20  ;..}...quote &= 
ae80: 7e 28 43 4c 5f 45 53 43 41 50 45 7c 43 4c 5f 51  ~(CL_ESCAPE|CL_Q
ae90: 55 4f 54 45 29 3b 20 2f 2a 20 72 65 73 65 74 20  UOTE); /* reset 
aea0: 65 73 63 61 70 65 20 66 6c 61 67 73 20 2a 2f 0a  escape flags */.
aeb0: 09 62 73 70 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09  .bspos = NULL;..
aec0: 69 66 20 28 61 72 67 5b 30 5d 20 3d 3d 20 27 5c  if (arg[0] == '\
aed0: 30 27 29 20 7b 0a 09 20 20 20 20 71 75 6f 74 65  0') {..    quote
aee0: 20 3d 20 43 4c 5f 51 55 4f 54 45 3b 0a 09 7d 20   = CL_QUOTE;..} 
aef0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 66 6f 72 20  else {..    for 
af00: 28 73 74 61 72 74 20 3d 20 61 72 67 3b 0a 09 09  (start = arg;...
af10: 20 20 20 20 2a 73 74 61 72 74 20 21 3d 20 27 5c      *start != '\
af20: 30 27 20 26 26 0a 09 09 09 28 71 75 6f 74 65 20  0' &&....(quote 
af30: 26 20 28 43 4c 5f 45 53 43 41 50 45 7c 43 4c 5f  & (CL_ESCAPE|CL_
af40: 51 55 4f 54 45 29 29 20 21 3d 20 28 43 4c 5f 45  QUOTE)) != (CL_E
af50: 53 43 41 50 45 7c 43 4c 5f 51 55 4f 54 45 29 3b  SCAPE|CL_QUOTE);
af60: 0a 09 09 20 20 20 20 73 74 61 72 74 2b 2b 29 20  ...    start++) 
af70: 7b 0a 09 09 69 66 20 28 2a 73 74 61 72 74 20 26  {...if (*start &
af80: 20 30 78 38 30 29 20 7b 0a 09 09 20 20 20 20 63   0x80) {...    c
af90: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 09 09 69  ontinue;...}...i
afa0: 66 20 28 54 63 6c 49 73 53 70 61 63 65 50 72 6f  f (TclIsSpacePro
afb0: 63 28 2a 73 74 61 72 74 29 29 20 7b 0a 09 09 20  c(*start)) {... 
afc0: 20 20 20 71 75 6f 74 65 20 7c 3d 20 43 4c 5f 51     quote |= CL_Q
afd0: 55 4f 54 45 3b 09 2f 2a 20 71 75 6f 74 65 20 6f  UOTE;./* quote o
afe0: 6e 6c 79 20 2a 2f 0a 09 09 20 20 20 20 69 66 20  nly */...    if 
aff0: 28 62 73 70 6f 73 29 20 7b 09 2f 2a 20 69 66 20  (bspos) {./* if 
b000: 62 61 63 6b 73 6c 61 73 68 20 66 6f 75 6e 64 2c  backslash found,
b010: 20 65 73 63 61 70 65 20 26 20 71 75 6f 74 65 20   escape & quote 
b020: 2a 2f 0a 09 09 09 71 75 6f 74 65 20 7c 3d 20 43  */....quote |= C
b030: 4c 5f 45 53 43 41 50 45 3b 0a 09 09 09 62 72 65  L_ESCAPE;....bre
b040: 61 6b 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20 20  ak;...    }...  
b050: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a    continue;...}.
b060: 09 09 69 66 20 28 73 74 72 63 68 72 28 73 70 65  ..if (strchr(spe
b070: 63 4d 65 74 61 43 68 61 72 73 2c 20 2a 73 74 61  cMetaChars, *sta
b080: 72 74 29 29 20 7b 0a 09 09 20 20 20 20 71 75 6f  rt)) {...    quo
b090: 74 65 20 7c 3d 20 28 43 4c 5f 45 53 43 41 50 45  te |= (CL_ESCAPE
b0a0: 7c 43 4c 5f 51 55 4f 54 45 29 3b 20 2f 2a 20 65  |CL_QUOTE); /* e
b0b0: 73 63 61 70 65 20 26 20 71 75 6f 74 65 20 2a 2f  scape & quote */
b0c0: 0a 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09  ...    break;...
b0d0: 7d 0a 09 09 69 66 20 28 2a 73 74 61 72 74 20 3d  }...if (*start =
b0e0: 3d 20 27 22 27 29 20 7b 0a 09 09 20 20 20 20 71  = '"') {...    q
b0f0: 75 6f 74 65 20 7c 3d 20 43 4c 5f 45 53 43 41 50  uote |= CL_ESCAP
b100: 45 3b 09 09 2f 2a 20 65 73 63 61 70 65 20 6f 6e  E;../* escape on
b110: 6c 79 20 2a 2f 0a 09 09 20 20 20 20 63 6f 6e 74  ly */...    cont
b120: 69 6e 75 65 3b 0a 09 09 7d 0a 09 09 69 66 20 28  inue;...}...if (
b130: 2a 73 74 61 72 74 20 3d 3d 20 27 5c 5c 27 29 20  *start == '\\') 
b140: 7b 0a 09 09 20 20 20 20 62 73 70 6f 73 20 3d 20  {...    bspos = 
b150: 73 74 61 72 74 3b 0a 09 09 20 20 20 20 69 66 20  start;...    if 
b160: 28 71 75 6f 74 65 20 26 20 43 4c 5f 51 55 4f 54  (quote & CL_QUOT
b170: 45 29 20 7b 09 2f 2a 20 69 66 20 71 75 6f 74 65  E) {./* if quote
b180: 2c 20 65 73 63 61 70 65 20 26 20 71 75 6f 74 65  , escape & quote
b190: 20 2a 2f 0a 09 09 09 71 75 6f 74 65 20 7c 3d 20   */....quote |= 
b1a0: 43 4c 5f 45 53 43 41 50 45 3b 0a 09 09 09 62 72  CL_ESCAPE;....br
b1b0: 65 61 6b 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20  eak;...    }... 
b1c0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d     continue;...}
b1d0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 73 70  ..    }..    bsp
b1e0: 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 69  os = NULL;..}..i
b1f0: 66 20 28 71 75 6f 74 65 20 26 20 43 4c 5f 51 55  f (quote & CL_QU
b200: 4f 54 45 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  OTE) {..    /*..
b210: 20 20 20 20 20 2a 20 53 74 61 72 74 20 6f 66 20       * Start of 
b220: 61 72 67 75 6d 65 6e 74 20 28 6d 61 69 6e 20 6f  argument (main o
b230: 70 65 6e 69 6e 67 20 71 75 6f 74 65 2d 63 68 61  pening quote-cha
b240: 72 29 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  r)...     */... 
b250: 20 20 20 54 63 6c 44 53 74 72 69 6e 67 41 70 70     TclDStringApp
b260: 65 6e 64 4c 69 74 65 72 61 6c 28 26 64 73 2c 20  endLiteral(&ds, 
b270: 22 5c 22 22 29 3b 0a 09 7d 0a 09 69 66 20 28 21  "\"");..}..if (!
b280: 28 71 75 6f 74 65 20 26 20 43 4c 5f 45 53 43 41  (quote & CL_ESCA
b290: 50 45 29 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09  PE)) {..    /*..
b2a0: 20 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 74       * Nothing t
b2b0: 6f 20 65 73 63 61 70 65 2e 0a 09 20 20 20 20 20  o escape...     
b2c0: 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  */...    Tcl_DSt
b2d0: 72 69 6e 67 41 70 70 65 6e 64 28 26 64 73 2c 20  ringAppend(&ds, 
b2e0: 61 72 67 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e  arg, TCL_INDEX_N
b2f0: 4f 4e 45 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  ONE);..} else {.
b300: 09 20 20 20 20 73 74 61 72 74 20 3d 20 61 72 67  .    start = arg
b310: 3b 0a 09 20 20 20 20 66 6f 72 20 28 73 70 65 63  ;..    for (spec
b320: 69 61 6c 20 3d 20 61 72 67 3b 20 2a 73 70 65 63  ial = arg; *spec
b330: 69 61 6c 20 21 3d 20 27 5c 30 27 3b 20 29 20 7b  ial != '\0'; ) {
b340: 0a 09 09 2f 2a 0a 09 09 20 2a 20 50 6f 73 69 74  .../*... * Posit
b350: 69 6f 6e 20 6f 66 20 60 5c 60 20 69 73 20 69 6d  ion of `\` is im
b360: 70 6f 72 74 61 6e 74 20 62 65 66 6f 72 65 20 71  portant before q
b370: 75 6f 74 65 20 6f 72 20 61 74 20 65 6e 64 20 28  uote or at end (
b380: 65 71 75 61 6c 0a 09 09 20 2a 20 60 5c 22 60 20  equal... * `\"` 
b390: 62 65 63 61 75 73 65 20 71 75 6f 74 65 64 29 2e  because quoted).
b3a0: 0a 09 09 20 2a 2f 0a 0a 09 09 69 66 20 28 2a 73  ... */....if (*s
b3b0: 70 65 63 69 61 6c 20 3d 3d 20 27 5c 5c 27 29 20  pecial == '\\') 
b3c0: 7b 0a 09 09 20 20 20 20 2f 2a 0a 09 09 20 20 20  {...    /*...   
b3d0: 20 20 2a 20 42 79 70 61 73 73 20 62 61 63 6b 73    * Bypass backs
b3e0: 6c 61 73 68 65 73 20 28 61 6e 64 20 6d 61 72 6b  lashes (and mark
b3f0: 20 66 69 72 73 74 20 62 61 63 6b 73 6c 61 73 68   first backslash
b400: 20 70 6f 73 69 74 69 6f 6e 29 0a 09 09 20 20 20   position)...   
b410: 20 20 2a 2f 0a 0a 09 09 20 20 20 20 73 70 65 63    */....    spec
b420: 69 61 6c 20 3d 20 42 75 69 6c 64 43 6d 64 4c 69  ial = BuildCmdLi
b430: 6e 65 42 79 70 61 73 73 42 53 28 73 70 65 63 69  neBypassBS(speci
b440: 61 6c 2c 20 26 62 73 70 6f 73 29 3b 0a 09 09 20  al, &bspos);... 
b450: 20 20 20 69 66 20 28 2a 73 70 65 63 69 61 6c 20     if (*special 
b460: 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09 62 72  == '\0') {....br
b470: 65 61 6b 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  eak;...    }...}
b480: 0a 09 09 2f 2a 20 5b 22 5d 20 2a 2f 0a 09 09 69  .../* ["] */...i
b490: 66 20 28 2a 73 70 65 63 69 61 6c 20 3d 3d 20 27  f (*special == '
b4a0: 22 27 29 20 7b 0a 09 09 20 20 20 20 2f 2a 0a 09  "') {...    /*..
b4b0: 09 20 20 20 20 20 2a 20 49 6e 76 65 72 74 20 74  .     * Invert t
b4c0: 68 65 20 75 6e 70 61 69 72 65 64 20 66 6c 61 67  he unpaired flag
b4d0: 20 2d 20 6f 62 73 65 72 76 65 20 75 6e 70 61 69   - observe unpai
b4e0: 72 65 64 20 71 75 6f 74 65 73 0a 09 09 20 20 20  red quotes...   
b4f0: 20 20 2a 2f 0a 0a 09 09 20 20 20 20 71 75 6f 74    */....    quot
b500: 65 20 5e 3d 20 43 4c 5f 55 4e 50 41 49 52 45 44  e ^= CL_UNPAIRED
b510: 3b 0a 0a 09 09 20 20 20 20 2f 2a 0a 09 09 20 20  ;....    /*...  
b520: 20 20 20 2a 20 41 64 64 20 70 61 72 74 20 62 65     * Add part be
b530: 66 6f 72 65 20 28 61 6e 64 20 65 73 63 61 70 65  fore (and escape
b540: 20 62 61 63 6b 73 6c 61 73 68 65 73 20 62 65 66   backslashes bef
b550: 6f 72 65 20 71 75 6f 74 65 29 2e 0a 09 09 20 20  ore quote)....  
b560: 20 20 20 2a 2f 0a 0a 09 09 20 20 20 20 51 75 6f     */....    Quo
b570: 74 65 43 6d 64 4c 69 6e 65 42 61 63 6b 73 6c 61  teCmdLineBacksla
b580: 73 68 28 26 64 73 2c 20 73 74 61 72 74 2c 20 73  sh(&ds, start, s
b590: 70 65 63 69 61 6c 2c 20 62 73 70 6f 73 29 3b 0a  pecial, bspos);.
b5a0: 09 09 20 20 20 20 62 73 70 6f 73 20 3d 20 4e 55  ..    bspos = NU
b5b0: 4c 4c 3b 0a 0a 09 09 20 20 20 20 2f 2a 0a 09 09  LL;....    /*...
b5c0: 20 20 20 20 20 2a 20 45 73 63 61 70 65 20 75 73       * Escape us
b5d0: 69 6e 67 20 62 61 63 6b 73 6c 61 73 68 0a 09 09  ing backslash...
b5e0: 20 20 20 20 20 2a 2f 0a 0a 09 09 20 20 20 20 54       */....    T
b5f0: 63 6c 44 53 74 72 69 6e 67 41 70 70 65 6e 64 4c  clDStringAppendL
b600: 69 74 65 72 61 6c 28 26 64 73 2c 20 22 5c 5c 5c  iteral(&ds, "\\\
b610: 22 22 29 3b 0a 09 09 20 20 20 20 73 74 61 72 74  "");...    start
b620: 20 3d 20 2b 2b 73 70 65 63 69 61 6c 3b 0a 09 09   = ++special;...
b630: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09      continue;...
b640: 7d 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 55 6e 70  }..../*... * Unp
b650: 61 69 72 65 64 20 28 65 73 63 61 70 65 64 29 20  aired (escaped) 
b660: 71 75 6f 74 65 20 63 61 75 73 65 73 20 73 70 65  quote causes spe
b670: 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 6f 6e  cial handling on
b680: 0a 09 09 20 2a 20 6d 65 74 61 2d 63 68 61 72 73  ... * meta-chars
b690: 0a 09 09 20 2a 2f 0a 0a 09 09 69 66 20 28 28 71  ... */....if ((q
b6a0: 75 6f 74 65 20 26 20 43 4c 5f 55 4e 50 41 49 52  uote & CL_UNPAIR
b6b0: 45 44 29 20 26 26 20 73 74 72 63 68 72 28 73 70  ED) && strchr(sp
b6c0: 65 63 4d 65 74 61 43 68 61 72 73 2c 20 2a 73 70  ecMetaChars, *sp
b6d0: 65 63 69 61 6c 29 29 20 7b 0a 09 09 20 20 20 20  ecial)) {...    
b6e0: 73 70 65 63 69 61 6c 20 3d 20 51 75 6f 74 65 43  special = QuoteC
b6f0: 6d 64 4c 69 6e 65 50 61 72 74 28 26 64 73 2c 20  mdLinePart(&ds, 
b700: 73 74 61 72 74 2c 20 73 70 65 63 69 61 6c 2c 0a  start, special,.
b710: 09 09 09 20 20 20 20 73 70 65 63 4d 65 74 61 43  ...    specMetaC
b720: 68 61 72 73 2c 20 26 62 73 70 6f 73 29 3b 0a 0a  hars, &bspos);..
b730: 09 09 20 20 20 20 2f 2a 0a 09 09 20 20 20 20 20  ..    /*...     
b740: 2a 20 53 74 61 72 74 20 74 6f 20 63 75 72 72 65  * Start to curre
b750: 6e 74 20 6f 72 20 66 69 72 73 74 20 62 61 63 6b  nt or first back
b760: 73 6c 61 73 68 0a 09 09 20 20 20 20 20 2a 2f 0a  slash...     */.
b770: 0a 09 09 20 20 20 20 73 74 61 72 74 20 3d 20 21  ...    start = !
b780: 62 73 70 6f 73 20 3f 20 73 70 65 63 69 61 6c 20  bspos ? special 
b790: 3a 20 62 73 70 6f 73 3b 0a 09 09 20 20 20 20 63  : bspos;...    c
b7a0: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 23 69 66  ontinue;...}.#if
b7b0: 64 65 66 20 54 43 4c 5f 57 49 4e 5f 50 49 50 45  def TCL_WIN_PIPE
b7c0: 5f 46 55 4c 4c 45 53 43 0a 09 09 2f 2a 0a 09 09  _FULLESC.../*...
b7d0: 20 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20   * Special case 
b7e0: 66 6f 72 20 25 20 2d 20 73 68 6f 75 6c 64 20 62  for % - should b
b7f0: 65 20 65 6e 63 6c 6f 73 65 64 20 61 6c 77 61 79  e enclosed alway
b800: 73 20 28 70 61 69 72 65 64 0a 09 09 20 2a 20 61  s (paired... * a
b810: 6c 73 6f 29 0a 09 09 20 2a 2f 0a 0a 09 09 69 66  lso)... */....if
b820: 20 28 73 74 72 63 68 72 28 73 70 65 63 4d 65 74   (strchr(specMet
b830: 61 43 68 61 72 73 32 2c 20 2a 73 70 65 63 69 61  aChars2, *specia
b840: 6c 29 29 20 7b 0a 09 09 20 20 20 20 73 70 65 63  l)) {...    spec
b850: 69 61 6c 20 3d 20 51 75 6f 74 65 43 6d 64 4c 69  ial = QuoteCmdLi
b860: 6e 65 50 61 72 74 28 26 64 73 2c 20 73 74 61 72  nePart(&ds, star
b870: 74 2c 20 73 70 65 63 69 61 6c 2c 0a 09 09 09 20  t, special,.... 
b880: 20 20 20 73 70 65 63 4d 65 74 61 43 68 61 72 73     specMetaChars
b890: 32 2c 20 26 62 73 70 6f 73 29 3b 0a 0a 09 09 20  2, &bspos);.... 
b8a0: 20 20 20 2f 2a 0a 09 09 20 20 20 20 20 2a 20 53     /*...     * S
b8b0: 74 61 72 74 20 74 6f 20 63 75 72 72 65 6e 74 20  tart to current 
b8c0: 6f 72 20 66 69 72 73 74 20 62 61 63 6b 73 6c 61  or first backsla
b8d0: 73 68 2e 0a 09 09 20 20 20 20 20 2a 2f 0a 0a 09  sh....     */...
b8e0: 09 20 20 20 20 73 74 61 72 74 20 3d 20 21 62 73  .    start = !bs
b8f0: 70 6f 73 20 3f 20 73 70 65 63 69 61 6c 20 3a 20  pos ? special : 
b900: 62 73 70 6f 73 3b 0a 09 09 20 20 20 20 63 6f 6e  bspos;...    con
b910: 74 69 6e 75 65 3b 0a 09 09 7d 0a 23 65 6e 64 69  tinue;...}.#endi
b920: 66 0a 0a 09 09 2f 2a 0a 09 09 20 2a 20 4f 74 68  f..../*... * Oth
b930: 65 72 20 6e 6f 74 20 73 70 65 63 69 61 6c 20 28  er not special (
b940: 61 6e 64 20 6e 6f 74 20 6d 65 74 61 29 20 63 68  and not meta) ch
b950: 61 72 61 63 74 65 72 0a 09 09 20 2a 2f 0a 0a 09  aracter... */...
b960: 09 62 73 70 6f 73 20 3d 20 4e 55 4c 4c 3b 09 09  .bspos = NULL;..
b970: 2f 2a 20 72 65 73 65 74 20 6c 61 73 74 20 62 61  /* reset last ba
b980: 63 6b 73 6c 61 73 68 20 70 6f 73 69 74 69 6f 6e  ckslash position
b990: 20 28 6e 6f 74 0a 09 09 09 09 09 20 2a 20 69 6e   (not...... * in
b9a0: 74 65 72 65 73 74 69 6e 67 29 20 2a 2f 0a 09 09  teresting) */...
b9b0: 73 70 65 63 69 61 6c 2b 2b 3b 0a 09 20 20 20 20  special++;..    
b9c0: 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20  }...    /*..    
b9d0: 20 2a 20 52 65 73 74 20 6f 66 20 61 72 67 75 6d   * Rest of argum
b9e0: 65 6e 74 20 28 61 6e 64 20 65 73 63 61 70 65 20  ent (and escape 
b9f0: 62 61 63 6b 73 6c 61 73 68 65 73 20 62 65 66 6f  backslashes befo
ba00: 72 65 20 63 6c 6f 73 69 6e 67 20 6d 61 69 6e 0a  re closing main.
ba10: 09 20 20 20 20 20 2a 20 71 75 6f 74 65 29 0a 09  .     * quote)..
ba20: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 51 75       */...    Qu
ba30: 6f 74 65 43 6d 64 4c 69 6e 65 42 61 63 6b 73 6c  oteCmdLineBacksl
ba40: 61 73 68 28 26 64 73 2c 20 73 74 61 72 74 2c 20  ash(&ds, start, 
ba50: 73 70 65 63 69 61 6c 2c 0a 09 09 20 20 20 20 28  special,...    (
ba60: 71 75 6f 74 65 20 26 20 43 4c 5f 51 55 4f 54 45  quote & CL_QUOTE
ba70: 29 20 3f 20 62 73 70 6f 73 20 3a 20 4e 55 4c 4c  ) ? bspos : NULL
ba80: 29 3b 0a 09 7d 0a 09 69 66 20 28 71 75 6f 74 65  );..}..if (quote
ba90: 20 26 20 43 4c 5f 51 55 4f 54 45 29 20 7b 0a 09   & CL_QUOTE) {..
baa0: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 45      /*..     * E
bab0: 6e 64 20 6f 66 20 61 72 67 75 6d 65 6e 74 20 28  nd of argument (
bac0: 6d 61 69 6e 20 63 6c 6f 73 69 6e 67 20 71 75 6f  main closing quo
bad0: 74 65 2d 63 68 61 72 29 0a 09 20 20 20 20 20 2a  te-char)..     *
bae0: 2f 0a 0a 09 20 20 20 20 54 63 6c 44 53 74 72 69  /...    TclDStri
baf0: 6e 67 41 70 70 65 6e 64 4c 69 74 65 72 61 6c 28  ngAppendLiteral(
bb00: 26 64 73 2c 20 22 5c 22 22 29 3b 0a 09 7d 0a 20  &ds, "\"");..}. 
bb10: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53 74     }.    Tcl_DSt
bb20: 72 69 6e 67 46 72 65 65 28 6c 69 6e 65 50 74 72  ringFree(linePtr
bb30: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
bb40: 6e 67 49 6e 69 74 28 6c 69 6e 65 50 74 72 29 3b  ngInit(linePtr);
bb50: 0a 20 20 20 20 54 63 6c 5f 55 74 66 54 6f 57 43  .    Tcl_UtfToWC
bb60: 68 61 72 44 53 74 72 69 6e 67 28 54 63 6c 5f 44  harDString(Tcl_D
bb70: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 73 29  StringValue(&ds)
bb80: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e  , Tcl_DStringLen
bb90: 67 74 68 28 26 64 73 29 2c 20 6c 69 6e 65 50 74  gth(&ds), linePt
bba0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
bbb0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 7d 0a  ingFree(&ds);.}.
bbc0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
bbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
bc10: 0a 20 2a 20 54 63 6c 70 43 72 65 61 74 65 43 6f  . * TclpCreateCo
bc20: 6d 6d 61 6e 64 43 68 61 6e 6e 65 6c 20 2d 2d 0a  mmandChannel --.
bc30: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74   *. *.This funct
bc40: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
bc50: 20 54 63 6c 5f 4f 70 65 6e 43 6f 6d 6d 61 6e 64   Tcl_OpenCommand
bc60: 43 68 61 6e 6e 65 6c 20 74 6f 20 70 65 72 66 6f  Channel to perfo
bc70: 72 6d 20 74 68 65 0a 20 2a 09 70 6c 61 74 66 6f  rm the. *.platfo
bc80: 72 6d 20 73 70 65 63 69 66 69 63 20 63 68 61 6e  rm specific chan
bc90: 6e 65 6c 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  nel initializati
bca0: 6f 6e 20 66 6f 72 20 61 20 63 6f 6d 6d 61 6e 64  on for a command
bcb0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20   channel.. *. * 
bcc0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75  Results:. *.Retu
bcd0: 72 6e 73 20 61 20 6e 65 77 20 63 68 61 6e 6e 65  rns a new channe
bce0: 6c 20 6f 72 20 4e 55 4c 4c 20 6f 6e 20 66 61 69  l or NULL on fai
bcf0: 6c 75 72 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  lure.. *. * Side
bd00: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 6c 6c   effects:. *.All
bd10: 6f 63 61 74 65 73 20 61 20 6e 65 77 20 63 68 61  ocates a new cha
bd20: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nnel.. *. *-----
bd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd70: 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 43 68 61 6e 6e  -. */..Tcl_Chann
bd80: 65 6c 0a 54 63 6c 70 43 72 65 61 74 65 43 6f 6d  el.TclpCreateCom
bd90: 6d 61 6e 64 43 68 61 6e 6e 65 6c 28 0a 20 20 20  mandChannel(.   
bda0: 20 54 63 6c 46 69 6c 65 20 72 65 61 64 46 69 6c   TclFile readFil
bdb0: 65 2c 09 09 2f 2a 20 49 66 20 6e 6f 6e 2d 6e 75  e,../* If non-nu
bdc0: 6c 6c 2c 20 67 69 76 65 73 20 74 68 65 20 66 69  ll, gives the fi
bdd0: 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20  le for reading. 
bde0: 2a 2f 0a 20 20 20 20 54 63 6c 46 69 6c 65 20 77  */.    TclFile w
bdf0: 72 69 74 65 46 69 6c 65 2c 09 09 2f 2a 20 49 66  riteFile,../* If
be00: 20 6e 6f 6e 2d 6e 75 6c 6c 2c 20 67 69 76 65 73   non-null, gives
be10: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
be20: 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 54 63  iting. */.    Tc
be30: 6c 46 69 6c 65 20 65 72 72 6f 72 46 69 6c 65 2c  lFile errorFile,
be40: 09 09 2f 2a 20 49 66 20 6e 6f 6e 2d 6e 75 6c 6c  ../* If non-null
be50: 2c 20 67 69 76 65 73 20 74 68 65 20 66 69 6c 65  , gives the file
be60: 20 77 68 65 72 65 20 65 72 72 6f 72 73 0a 09 09   where errors...
be70: 09 09 20 2a 20 63 61 6e 20 62 65 20 72 65 61 64  .. * can be read
be80: 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 5f 74 20  . */.    size_t 
be90: 6e 75 6d 50 69 64 73 2c 09 09 2f 2a 20 54 68 65  numPids,../* The
bea0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 69 64 73 20   number of pids 
beb0: 69 6e 20 74 68 65 20 70 69 64 20 61 72 72 61 79  in the pid array
bec0: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 50 69 64  . */.    Tcl_Pid
bed0: 20 2a 70 69 64 50 74 72 29 09 09 2f 2a 20 41 6e   *pidPtr)../* An
bee0: 20 61 72 72 61 79 20 6f 66 20 70 72 6f 63 65 73   array of proces
bef0: 73 20 69 64 65 6e 74 69 66 69 65 72 73 2e 20 2a  s identifiers. *
bf00: 2f 0a 7b 0a 20 20 20 20 63 68 61 72 20 63 68 61  /.{.    char cha
bf10: 6e 6e 65 6c 4e 61 6d 65 5b 31 36 20 2b 20 54 43  nnelName[16 + TC
bf20: 4c 5f 49 4e 54 45 47 45 52 5f 53 50 41 43 45 5d  L_INTEGER_SPACE]
bf30: 3b 0a 20 20 20 20 50 69 70 65 49 6e 66 6f 20 2a  ;.    PipeInfo *
bf40: 69 6e 66 6f 50 74 72 20 3d 20 28 50 69 70 65 49  infoPtr = (PipeI
bf50: 6e 66 6f 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  nfo *)Tcl_Alloc(
bf60: 73 69 7a 65 6f 66 28 50 69 70 65 49 6e 66 6f 29  sizeof(PipeInfo)
bf70: 29 3b 0a 0a 20 20 20 20 50 69 70 65 49 6e 69 74  );..    PipeInit
bf80: 28 29 3b 0a 0a 20 20 20 20 69 6e 66 6f 50 74 72  ();..    infoPtr
bf90: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 30 3b  ->watchMask = 0;
bfa0: 0a 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e 66 6c  .    infoPtr->fl
bfb0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 66  ags = 0;.    inf
bfc0: 6f 50 74 72 2d 3e 72 65 61 64 46 6c 61 67 73 20  oPtr->readFlags 
bfd0: 3d 20 30 3b 0a 20 20 20 20 69 6e 66 6f 50 74 72  = 0;.    infoPtr
bfe0: 2d 3e 72 65 61 64 46 69 6c 65 20 3d 20 72 65 61  ->readFile = rea
bff0: 64 46 69 6c 65 3b 0a 20 20 20 20 69 6e 66 6f 50  dFile;.    infoP
c000: 74 72 2d 3e 77 72 69 74 65 46 69 6c 65 20 3d 20  tr->writeFile = 
c010: 77 72 69 74 65 46 69 6c 65 3b 0a 20 20 20 20 69  writeFile;.    i
c020: 6e 66 6f 50 74 72 2d 3e 65 72 72 6f 72 46 69 6c  nfoPtr->errorFil
c030: 65 20 3d 20 65 72 72 6f 72 46 69 6c 65 3b 0a 20  e = errorFile;. 
c040: 20 20 20 69 6e 66 6f 50 74 72 2d 3e 6e 75 6d 50     infoPtr->numP
c050: 69 64 73 20 3d 20 6e 75 6d 50 69 64 73 3b 0a 20  ids = numPids;. 
c060: 20 20 20 69 6e 66 6f 50 74 72 2d 3e 70 69 64 50     infoPtr->pidP
c070: 74 72 20 3d 20 70 69 64 50 74 72 3b 0a 20 20 20  tr = pidPtr;.   
c080: 20 69 6e 66 6f 50 74 72 2d 3e 77 72 69 74 65 42   infoPtr->writeB
c090: 75 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 66 6f  uf = 0;.    info
c0a0: 50 74 72 2d 3e 77 72 69 74 65 42 75 66 4c 65 6e  Ptr->writeBufLen
c0b0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 66 6f 50 74   = 0;.    infoPt
c0c0: 72 2d 3e 77 72 69 74 65 45 72 72 6f 72 20 3d 20  r->writeError = 
c0d0: 30 3b 0a 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e  0;.    infoPtr->
c0e0: 63 68 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  channel = NULL;.
c0f0: 0a 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e 76 61  .    infoPtr->va
c100: 6c 69 64 4d 61 73 6b 20 3d 20 30 3b 0a 0a 20 20  lidMask = 0;..  
c110: 20 20 69 6e 66 6f 50 74 72 2d 3e 74 68 72 65 61    infoPtr->threa
c120: 64 49 64 20 3d 20 54 63 6c 5f 47 65 74 43 75 72  dId = Tcl_GetCur
c130: 72 65 6e 74 54 68 72 65 61 64 28 29 3b 0a 0a 20  rentThread();.. 
c140: 20 20 20 69 66 20 28 72 65 61 64 46 69 6c 65 20     if (readFile 
c150: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09  != NULL) {../*..
c160: 20 2a 20 53 74 61 72 74 20 74 68 65 20 62 61 63   * Start the bac
c170: 6b 67 72 6f 75 6e 64 20 72 65 61 64 65 72 20 74  kground reader t
c180: 68 72 65 61 64 2e 0a 09 20 2a 2f 0a 0a 09 69 6e  hread... */...in
c190: 66 6f 50 74 72 2d 3e 72 65 61 64 61 62 6c 65 20  foPtr->readable 
c1a0: 3d 20 43 72 65 61 74 65 45 76 65 6e 74 57 28 4e  = CreateEventW(N
c1b0: 55 4c 4c 2c 20 54 52 55 45 2c 20 54 52 55 45 2c  ULL, TRUE, TRUE,
c1c0: 20 4e 55 4c 4c 29 3b 0a 09 69 6e 66 6f 50 74 72   NULL);..infoPtr
c1d0: 2d 3e 72 65 61 64 54 68 72 65 61 64 20 3d 20 43  ->readThread = C
c1e0: 72 65 61 74 65 54 68 72 65 61 64 28 4e 55 4c 4c  reateThread(NULL
c1f0: 2c 20 32 35 36 2c 20 50 69 70 65 52 65 61 64 65  , 256, PipeReade
c200: 72 54 68 72 65 61 64 2c 0a 09 20 20 20 20 54 63  rThread,..    Tc
c210: 6c 50 69 70 65 54 68 72 65 61 64 43 72 65 61 74  lPipeThreadCreat
c220: 65 54 49 28 26 69 6e 66 6f 50 74 72 2d 3e 72 65  eTI(&infoPtr->re
c230: 61 64 54 49 2c 20 69 6e 66 6f 50 74 72 2c 20 69  adTI, infoPtr, i
c240: 6e 66 6f 50 74 72 2d 3e 72 65 61 64 61 62 6c 65  nfoPtr->readable
c250: 29 2c 0a 09 20 20 20 20 30 2c 20 4e 55 4c 4c 29  ),..    0, NULL)
c260: 3b 0a 09 53 65 74 54 68 72 65 61 64 50 72 69 6f  ;..SetThreadPrio
c270: 72 69 74 79 28 69 6e 66 6f 50 74 72 2d 3e 72 65  rity(infoPtr->re
c280: 61 64 54 68 72 65 61 64 2c 20 54 48 52 45 41 44  adThread, THREAD
c290: 5f 50 52 49 4f 52 49 54 59 5f 48 49 47 48 45 53  _PRIORITY_HIGHES
c2a0: 54 29 3b 0a 09 69 6e 66 6f 50 74 72 2d 3e 76 61  T);..infoPtr->va
c2b0: 6c 69 64 4d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52  lidMask |= TCL_R
c2c0: 45 41 44 41 42 4c 45 3b 0a 20 20 20 20 7d 20 65  EADABLE;.    } e
c2d0: 6c 73 65 20 7b 0a 09 69 6e 66 6f 50 74 72 2d 3e  lse {..infoPtr->
c2e0: 72 65 61 64 54 49 20 3d 20 4e 55 4c 4c 3b 0a 09  readTI = NULL;..
c2f0: 69 6e 66 6f 50 74 72 2d 3e 72 65 61 64 54 68 72  infoPtr->readThr
c300: 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ead = 0;.    }. 
c310: 20 20 20 69 66 20 28 77 72 69 74 65 46 69 6c 65     if (writeFile
c320: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a   != NULL) {../*.
c330: 09 20 2a 20 53 74 61 72 74 20 74 68 65 20 62 61  . * Start the ba
c340: 63 6b 67 72 6f 75 6e 64 20 77 72 69 74 65 72 20  ckground writer 
c350: 74 68 72 65 61 64 2e 0a 09 20 2a 2f 0a 0a 09 69  thread... */...i
c360: 6e 66 6f 50 74 72 2d 3e 77 72 69 74 61 62 6c 65  nfoPtr->writable
c370: 20 3d 20 43 72 65 61 74 65 45 76 65 6e 74 57 28   = CreateEventW(
c380: 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 54 52 55 45  NULL, TRUE, TRUE
c390: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 6e 66 6f 50 74  , NULL);..infoPt
c3a0: 72 2d 3e 77 72 69 74 65 54 68 72 65 61 64 20 3d  r->writeThread =
c3b0: 20 43 72 65 61 74 65 54 68 72 65 61 64 28 4e 55   CreateThread(NU
c3c0: 4c 4c 2c 20 32 35 36 2c 20 50 69 70 65 57 72 69  LL, 256, PipeWri
c3d0: 74 65 72 54 68 72 65 61 64 2c 0a 09 20 20 20 20  terThread,..    
c3e0: 54 63 6c 50 69 70 65 54 68 72 65 61 64 43 72 65  TclPipeThreadCre
c3f0: 61 74 65 54 49 28 26 69 6e 66 6f 50 74 72 2d 3e  ateTI(&infoPtr->
c400: 77 72 69 74 65 54 49 2c 20 69 6e 66 6f 50 74 72  writeTI, infoPtr
c410: 2c 20 69 6e 66 6f 50 74 72 2d 3e 77 72 69 74 61  , infoPtr->writa
c420: 62 6c 65 29 2c 0a 09 20 20 20 20 30 2c 20 4e 55  ble),..    0, NU
c430: 4c 4c 29 3b 0a 09 53 65 74 54 68 72 65 61 64 50  LL);..SetThreadP
c440: 72 69 6f 72 69 74 79 28 69 6e 66 6f 50 74 72 2d  riority(infoPtr-
c450: 3e 77 72 69 74 65 54 68 72 65 61 64 2c 20 54 48  >writeThread, TH
c460: 52 45 41 44 5f 50 52 49 4f 52 49 54 59 5f 48 49  READ_PRIORITY_HI
c470: 47 48 45 53 54 29 3b 0a 09 69 6e 66 6f 50 74 72  GHEST);..infoPtr
c480: 2d 3e 76 61 6c 69 64 4d 61 73 6b 20 7c 3d 20 54  ->validMask |= T
c490: 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20  CL_WRITABLE;.   
c4a0: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 6e 66 6f 50   } else {..infoP
c4b0: 74 72 2d 3e 77 72 69 74 65 54 49 20 3d 20 4e 55  tr->writeTI = NU
c4c0: 4c 4c 3b 0a 09 69 6e 66 6f 50 74 72 2d 3e 77 72  LL;..infoPtr->wr
c4d0: 69 74 65 54 68 72 65 61 64 20 3d 20 30 3b 0a 20  iteThread = 0;. 
c4e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
c4f0: 20 20 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64    * For backward
c500: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
c510: 69 74 68 20 70 72 65 76 69 6f 75 73 20 76 65 72  ith previous ver
c520: 73 69 6f 6e 73 20 6f 66 20 54 63 6c 2c 20 77 65  sions of Tcl, we
c530: 20 75 73 65 0a 20 20 20 20 20 2a 20 22 66 69 6c   use.     * "fil
c540: 65 25 64 22 20 61 73 20 74 68 65 20 62 61 73 65  e%d" as the base
c550: 20 6e 61 6d 65 20 66 6f 72 20 70 69 70 65 73 20   name for pipes 
c560: 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 77  even though it w
c570: 6f 75 6c 64 20 62 65 20 6d 6f 72 65 0a 20 20 20  ould be more.   
c580: 20 20 2a 20 6e 61 74 75 72 61 6c 20 74 6f 20 75    * natural to u
c590: 73 65 20 22 70 69 70 65 25 64 22 2e 20 55 73 65  se "pipe%d". Use
c5a0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
c5b0: 6b 65 65 70 20 74 68 65 20 63 68 61 6e 6e 65 6c  keep the channel
c5c0: 20 6e 61 6d 65 73 0a 20 20 20 20 20 2a 20 75 6e   names.     * un
c5d0: 69 71 75 65 2c 20 69 6e 20 63 61 73 65 20 63 68  ique, in case ch
c5e0: 61 6e 6e 65 6c 73 20 73 68 61 72 65 20 68 61 6e  annels share han
c5f0: 64 6c 65 73 20 28 73 74 64 69 6e 2f 73 74 64 6f  dles (stdin/stdo
c600: 75 74 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ut)..     */..  
c610: 20 20 54 63 6c 57 69 6e 47 65 6e 65 72 61 74 65    TclWinGenerate
c620: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
c630: 6e 65 6c 4e 61 6d 65 2c 20 22 66 69 6c 65 22 2c  nelName, "file",
c640: 20 69 6e 66 6f 50 74 72 29 3b 0a 20 20 20 20 69   infoPtr);.    i
c650: 6e 66 6f 50 74 72 2d 3e 63 68 61 6e 6e 65 6c 20  nfoPtr->channel 
c660: 3d 20 54 63 6c 5f 43 72 65 61 74 65 43 68 61 6e  = Tcl_CreateChan
c670: 6e 65 6c 28 26 70 69 70 65 43 68 61 6e 6e 65 6c  nel(&pipeChannel
c680: 54 79 70 65 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d  Type, channelNam
c690: 65 2c 0a 09 20 20 20 20 69 6e 66 6f 50 74 72 2c  e,..    infoPtr,
c6a0: 20 69 6e 66 6f 50 74 72 2d 3e 76 61 6c 69 64 4d   infoPtr->validM
c6b0: 61 73 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53  ask);..    Tcl_S
c6c0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
c6d0: 4e 55 4c 4c 2c 20 69 6e 66 6f 50 74 72 2d 3e 63  NULL, infoPtr->c
c6e0: 68 61 6e 6e 65 6c 2c 20 22 2d 74 72 61 6e 73 6c  hannel, "-transl
c6f0: 61 74 69 6f 6e 22 2c 20 22 61 75 74 6f 22 29 3b  ation", "auto");
c700: 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e 66 6f  .    return info
c710: 50 74 72 2d 3e 63 68 61 6e 6e 65 6c 3b 0a 7d 0a  Ptr->channel;.}.
c720: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
c730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
c770: 0a 20 2a 20 54 63 6c 5f 43 72 65 61 74 65 50 69  . * Tcl_CreatePi
c780: 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09 53 79 73 74  pe --. *. *.Syst
c790: 65 6d 20 64 65 70 65 6e 64 65 6e 74 20 69 6e 74  em dependent int
c7a0: 65 72 66 61 63 65 20 74 6f 20 63 72 65 61 74 65  erface to create
c7b0: 20 61 20 70 69 70 65 20 66 6f 72 20 74 68 65 20   a pipe for the 
c7c0: 5b 63 68 61 6e 20 70 69 70 65 5d 0a 20 2a 09 63  [chan pipe]. *.c
c7d0: 6f 6d 6d 61 6e 64 2e 20 53 74 6f 6c 65 6e 20 66  ommand. Stolen f
c7e0: 72 6f 6d 20 54 63 6c 58 2e 0a 20 2a 0a 20 2a 20  rom TclX.. *. * 
c7f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 43 4c 5f  Results:. *.TCL_
c800: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 2e  OK or TCL_ERROR.
c810: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
c820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
c860: 0a 0a 69 6e 74 0a 54 63 6c 5f 43 72 65 61 74 65  ..int.Tcl_Create
c870: 50 69 70 65 28 0a 20 20 20 20 54 63 6c 5f 49 6e  Pipe(.    Tcl_In
c880: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f  terp *interp,../
c890: 2a 20 45 72 72 6f 72 73 20 72 65 74 75 72 6e 65  * Errors returne
c8a0: 64 20 69 6e 20 72 65 73 75 6c 74 2e 2a 2f 0a 20  d in result.*/. 
c8b0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 2a     Tcl_Channel *
c8c0: 72 63 68 61 6e 2c 09 09 2f 2a 20 57 68 65 72 65  rchan,../* Where
c8d0: 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 72   to return the r
c8e0: 65 61 64 20 73 69 64 65 2e 20 2a 2f 0a 20 20 20  ead side. */.   
c8f0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 2a 77 63   Tcl_Channel *wc
c900: 68 61 6e 2c 09 09 2f 2a 20 57 68 65 72 65 20 74  han,../* Where t
c910: 6f 20 72 65 74 75 72 6e 20 74 68 65 20 77 72 69  o return the wri
c920: 74 65 20 73 69 64 65 2e 20 2a 2f 0a 20 20 20 20  te side. */.    
c930: 54 43 4c 5f 55 4e 55 53 45 44 28 69 6e 74 29 20  TCL_UNUSED(int) 
c940: 2f 2a 66 6c 61 67 73 2a 2f 29 09 2f 2a 20 52 65  /*flags*/)./* Re
c950: 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
c960: 65 20 75 73 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20  e use. */.{.    
c970: 48 41 4e 44 4c 45 20 72 65 61 64 48 61 6e 64 6c  HANDLE readHandl
c980: 65 2c 20 77 72 69 74 65 48 61 6e 64 6c 65 3b 0a  e, writeHandle;.
c990: 20 20 20 20 53 45 43 55 52 49 54 59 5f 41 54 54      SECURITY_ATT
c9a0: 52 49 42 55 54 45 53 20 73 65 63 3b 0a 0a 20 20  RIBUTES sec;..  
c9b0: 20 20 73 65 63 2e 6e 4c 65 6e 67 74 68 20 3d 20    sec.nLength = 
c9c0: 73 69 7a 65 6f 66 28 53 45 43 55 52 49 54 59 5f  sizeof(SECURITY_
c9d0: 41 54 54 52 49 42 55 54 45 53 29 3b 0a 20 20 20  ATTRIBUTES);.   
c9e0: 20 73 65 63 2e 6c 70 53 65 63 75 72 69 74 79 44   sec.lpSecurityD
c9f0: 65 73 63 72 69 70 74 6f 72 20 3d 20 4e 55 4c 4c  escriptor = NULL
ca00: 3b 0a 20 20 20 20 73 65 63 2e 62 49 6e 68 65 72  ;.    sec.bInher
ca10: 69 74 48 61 6e 64 6c 65 20 3d 20 46 41 4c 53 45  itHandle = FALSE
ca20: 3b 0a 0a 20 20 20 20 69 66 20 28 21 43 72 65 61  ;..    if (!Crea
ca30: 74 65 50 69 70 65 28 26 72 65 61 64 48 61 6e 64  tePipe(&readHand
ca40: 6c 65 2c 20 26 77 72 69 74 65 48 61 6e 64 6c 65  le, &writeHandle
ca50: 2c 20 26 73 65 63 2c 20 30 29 29 20 7b 0a 09 54  , &sec, 0)) {..T
ca60: 63 6c 5f 57 69 6e 43 6f 6e 76 65 72 74 45 72 72  cl_WinConvertErr
ca70: 6f 72 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  or(GetLastError(
ca80: 29 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52  ));..Tcl_SetObjR
ca90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
caa0: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 22  l_ObjPrintf(..."
cab0: 70 69 70 65 20 63 72 65 61 74 69 6f 6e 20 66 61  pipe creation fa
cac0: 69 6c 65 64 3a 20 25 73 22 2c 20 54 63 6c 5f 50  iled: %s", Tcl_P
cad0: 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70  osixError(interp
cae0: 29 29 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  )));..return TCL
caf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
cb00: 20 20 20 2a 72 63 68 61 6e 20 3d 20 54 63 6c 5f     *rchan = Tcl_
cb10: 4d 61 6b 65 46 69 6c 65 43 68 61 6e 6e 65 6c 28  MakeFileChannel(
cb20: 28 76 6f 69 64 20 2a 29 72 65 61 64 48 61 6e 64  (void *)readHand
cb30: 6c 65 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c 45  le, TCL_READABLE
cb40: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 67 69 73  );.    Tcl_Regis
cb50: 74 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  terChannel(inter
cb60: 70 2c 20 2a 72 63 68 61 6e 29 3b 0a 0a 20 20 20  p, *rchan);..   
cb70: 20 2a 77 63 68 61 6e 20 3d 20 54 63 6c 5f 4d 61   *wchan = Tcl_Ma
cb80: 6b 65 46 69 6c 65 43 68 61 6e 6e 65 6c 28 28 76  keFileChannel((v
cb90: 6f 69 64 20 2a 29 77 72 69 74 65 48 61 6e 64 6c  oid *)writeHandl
cba0: 65 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29  e, TCL_WRITABLE)
cbb0: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 67 69 73 74  ;.    Tcl_Regist
cbc0: 65 72 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  erChannel(interp
cbd0: 2c 20 2a 77 63 68 61 6e 29 3b 0a 0a 20 20 20 20  , *wchan);..    
cbe0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
cbf0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
cc40: 2a 0a 20 2a 20 54 63 6c 47 65 74 41 6e 64 44 65  *. * TclGetAndDe
cc50: 74 61 63 68 50 69 64 73 20 2d 2d 0a 20 2a 0a 20  tachPids --. *. 
cc60: 2a 09 53 74 6f 72 65 73 20 61 20 6c 69 73 74 20  *.Stores a list 
cc70: 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 50  of the command P
cc80: 49 44 73 20 66 6f 72 20 61 20 63 6f 6d 6d 61 6e  IDs for a comman
cc90: 64 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65  d channel in the
cca0: 0a 20 2a 09 69 6e 74 65 72 70 27 73 20 72 65 73  . *.interp's res
ccb0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ult.. *. * Resul
ccc0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
ccd0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
cce0: 0a 20 2a 09 4d 6f 64 69 66 69 65 73 20 74 68 65  . *.Modifies the
ccf0: 20 69 6e 74 65 72 70 27 73 20 72 65 73 75 6c 74   interp's result
cd00: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
cd50: 2f 0a 0a 76 6f 69 64 0a 54 63 6c 47 65 74 41 6e  /..void.TclGetAn
cd60: 64 44 65 74 61 63 68 50 69 64 73 28 0a 20 20 20  dDetachPids(.   
cd70: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
cd80: 65 72 70 2c 0a 20 20 20 20 54 63 6c 5f 43 68 61  erp,.    Tcl_Cha
cd90: 6e 6e 65 6c 20 63 68 61 6e 29 0a 7b 0a 20 20 20  nnel chan).{.   
cda0: 20 50 69 70 65 49 6e 66 6f 20 2a 70 69 70 65 50   PipeInfo *pipeP
cdb0: 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 54 63  tr;.    const Tc
cdc0: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a 63  l_ChannelType *c
cdd0: 68 61 6e 54 79 70 65 50 74 72 3b 0a 20 20 20 20  hanTypePtr;.    
cde0: 54 63 6c 5f 4f 62 6a 20 2a 70 69 64 73 4f 62 6a  Tcl_Obj *pidsObj
cdf0: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 69 3b 0a  ;.    size_t i;.
ce00: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 50  .    /*.     * P
ce10: 75 6e 74 20 69 66 20 74 68 65 20 63 68 61 6e 6e  unt if the chann
ce20: 65 6c 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 6d  el is not a comm
ce30: 61 6e 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 20 20  and channel..   
ce40: 20 20 2a 2f 0a 0a 20 20 20 20 63 68 61 6e 54 79    */..    chanTy
ce50: 70 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 43  pePtr = Tcl_GetC
ce60: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
ce70: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 54 79  ;.    if (chanTy
ce80: 70 65 50 74 72 20 21 3d 20 26 70 69 70 65 43 68  pePtr != &pipeCh
ce90: 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 09 72 65  annelType) {..re
cea0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  turn;.    }..   
ceb0: 20 70 69 70 65 50 74 72 20 3d 20 28 50 69 70 65   pipePtr = (Pipe
cec0: 49 6e 66 6f 20 2a 29 54 63 6c 5f 47 65 74 43 68  Info *)Tcl_GetCh
ced0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
cee0: 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 54 63 6c  a(chan);.    Tcl
cef0: 4e 65 77 4f 62 6a 28 70 69 64 73 4f 62 6a 29 3b  NewObj(pidsObj);
cf00: 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b  .    for (i = 0;
cf10: 20 69 20 3c 20 70 69 70 65 50 74 72 2d 3e 6e 75   i < pipePtr->nu
cf20: 6d 50 69 64 73 3b 20 69 2b 2b 29 20 7b 0a 09 54  mPids; i++) {..T
cf30: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
cf40: 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 70 69  Element(NULL, pi
cf50: 64 73 4f 62 6a 2c 0a 09 09 54 63 6c 5f 4e 65 77  dsObj,...Tcl_New
cf60: 57 69 64 65 49 6e 74 4f 62 6a 28 0a 09 09 09 54  WideIntObj(....T
cf70: 63 6c 70 47 65 74 50 69 64 28 70 69 70 65 50 74  clpGetPid(pipePt
cf80: 72 2d 3e 70 69 64 50 74 72 5b 69 5d 29 29 29 3b  r->pidPtr[i])));
cf90: 0a 09 54 63 6c 5f 44 65 74 61 63 68 50 69 64 73  ..Tcl_DetachPids
cfa0: 28 31 2c 20 26 70 69 70 65 50 74 72 2d 3e 70 69  (1, &pipePtr->pi
cfb0: 64 50 74 72 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  dPtr[i]);.    }.
cfc0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
cfd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 69 64  sult(interp, pid
cfe0: 73 4f 62 6a 29 3b 0a 20 20 20 20 69 66 20 28 70  sObj);.    if (p
cff0: 69 70 65 50 74 72 2d 3e 6e 75 6d 50 69 64 73 20  ipePtr->numPids 
d000: 3e 20 30 29 20 7b 0a 09 54 63 6c 5f 46 72 65 65  > 0) {..Tcl_Free
d010: 28 70 69 70 65 50 74 72 2d 3e 70 69 64 50 74 72  (pipePtr->pidPtr
d020: 29 3b 0a 09 70 69 70 65 50 74 72 2d 3e 6e 75 6d  );..pipePtr->num
d030: 50 69 64 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Pids = 0;.    }.
d040: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
d050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d090: 20 2a 0a 20 2a 20 50 69 70 65 42 6c 6f 63 6b 4d   *. * PipeBlockM
d0a0: 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  odeProc --. *. *
d0b0: 09 53 65 74 20 62 6c 6f 63 6b 69 6e 67 20 6f 72  .Set blocking or
d0c0: 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6d 6f   non-blocking mo
d0d0: 64 65 20 6f 6e 20 63 68 61 6e 6e 65 6c 2e 0a 20  de on channel.. 
d0e0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
d0f0: 09 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  .0 if successful
d100: 2c 20 65 72 72 6e 6f 20 77 68 65 6e 20 66 61 69  , errno when fai
d110: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  led.. *. * Side 
d120: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73  effects:. *.Sets
d130: 20 74 68 65 20 64 65 76 69 63 65 20 69 6e 74 6f   the device into
d140: 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e   blocking or non
d150: 2d 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  -blocking mode..
d160: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
d170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
d1b0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 69 70 65  .static int.Pipe
d1c0: 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 0a 20  BlockModeProc(. 
d1d0: 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63     void *instanc
d1e0: 65 44 61 74 61 2c 09 09 2f 2a 20 49 6e 73 74 61  eData,../* Insta
d1f0: 6e 63 65 20 64 61 74 61 20 66 6f 72 20 63 68 61  nce data for cha
d200: 6e 6e 65 6c 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  nnel. */.    int
d210: 20 6d 6f 64 65 29 09 09 09 2f 2a 20 54 43 4c 5f   mode).../* TCL_
d220: 4d 4f 44 45 5f 42 4c 4f 43 4b 49 4e 47 20 6f 72  MODE_BLOCKING or
d230: 0a 09 09 09 09 20 2a 20 54 43 4c 5f 4d 4f 44 45  ..... * TCL_MODE
d240: 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 2e 20 2a 2f  _NONBLOCKING. */
d250: 0a 7b 0a 20 20 20 20 50 69 70 65 49 6e 66 6f 20  .{.    PipeInfo 
d260: 2a 69 6e 66 6f 50 74 72 20 3d 20 28 50 69 70 65  *infoPtr = (Pipe
d270: 49 6e 66 6f 20 2a 29 20 69 6e 73 74 61 6e 63 65  Info *) instance
d280: 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  Data;..    /*.  
d290: 20 20 20 2a 20 50 69 70 65 73 20 6f 6e 20 57 69     * Pipes on Wi
d2a0: 6e 64 6f 77 73 20 63 61 6e 20 6e 6f 74 20 62 65  ndows can not be
d2b0: 20 73 77 69 74 63 68 65 64 20 62 65 74 77 65 65   switched betwee
d2c0: 6e 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e  n blocking and n
d2d0: 6f 6e 62 6c 6f 63 6b 69 6e 67 2c 0a 20 20 20 20  onblocking,.    
d2e0: 20 2a 20 68 65 6e 63 65 20 77 65 20 68 61 76 65   * hence we have
d2f0: 20 74 6f 20 65 6d 75 6c 61 74 65 20 74 68 65 20   to emulate the 
d300: 62 65 68 61 76 69 6f 72 2e 20 54 68 69 73 20 69  behavior. This i
d310: 73 20 64 6f 6e 65 20 69 6e 20 74 68 65 20 69 6e  s done in the in
d320: 70 75 74 0a 20 20 20 20 20 2a 20 66 75 6e 63 74  put.     * funct
d330: 69 6f 6e 20 62 79 20 63 68 65 63 6b 69 6e 67 20  ion by checking 
d340: 61 67 61 69 6e 73 74 20 61 20 62 69 74 20 69 6e  against a bit in
d350: 20 74 68 65 20 73 74 61 74 65 2e 20 57 65 20 73   the state. We s
d360: 65 74 20 6f 72 20 75 6e 73 65 74 20 74 68 65 0a  et or unset the.
d370: 20 20 20 20 20 2a 20 62 69 74 20 68 65 72 65 20       * bit here 
d380: 74 6f 20 63 61 75 73 65 20 74 68 65 20 69 6e 70  to cause the inp
d390: 75 74 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 65  ut function to e
d3a0: 6d 75 6c 61 74 65 20 74 68 65 20 63 6f 72 72 65  mulate the corre
d3b0: 63 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20  ct behavior..   
d3c0: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6d 6f    */..    if (mo
d3d0: 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e  de == TCL_MODE_N
d3e0: 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 69  ONBLOCKING) {..i
d3f0: 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  nfoPtr->flags |=
d400: 20 50 49 50 45 5f 41 53 59 4e 43 3b 0a 20 20 20   PIPE_ASYNC;.   
d410: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 6e 66 6f 50   } else {..infoP
d420: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 50  tr->flags &= ~(P
d430: 49 50 45 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20  IPE_ASYNC);.    
d440: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
d450: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d4a0: 20 2a 0a 20 2a 20 50 69 70 65 43 6c 6f 73 65 32   *. * PipeClose2
d4b0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6c  Proc --. *. *.Cl
d4c0: 6f 73 65 73 20 61 20 70 69 70 65 20 62 61 73 65  oses a pipe base
d4d0: 64 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  d IO channel.. *
d4e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
d4f0: 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 65 72  0 on success, er
d500: 72 6e 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 20  rno otherwise.. 
d510: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
d520: 73 3a 0a 20 2a 09 43 6c 6f 73 65 73 20 74 68 65  s:. *.Closes the
d530: 20 70 68 79 73 69 63 61 6c 20 63 68 61 6e 6e 65   physical channe
d540: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
d550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
d590: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 50  */..static int.P
d5a0: 69 70 65 43 6c 6f 73 65 32 50 72 6f 63 28 0a 20  ipeClose2Proc(. 
d5b0: 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63     void *instanc
d5c0: 65 44 61 74 61 2c 09 09 2f 2a 20 50 6f 69 6e 74  eData,../* Point
d5d0: 65 72 20 74 6f 20 50 69 70 65 49 6e 66 6f 20 73  er to PipeInfo s
d5e0: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20  tructure. */.   
d5f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
d600: 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72  erp,../* For err
d610: 6f 72 20 72 65 70 6f 72 74 69 6e 67 2e 20 2a 2f  or reporting. */
d620: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09  .    int flags).
d630: 09 09 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20  ../* Flags that 
d640: 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 73  indicate which s
d650: 69 64 65 20 74 6f 20 63 6c 6f 73 65 2e 20 2a 2f  ide to close. */
d660: 0a 7b 0a 20 20 20 20 50 69 70 65 49 6e 66 6f 20  .{.    PipeInfo 
d670: 2a 70 69 70 65 50 74 72 20 3d 20 28 50 69 70 65  *pipePtr = (Pipe
d680: 49 6e 66 6f 20 2a 29 20 69 6e 73 74 61 6e 63 65  Info *) instance
d690: 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68  Data;.    Tcl_Ch
d6a0: 61 6e 6e 65 6c 20 65 72 72 43 68 61 6e 3b 0a 20  annel errChan;. 
d6b0: 20 20 20 69 6e 74 20 65 72 72 6f 72 43 6f 64 65     int errorCode
d6c0: 2c 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 50 69  , result;.    Pi
d6d0: 70 65 49 6e 66 6f 20 2a 69 6e 66 6f 50 74 72 2c  peInfo *infoPtr,
d6e0: 20 2a 2a 6e 65 78 74 50 74 72 50 74 72 3b 0a 20   **nextPtrPtr;. 
d6f0: 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66 69     ThreadSpecifi
d700: 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20  cData *tsdPtr = 
d710: 54 43 4c 5f 54 53 44 5f 49 4e 49 54 28 26 64 61  TCL_TSD_INIT(&da
d720: 74 61 4b 65 79 29 3b 0a 20 20 20 20 69 6e 74 20  taKey);.    int 
d730: 69 6e 45 78 69 74 20 3d 20 28 54 63 6c 49 6e 45  inExit = (TclInE
d740: 78 69 74 28 29 20 7c 7c 20 54 63 6c 49 6e 54 68  xit() || TclInTh
d750: 72 65 61 64 45 78 69 74 28 29 29 3b 0a 0a 20 20  readExit());..  
d760: 20 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b    errorCode = 0;
d770: 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b  .    result = 0;
d780: 0a 0a 20 20 20 20 69 66 20 28 28 21 66 6c 61 67  ..    if ((!flag
d790: 73 20 7c 7c 20 66 6c 61 67 73 20 26 20 54 43 4c  s || flags & TCL
d7a0: 5f 43 4c 4f 53 45 5f 52 45 41 44 29 20 26 26 20  _CLOSE_READ) && 
d7b0: 28 70 69 70 65 50 74 72 2d 3e 72 65 61 64 46 69  (pipePtr->readFi
d7c0: 6c 65 20 21 3d 20 4e 55 4c 4c 29 29 20 7b 0a 09  le != NULL)) {..
d7d0: 2f 2a 0a 09 20 2a 20 43 6c 65 61 6e 20 75 70 20  /*.. * Clean up 
d7e0: 74 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74  the background t
d7f0: 68 72 65 61 64 20 69 66 20 6e 65 63 65 73 73 61  hread if necessa
d800: 72 79 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ry. Note that th
d810: 69 73 20 6d 75 73 74 20 62 65 0a 09 20 2a 20 64  is must be.. * d
d820: 6f 6e 65 20 62 65 66 6f 72 65 20 77 65 20 63 61  one before we ca
d830: 6e 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  n close the file
d840: 2c 20 73 69 6e 63 65 20 74 68 65 20 74 68 72 65  , since the thre
d850: 61 64 20 6d 61 79 20 62 65 20 62 6c 6f 63 6b 69  ad may be blocki
d860: 6e 67 0a 09 20 2a 20 74 72 79 69 6e 67 20 74 6f  ng.. * trying to
d870: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
d880: 69 70 65 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28  ipe... */...if (
d890: 70 69 70 65 50 74 72 2d 3e 72 65 61 64 54 68 72  pipePtr->readThr
d8a0: 65 61 64 29 20 7b 0a 0a 09 20 20 20 20 54 63 6c  ead) {...    Tcl
d8b0: 50 69 70 65 54 68 72 65 61 64 53 74 6f 70 28 26  PipeThreadStop(&
d8c0: 70 69 70 65 50 74 72 2d 3e 72 65 61 64 54 49 2c  pipePtr->readTI,
d8d0: 20 70 69 70 65 50 74 72 2d 3e 72 65 61 64 54 68   pipePtr->readTh
d8e0: 72 65 61 64 29 3b 0a 09 20 20 20 20 43 6c 6f 73  read);..    Clos
d8f0: 65 48 61 6e 64 6c 65 28 70 69 70 65 50 74 72 2d  eHandle(pipePtr-
d900: 3e 72 65 61 64 54 68 72 65 61 64 29 3b 0a 09 20  >readThread);.. 
d910: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70     CloseHandle(p
d920: 69 70 65 50 74 72 2d 3e 72 65 61 64 61 62 6c 65  ipePtr->readable
d930: 29 3b 0a 09 20 20 20 20 70 69 70 65 50 74 72 2d  );..    pipePtr-
d940: 3e 72 65 61 64 54 68 72 65 61 64 20 3d 20 4e 55  >readThread = NU
d950: 4c 4c 3b 0a 09 7d 0a 09 69 66 20 28 54 63 6c 70  LL;..}..if (Tclp
d960: 43 6c 6f 73 65 46 69 6c 65 28 70 69 70 65 50 74  CloseFile(pipePt
d970: 72 2d 3e 72 65 61 64 46 69 6c 65 29 20 21 3d 20  r->readFile) != 
d980: 30 29 20 7b 0a 09 20 20 20 20 65 72 72 6f 72 43  0) {..    errorC
d990: 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 09 7d 0a  ode = errno;..}.
d9a0: 09 70 69 70 65 50 74 72 2d 3e 76 61 6c 69 64 4d  .pipePtr->validM
d9b0: 61 73 6b 20 26 3d 20 7e 54 43 4c 5f 52 45 41 44  ask &= ~TCL_READ
d9c0: 41 42 4c 45 3b 0a 09 70 69 70 65 50 74 72 2d 3e  ABLE;..pipePtr->
d9d0: 72 65 61 64 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  readFile = NULL;
d9e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
d9f0: 21 66 6c 61 67 73 20 7c 7c 20 66 6c 61 67 73 20  !flags || flags 
da00: 26 20 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54  & TCL_CLOSE_WRIT
da10: 45 29 20 26 26 20 28 70 69 70 65 50 74 72 2d 3e  E) && (pipePtr->
da20: 77 72 69 74 65 46 69 6c 65 20 21 3d 20 4e 55 4c  writeFile != NUL
da30: 4c 29 29 20 7b 0a 09 69 66 20 28 70 69 70 65 50  L)) {..if (pipeP
da40: 74 72 2d 3e 77 72 69 74 65 54 68 72 65 61 64 29  tr->writeThread)
da50: 20 7b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20   {...    /*..   
da60: 20 20 2a 20 57 61 69 74 20 66 6f 72 20 74 68 65    * Wait for the
da70: 20 20 77 72 69 74 65 72 20 74 68 72 65 61 64 20    writer thread 
da80: 74 6f 20 66 69 6e 69 73 68 20 74 68 65 20 20 63  to finish the  c
da90: 75 72 72 65 6e 74 20 62 75 66 66 65 72 2c 20 74  urrent buffer, t
daa0: 68 65 6e 0a 09 20 20 20 20 20 2a 20 74 65 72 6d  hen..     * term
dab0: 69 6e 61 74 65 20 74 68 65 20 74 68 72 65 61 64  inate the thread
dac0: 20 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20    and close the 
dad0: 68 61 6e 64 6c 65 73 2e 20 49 66 20 20 74 68 65  handles. If  the
dae0: 20 63 68 61 6e 6e 65 6c 20 69 73 0a 09 20 20 20   channel is..   
daf0: 20 20 2a 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20    * nonblocking 
db00: 6f 72 20 6d 61 79 20 62 6c 6f 63 6b 20 64 75 72  or may block dur
db10: 69 6e 67 20 65 78 69 74 2c 20 62 61 69 6c 20 6f  ing exit, bail o
db20: 75 74 20 73 69 6e 63 65 20 74 68 65 20 77 6f 72  ut since the wor
db30: 6b 65 72 0a 09 20 20 20 20 20 2a 20 74 68 72 65  ker..     * thre
db40: 61 64 20 69 73 20 6e 6f 74 20 69 6e 74 65 72 72  ad is not interr
db50: 75 70 74 69 62 6c 65 20 61 6e 64 20 77 65 20 77  uptible and we w
db60: 61 6e 74 20 54 49 50 23 33 39 38 2d 66 61 73 74  ant TIP#398-fast
db70: 2d 65 78 69 74 2e 0a 09 20 20 20 20 20 2a 2f 0a  -exit...     */.
db80: 09 20 20 20 20 69 66 20 28 28 70 69 70 65 50 74  .    if ((pipePt
db90: 72 2d 3e 66 6c 61 67 73 20 26 20 50 49 50 45 5f  r->flags & PIPE_
dba0: 41 53 59 4e 43 29 20 26 26 20 69 6e 45 78 69 74  ASYNC) && inExit
dbb0: 29 20 7b 0a 0a 09 09 2f 2a 20 67 69 76 65 20 69  ) {..../* give i
dbc0: 74 20 61 20 63 68 61 6e 63 65 20 74 6f 20 6c 65  t a chance to le
dbd0: 61 76 65 20 68 6f 6e 6f 72 61 62 6c 79 20 2a 2f  ave honorably */
dbe0: 0a 09 09 54 63 6c 50 69 70 65 54 68 72 65 61 64  ...TclPipeThread
dbf0: 53 74 6f 70 53 69 67 6e 61 6c 28 26 70 69 70 65  StopSignal(&pipe
dc00: 50 74 72 2d 3e 77 72 69 74 65 54 49 2c 20 70 69  Ptr->writeTI, pi
dc10: 70 65 50 74 72 2d 3e 77 72 69 74 61 62 6c 65 29  pePtr->writable)
dc20: 3b 0a 0a 09 09 69 66 20 28 57 61 69 74 46 6f 72  ;....if (WaitFor
dc30: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 70 69 70  SingleObject(pip
dc40: 65 50 74 72 2d 3e 77 72 69 74 61 62 6c 65 2c 20  ePtr->writable, 
dc50: 32 30 29 20 3d 3d 20 57 41 49 54 5f 54 49 4d 45  20) == WAIT_TIME
dc60: 4f 55 54 29 20 7b 0a 09 09 20 20 20 20 72 65 74  OUT) {...    ret
dc70: 75 72 6e 20 45 57 4f 55 4c 44 42 4c 4f 43 4b 3b  urn EWOULDBLOCK;
dc80: 0a 09 09 7d 0a 0a 09 20 20 20 20 7d 20 65 6c 73  ...}...    } els
dc90: 65 20 7b 0a 0a 09 09 57 61 69 74 46 6f 72 53 69  e {....WaitForSi
dca0: 6e 67 6c 65 4f 62 6a 65 63 74 28 70 69 70 65 50  ngleObject(pipeP
dcb0: 74 72 2d 3e 77 72 69 74 61 62 6c 65 2c 20 69 6e  tr->writable, in
dcc0: 45 78 69 74 20 3f 20 35 30 30 30 20 3a 20 49 4e  Exit ? 5000 : IN
dcd0: 46 49 4e 49 54 45 29 3b 0a 0a 09 20 20 20 20 7d  FINITE);...    }
dce0: 0a 0a 09 20 20 20 20 54 63 6c 50 69 70 65 54 68  ...    TclPipeTh
dcf0: 72 65 61 64 53 74 6f 70 28 26 70 69 70 65 50 74  readStop(&pipePt
dd00: 72 2d 3e 77 72 69 74 65 54 49 2c 20 70 69 70 65  r->writeTI, pipe
dd10: 50 74 72 2d 3e 77 72 69 74 65 54 68 72 65 61 64  Ptr->writeThread
dd20: 29 3b 0a 0a 09 20 20 20 20 43 6c 6f 73 65 48 61  );...    CloseHa
dd30: 6e 64 6c 65 28 70 69 70 65 50 74 72 2d 3e 77 72  ndle(pipePtr->wr
dd40: 69 74 61 62 6c 65 29 3b 0a 09 20 20 20 20 43 6c  itable);..    Cl
dd50: 6f 73 65 48 61 6e 64 6c 65 28 70 69 70 65 50 74  oseHandle(pipePt
dd60: 72 2d 3e 77 72 69 74 65 54 68 72 65 61 64 29 3b  r->writeThread);
dd70: 0a 09 20 20 20 20 70 69 70 65 50 74 72 2d 3e 77  ..    pipePtr->w
dd80: 72 69 74 65 54 68 72 65 61 64 20 3d 20 4e 55 4c  riteThread = NUL
dd90: 4c 3b 0a 09 7d 0a 09 69 66 20 28 54 63 6c 70 43  L;..}..if (TclpC
dda0: 6c 6f 73 65 46 69 6c 65 28 70 69 70 65 50 74 72  loseFile(pipePtr
ddb0: 2d 3e 77 72 69 74 65 46 69 6c 65 29 20 21 3d 20  ->writeFile) != 
ddc0: 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 65 72  0) {..    if (er
ddd0: 72 6f 72 43 6f 64 65 20 3d 3d 20 30 29 20 7b 0a  rorCode == 0) {.
dde0: 09 09 65 72 72 6f 72 43 6f 64 65 20 3d 20 65 72  ..errorCode = er
ddf0: 72 6e 6f 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  rno;..    }..}..
de00: 70 69 70 65 50 74 72 2d 3e 76 61 6c 69 64 4d 61  pipePtr->validMa
de10: 73 6b 20 26 3d 20 7e 54 43 4c 5f 57 52 49 54 41  sk &= ~TCL_WRITA
de20: 42 4c 45 3b 0a 09 70 69 70 65 50 74 72 2d 3e 77  BLE;..pipePtr->w
de30: 72 69 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  riteFile = NULL;
de40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 69 70 65  .    }..    pipe
de50: 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 26  Ptr->watchMask &
de60: 3d 20 70 69 70 65 50 74 72 2d 3e 76 61 6c 69 64  = pipePtr->valid
de70: 4d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  Mask;..    /*.  
de80: 20 20 20 2a 20 44 6f 6e 27 74 20 66 72 65 65 20     * Don't free 
de90: 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 66 20 61  the channel if a
dea0: 6e 79 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20  ny of the flags 
deb0: 77 65 72 65 20 73 65 74 2e 0a 20 20 20 20 20 2a  were set..     *
dec0: 2f 0a 0a 20 20 20 20 69 66 20 28 66 6c 61 67 73  /..    if (flags
ded0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 65 72 72 6f  ) {..return erro
dee0: 72 43 6f 64 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  rCode;.    }..  
def0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 6d 6f    /*.     * Remo
df00: 76 65 20 74 68 65 20 66 69 6c 65 20 66 72 6f 6d  ve the file from
df10: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 77 61 74   the list of wat
df20: 63 68 65 64 20 66 69 6c 65 73 2e 0a 20 20 20 20  ched files..    
df30: 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 20 28 6e 65   */..    for (ne
df40: 78 74 50 74 72 50 74 72 20 3d 20 26 28 74 73 64  xtPtrPtr = &(tsd
df50: 50 74 72 2d 3e 66 69 72 73 74 50 69 70 65 50 74  Ptr->firstPipePt
df60: 72 29 2c 20 69 6e 66 6f 50 74 72 20 3d 20 2a 6e  r), infoPtr = *n
df70: 65 78 74 50 74 72 50 74 72 3b 0a 09 20 20 20 20  extPtrPtr;..    
df80: 69 6e 66 6f 50 74 72 20 21 3d 20 4e 55 4c 4c 3b  infoPtr != NULL;
df90: 0a 09 20 20 20 20 6e 65 78 74 50 74 72 50 74 72  ..    nextPtrPtr
dfa0: 20 3d 20 26 69 6e 66 6f 50 74 72 2d 3e 6e 65 78   = &infoPtr->nex
dfb0: 74 50 74 72 2c 20 69 6e 66 6f 50 74 72 20 3d 20  tPtr, infoPtr = 
dfc0: 2a 6e 65 78 74 50 74 72 50 74 72 29 20 7b 0a 09  *nextPtrPtr) {..
dfd0: 69 66 20 28 69 6e 66 6f 50 74 72 20 3d 3d 20 28  if (infoPtr == (
dfe0: 50 69 70 65 49 6e 66 6f 20 2a 29 70 69 70 65 50  PipeInfo *)pipeP
dff0: 74 72 29 20 7b 0a 09 20 20 20 20 2a 6e 65 78 74  tr) {..    *next
e000: 50 74 72 50 74 72 20 3d 20 69 6e 66 6f 50 74 72  PtrPtr = infoPtr
e010: 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 20 20 20 20  ->nextPtr;..    
e020: 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a  break;..}.    }.
e030: 0a 20 20 20 20 69 66 20 28 28 70 69 70 65 50 74  .    if ((pipePt
e040: 72 2d 3e 66 6c 61 67 73 20 26 20 50 49 50 45 5f  r->flags & PIPE_
e050: 41 53 59 4e 43 29 20 7c 7c 20 69 6e 45 78 69 74  ASYNC) || inExit
e060: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 74  ) {../*.. * If t
e070: 68 65 20 63 68 61 6e 6e 65 6c 20 69 73 20 6e 6f  he channel is no
e080: 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 54 63  n-blocking or Tc
e090: 6c 20 69 73 20 62 65 69 6e 67 20 63 6c 65 61 6e  l is being clean
e0a0: 65 64 20 75 70 2c 20 6a 75 73 74 0a 09 20 2a 20  ed up, just.. * 
e0b0: 64 65 74 61 63 68 20 74 68 65 20 63 68 69 6c 64  detach the child
e0c0: 72 65 6e 20 50 49 44 73 2c 20 72 65 61 70 20 74  ren PIDs, reap t
e0d0: 68 65 6d 20 28 69 6d 70 6f 72 74 61 6e 74 20 69  hem (important i
e0e0: 66 20 77 65 20 61 72 65 20 69 6e 20 61 0a 09 20  f we are in a.. 
e0f0: 2a 20 64 79 6e 61 6d 69 63 20 6c 6f 61 64 20 6d  * dynamic load m
e100: 6f 64 75 6c 65 29 2c 20 61 6e 64 20 64 69 73 63  odule), and disc
e110: 61 72 64 20 74 68 65 20 65 72 72 6f 72 46 69 6c  ard the errorFil
e120: 65 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 44 65  e... */...Tcl_De
e130: 74 61 63 68 50 69 64 73 28 70 69 70 65 50 74 72  tachPids(pipePtr
e140: 2d 3e 6e 75 6d 50 69 64 73 2c 20 70 69 70 65 50  ->numPids, pipeP
e150: 74 72 2d 3e 70 69 64 50 74 72 29 3b 0a 09 54 63  tr->pidPtr);..Tc
e160: 6c 5f 52 65 61 70 44 65 74 61 63 68 65 64 50 72  l_ReapDetachedPr
e170: 6f 63 73 28 29 3b 0a 0a 09 69 66 20 28 70 69 70  ocs();...if (pip
e180: 65 50 74 72 2d 3e 65 72 72 6f 72 46 69 6c 65 29  ePtr->errorFile)
e190: 20 7b 0a 09 20 20 20 20 69 66 20 28 54 63 6c 70   {..    if (Tclp
e1a0: 43 6c 6f 73 65 46 69 6c 65 28 70 69 70 65 50 74  CloseFile(pipePt
e1b0: 72 2d 3e 65 72 72 6f 72 46 69 6c 65 29 20 21 3d  r->errorFile) !=
e1c0: 20 30 29 20 7b 0a 09 09 69 66 20 28 65 72 72 6f   0) {...if (erro
e1d0: 72 43 6f 64 65 20 3d 3d 20 30 29 20 7b 0a 09 09  rCode == 0) {...
e1e0: 20 20 20 20 65 72 72 6f 72 43 6f 64 65 20 3d 20      errorCode = 
e1f0: 65 72 72 6e 6f 3b 0a 09 09 7d 0a 09 20 20 20 20  errno;...}..    
e200: 7d 0a 09 7d 0a 09 72 65 73 75 6c 74 20 3d 20 30  }..}..result = 0
e210: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
e220: 2f 2a 0a 09 20 2a 20 57 72 61 70 20 74 68 65 20  /*.. * Wrap the 
e230: 65 72 72 6f 72 20 66 69 6c 65 20 69 6e 74 6f 20  error file into 
e240: 61 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 67 69  a channel and gi
e250: 76 65 20 69 74 20 74 6f 20 74 68 65 20 63 6c 65  ve it to the cle
e260: 61 6e 75 70 0a 09 20 2a 20 72 6f 75 74 69 6e 65  anup.. * routine
e270: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 70 69 70  ... */...if (pip
e280: 65 50 74 72 2d 3e 65 72 72 6f 72 46 69 6c 65 29  ePtr->errorFile)
e290: 20 7b 0a 09 20 20 20 20 57 69 6e 46 69 6c 65 20   {..    WinFile 
e2a0: 2a 66 69 6c 65 50 74 72 20 3d 20 28 57 69 6e 46  *filePtr = (WinF
e2b0: 69 6c 65 20 2a 29 20 70 69 70 65 50 74 72 2d 3e  ile *) pipePtr->
e2c0: 65 72 72 6f 72 46 69 6c 65 3b 0a 0a 09 20 20 20  errorFile;...   
e2d0: 20 65 72 72 43 68 61 6e 20 3d 20 54 63 6c 5f 4d   errChan = Tcl_M
e2e0: 61 6b 65 46 69 6c 65 43 68 61 6e 6e 65 6c 28 28  akeFileChannel((
e2f0: 76 6f 69 64 20 2a 29 66 69 6c 65 50 74 72 2d 3e  void *)filePtr->
e300: 68 61 6e 64 6c 65 2c 0a 09 09 20 20 20 20 54 43  handle,...    TC
e310: 4c 5f 52 45 41 44 41 42 4c 45 29 3b 0a 09 20 20  L_READABLE);..  
e320: 20 20 54 63 6c 5f 46 72 65 65 28 66 69 6c 65 50    Tcl_Free(fileP
e330: 74 72 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  tr);..    Tcl_Se
e340: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 4e  tChannelOption(N
e350: 55 4c 4c 2c 20 65 72 72 43 68 61 6e 2c 20 22 2d  ULL, errChan, "-
e360: 70 72 6f 66 69 6c 65 22 2c 20 22 72 65 70 6c 61  profile", "repla
e370: 63 65 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  ce");..} else {.
e380: 09 20 20 20 20 65 72 72 43 68 61 6e 20 3d 20 4e  .    errChan = N
e390: 55 4c 4c 3b 0a 09 7d 0a 0a 09 72 65 73 75 6c 74  ULL;..}...result
e3a0: 20 3d 20 54 63 6c 43 6c 65 61 6e 75 70 43 68 69   = TclCleanupChi
e3b0: 6c 64 72 65 6e 28 69 6e 74 65 72 70 2c 20 70 69  ldren(interp, pi
e3c0: 70 65 50 74 72 2d 3e 6e 75 6d 50 69 64 73 2c 0a  pePtr->numPids,.
e3d0: 09 09 70 69 70 65 50 74 72 2d 3e 70 69 64 50 74  ..pipePtr->pidPt
e3e0: 72 2c 20 65 72 72 43 68 61 6e 29 3b 0a 20 20 20  r, errChan);.   
e3f0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 70 69 70 65   }..    if (pipe
e400: 50 74 72 2d 3e 6e 75 6d 50 69 64 73 20 3e 20 30  Ptr->numPids > 0
e410: 29 20 7b 0a 09 54 63 6c 5f 46 72 65 65 28 70 69  ) {..Tcl_Free(pi
e420: 70 65 50 74 72 2d 3e 70 69 64 50 74 72 29 3b 0a  pePtr->pidPtr);.
e430: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 70      }..    if (p
e440: 69 70 65 50 74 72 2d 3e 77 72 69 74 65 42 75 66  ipePtr->writeBuf
e450: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
e460: 5f 46 72 65 65 28 70 69 70 65 50 74 72 2d 3e 77  _Free(pipePtr->w
e470: 72 69 74 65 42 75 66 29 3b 0a 20 20 20 20 7d 0a  riteBuf);.    }.
e480: 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 69  .    Tcl_Free(pi
e490: 70 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20  pePtr);..    if 
e4a0: 28 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 30 29  (errorCode == 0)
e4b0: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 75 6c   {..return resul
e4c0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  t;.    }.    ret
e4d0: 75 72 6e 20 65 72 72 6f 72 43 6f 64 65 3b 0a 7d  urn errorCode;.}
e4e0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
e4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
e530: 2a 0a 20 2a 20 50 69 70 65 49 6e 70 75 74 50 72  *. * PipeInputPr
e540: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 61 64  oc --. *. *.Read
e550: 73 20 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65  s input from the
e560: 20 49 4f 20 63 68 61 6e 6e 65 6c 20 69 6e 74 6f   IO channel into
e570: 20 74 68 65 20 62 75 66 66 65 72 20 67 69 76 65   the buffer give
e580: 6e 2e 20 52 65 74 75 72 6e 73 20 63 6f 75 6e 74  n. Returns count
e590: 0a 20 2a 09 6f 66 20 68 6f 77 20 6d 61 6e 79 20  . *.of how many 
e5a0: 62 79 74 65 73 20 77 65 72 65 20 61 63 74 75 61  bytes were actua
e5b0: 6c 6c 79 20 72 65 61 64 2c 20 61 6e 64 20 61 6e  lly read, and an
e5c0: 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 69 6f   error indicatio
e5d0: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  n.. *. * Results
e5e0: 3a 0a 20 2a 09 41 20 63 6f 75 6e 74 20 6f 66 20  :. *.A count of 
e5f0: 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 77  how many bytes w
e600: 65 72 65 20 72 65 61 64 20 69 73 20 72 65 74 75  ere read is retu
e610: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
e620: 72 0a 20 2a 09 69 6e 64 69 63 61 74 69 6f 6e 20  r. *.indication 
e630: 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 61  is returned in a
e640: 6e 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e  n output argumen
e650: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
e660: 66 65 63 74 73 3a 0a 20 2a 09 52 65 61 64 73 20  fects:. *.Reads 
e670: 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 61  input from the a
e680: 63 74 75 61 6c 20 63 68 61 6e 6e 65 6c 2e 0a 20  ctual channel.. 
e690: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
e6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
e6e0: 73 74 61 74 69 63 20 69 6e 74 0a 50 69 70 65 49  static int.PipeI
e6f0: 6e 70 75 74 50 72 6f 63 28 0a 20 20 20 20 76 6f  nputProc(.    vo
e700: 69 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61  id *instanceData
e710: 2c 09 09 2f 2a 20 50 69 70 65 20 73 74 61 74 65  ,../* Pipe state
e720: 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 62  . */.    char *b
e730: 75 66 2c 09 09 09 2f 2a 20 57 68 65 72 65 20 74  uf,.../* Where t
e740: 6f 20 73 74 6f 72 65 20 64 61 74 61 20 72 65 61  o store data rea
e750: 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 75  d. */.    int bu
e760: 66 53 69 7a 65 2c 09 09 2f 2a 20 48 6f 77 20 6d  fSize,../* How m
e770: 75 63 68 20 73 70 61 63 65 20 69 73 20 61 76 61  uch space is ava
e780: 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a 09 09  ilable in the...
e790: 09 09 20 2a 20 62 75 66 66 65 72 3f 20 2a 2f 0a  .. * buffer? */.
e7a0: 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f      int *errorCo
e7b0: 64 65 29 09 09 2f 2a 20 57 68 65 72 65 20 74 6f  de)../* Where to
e7c0: 20 73 74 6f 72 65 20 65 72 72 6f 72 20 63 6f 64   store error cod
e7d0: 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 50 69 70 65  e. */.{.    Pipe
e7e0: 49 6e 66 6f 20 2a 69 6e 66 6f 50 74 72 20 3d 20  Info *infoPtr = 
e7f0: 28 50 69 70 65 49 6e 66 6f 20 2a 29 20 69 6e 73  (PipeInfo *) ins
e800: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 57  tanceData;.    W
e810: 69 6e 46 69 6c 65 20 2a 66 69 6c 65 50 74 72 20  inFile *filePtr 
e820: 3d 20 28 57 69 6e 46 69 6c 65 2a 29 20 69 6e 66  = (WinFile*) inf
e830: 6f 50 74 72 2d 3e 72 65 61 64 46 69 6c 65 3b 0a  oPtr->readFile;.
e840: 20 20 20 20 44 57 4f 52 44 20 63 6f 75 6e 74 2c      DWORD count,
e850: 20 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b 0a   bytesRead = 0;.
e860: 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a      int result;.
e870: 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 20  .    *errorCode 
e880: 3d 20 30 3b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  = 0;.    /*.    
e890: 20 2a 20 53 79 6e 63 68 72 6f 6e 69 7a 65 20 77   * Synchronize w
e8a0: 69 74 68 20 74 68 65 20 72 65 61 64 65 72 20 74  ith the reader t
e8b0: 68 72 65 61 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a  hread..     */..
e8c0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 57 61 69      result = Wai
e8d0: 74 46 6f 72 52 65 61 64 28 69 6e 66 6f 50 74 72  tForRead(infoPtr
e8e0: 2c 20 28 69 6e 66 6f 50 74 72 2d 3e 66 6c 61 67  , (infoPtr->flag
e8f0: 73 20 26 20 50 49 50 45 5f 41 53 59 4e 43 29 20  s & PIPE_ASYNC) 
e900: 3f 20 30 20 3a 20 31 29 3b 0a 0a 20 20 20 20 2f  ? 0 : 1);..    /
e910: 2a 0a 20 20 20 20 20 2a 20 49 66 20 61 6e 20 65  *.     * If an e
e920: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 72  rror occurred, r
e930: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
e940: 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  y..     */..    
e950: 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 2d 31  if (result == -1
e960: 29 20 7b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 20  ) {..*errorCode 
e970: 3d 20 65 72 72 6e 6f 3b 0a 09 72 65 74 75 72 6e  = errno;..return
e980: 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
e990: 69 66 20 28 69 6e 66 6f 50 74 72 2d 3e 72 65 61  if (infoPtr->rea
e9a0: 64 46 6c 61 67 73 20 26 20 50 49 50 45 5f 45 58  dFlags & PIPE_EX
e9b0: 54 52 41 42 59 54 45 29 20 7b 0a 09 2f 2a 0a 09  TRABYTE) {../*..
e9c0: 20 2a 20 54 68 65 20 72 65 61 64 65 72 20 74 68   * The reader th
e9d0: 72 65 61 64 20 63 6f 6e 73 75 6d 65 64 20 31 20  read consumed 1 
e9e0: 62 79 74 65 20 61 73 20 61 20 73 69 64 65 20 65  byte as a side e
e9f0: 66 66 65 63 74 20 6f 66 20 77 61 69 74 69 6e 67  ffect of waiting
ea00: 20 73 6f 20 77 65 0a 09 20 2a 20 6e 65 65 64 20   so we.. * need 
ea10: 74 6f 20 6d 6f 76 65 20 69 74 20 69 6e 74 6f 20  to move it into 
ea20: 74 68 65 20 62 75 66 66 65 72 2e 0a 09 20 2a 2f  the buffer... */
ea30: 0a 0a 09 2a 62 75 66 20 3d 20 69 6e 66 6f 50 74  ...*buf = infoPt
ea40: 72 2d 3e 65 78 74 72 61 42 79 74 65 3b 0a 09 69  r->extraByte;..i
ea50: 6e 66 6f 50 74 72 2d 3e 72 65 61 64 46 6c 61 67  nfoPtr->readFlag
ea60: 73 20 26 3d 20 7e 50 49 50 45 5f 45 58 54 52 41  s &= ~PIPE_EXTRA
ea70: 42 59 54 45 3b 0a 09 62 75 66 2b 2b 3b 0a 09 62  BYTE;..buf++;..b
ea80: 75 66 53 69 7a 65 2d 2d 3b 0a 09 62 79 74 65 73  ufSize--;..bytes
ea90: 52 65 61 64 20 3d 20 31 3b 0a 0a 09 2f 2a 0a 09  Read = 1;.../*..
eaa0: 20 2a 20 49 66 20 66 75 72 74 68 65 72 20 72 65   * If further re
eab0: 61 64 20 61 74 74 65 6d 70 74 73 20 77 6f 75 6c  ad attempts woul
eac0: 64 20 62 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  d block, return 
ead0: 77 68 61 74 20 77 65 20 68 61 76 65 2e 0a 09 20  what we have... 
eae0: 2a 2f 0a 0a 09 69 66 20 28 72 65 73 75 6c 74 20  */...if (result 
eaf0: 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 72 65 74  == 0) {..    ret
eb00: 75 72 6e 20 62 79 74 65 73 52 65 61 64 3b 0a 09  urn bytesRead;..
eb10: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  }.    }..    /*.
eb20: 20 20 20 20 20 2a 20 41 74 74 65 6d 70 74 20 74       * Attempt t
eb30: 6f 20 72 65 61 64 20 62 75 66 53 69 7a 65 20 62  o read bufSize b
eb40: 79 74 65 73 2e 20 54 68 65 20 72 65 61 64 20 77  ytes. The read w
eb50: 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  ill return immed
eb60: 69 61 74 65 6c 79 20 69 66 0a 20 20 20 20 20 2a  iately if.     *
eb70: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 64 61   there is any da
eb80: 74 61 20 61 76 61 69 6c 61 62 6c 65 2e 20 4f 74  ta available. Ot
eb90: 68 65 72 77 69 73 65 20 69 74 20 77 69 6c 6c 20  herwise it will 
eba0: 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 61 74 20 6c  block until at l
ebb0: 65 61 73 74 20 6f 6e 65 0a 20 20 20 20 20 2a 20  east one.     * 
ebc0: 62 79 74 65 20 69 73 20 61 76 61 69 6c 61 62 6c  byte is availabl
ebd0: 65 20 6f 72 20 61 6e 20 45 4f 46 20 6f 63 63 75  e or an EOF occu
ebe0: 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  rs..     */..   
ebf0: 20 69 66 20 28 52 65 61 64 46 69 6c 65 28 66 69   if (ReadFile(fi
ec00: 6c 65 50 74 72 2d 3e 68 61 6e 64 6c 65 2c 20 28  lePtr->handle, (
ec10: 4c 50 56 4f 49 44 29 20 62 75 66 2c 20 28 44 57  LPVOID) buf, (DW
ec20: 4f 52 44 29 20 62 75 66 53 69 7a 65 2c 20 26 63  ORD) bufSize, &c
ec30: 6f 75 6e 74 2c 0a 09 20 20 20 20 28 4c 50 4f 56  ount,..    (LPOV
ec40: 45 52 4c 41 50 50 45 44 29 20 4e 55 4c 4c 29 20  ERLAPPED) NULL) 
ec50: 3d 3d 20 54 52 55 45 29 20 7b 0a 09 72 65 74 75  == TRUE) {..retu
ec60: 72 6e 20 62 79 74 65 73 52 65 61 64 20 2b 20 63  rn bytesRead + c
ec70: 6f 75 6e 74 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ount;.    } else
ec80: 20 69 66 20 28 62 79 74 65 73 52 65 61 64 29 20   if (bytesRead) 
ec90: 7b 0a 09 2f 2a 0a 09 20 2a 20 49 67 6e 6f 72 65  {../*.. * Ignore
eca0: 20 65 72 72 6f 72 73 20 69 66 20 77 65 20 68 61   errors if we ha
ecb0: 76 65 20 64 61 74 61 20 74 6f 20 72 65 74 75 72  ve data to retur
ecc0: 6e 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e  n... */...return
ecd0: 20 62 79 74 65 73 52 65 61 64 3b 0a 20 20 20 20   bytesRead;.    
ece0: 7d 0a 0a 20 20 20 20 54 63 6c 5f 57 69 6e 43 6f  }..    Tcl_WinCo
ecf0: 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61  nvertError(GetLa
ed00: 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20  stError());.    
ed10: 69 66 20 28 65 72 72 6e 6f 20 3d 3d 20 45 50 49  if (errno == EPI
ed20: 50 45 29 20 7b 0a 09 69 6e 66 6f 50 74 72 2d 3e  PE) {..infoPtr->
ed30: 72 65 61 64 46 6c 61 67 73 20 7c 3d 20 50 49 50  readFlags |= PIP
ed40: 45 5f 45 4f 46 3b 0a 09 72 65 74 75 72 6e 20 30  E_EOF;..return 0
ed50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 65 72 72  ;.    }.    *err
ed60: 6f 72 43 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a  orCode = errno;.
ed70: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d      return -1;.}
ed80: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
ed90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
edd0: 2a 0a 20 2a 20 50 69 70 65 4f 75 74 70 75 74 50  *. * PipeOutputP
ede0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69  roc --. *. *.Wri
edf0: 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 6f 75  tes the given ou
ee00: 74 70 75 74 20 6f 6e 20 74 68 65 20 49 4f 20 63  tput on the IO c
ee10: 68 61 6e 6e 65 6c 2e 20 52 65 74 75 72 6e 73 20  hannel. Returns 
ee20: 63 6f 75 6e 74 20 6f 66 20 68 6f 77 20 6d 61 6e  count of how man
ee30: 79 0a 20 2a 09 63 68 61 72 61 63 74 65 72 73 20  y. *.characters 
ee40: 77 65 72 65 20 61 63 74 75 61 6c 6c 79 20 77 72  were actually wr
ee50: 69 74 74 65 6e 2c 20 61 6e 64 20 61 6e 20 65 72  itten, and an er
ee60: 72 6f 72 20 69 6e 64 69 63 61 74 69 6f 6e 2e 0a  ror indication..
ee70: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
ee80: 2a 09 41 20 63 6f 75 6e 74 20 6f 66 20 68 6f 77  *.A count of how
ee90: 20 6d 61 6e 79 20 63 68 61 72 61 63 74 65 72 73   many characters
eea0: 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 69 73   were written is
eeb0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e   returned and an
eec0: 20 65 72 72 6f 72 0a 20 2a 09 69 6e 64 69 63 61   error. *.indica
eed0: 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tion is returned
eee0: 20 69 6e 20 61 6e 20 6f 75 74 70 75 74 20 61 72   in an output ar
eef0: 67 75 6d 65 6e 74 2e 0a 20 2a 0a 20 2a 20 53 69  gument.. *. * Si
ef00: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57  de effects:. *.W
ef10: 72 69 74 65 73 20 6f 75 74 70 75 74 20 6f 6e 20  rites output on 
ef20: 74 68 65 20 61 63 74 75 61 6c 20 63 68 61 6e 6e  the actual chann
ef30: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
ef40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ef70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ef80: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a   */..static int.
ef90: 50 69 70 65 4f 75 74 70 75 74 50 72 6f 63 28 0a  PipeOutputProc(.
efa0: 20 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e      void *instan
efb0: 63 65 44 61 74 61 2c 09 09 2f 2a 20 50 69 70 65  ceData,../* Pipe
efc0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 63   state. */.    c
efd0: 6f 6e 73 74 20 63 68 61 72 20 2a 62 75 66 2c 09  onst char *buf,.
efe0: 09 2f 2a 20 54 68 65 20 64 61 74 61 20 62 75 66  ./* The data buf
eff0: 66 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  fer. */.    int 
f000: 74 6f 57 72 69 74 65 2c 09 09 2f 2a 20 48 6f 77  toWrite,../* How
f010: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 77   many bytes to w
f020: 72 69 74 65 3f 20 2a 2f 0a 20 20 20 20 69 6e 74  rite? */.    int
f030: 20 2a 65 72 72 6f 72 43 6f 64 65 29 09 09 2f 2a   *errorCode)../*
f040: 20 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20   Where to store 
f050: 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 7b  error code. */.{
f060: 0a 20 20 20 20 50 69 70 65 49 6e 66 6f 20 2a 69  .    PipeInfo *i
f070: 6e 66 6f 50 74 72 20 3d 20 28 50 69 70 65 49 6e  nfoPtr = (PipeIn
f080: 66 6f 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61  fo *) instanceDa
f090: 74 61 3b 0a 20 20 20 20 57 69 6e 46 69 6c 65 20  ta;.    WinFile 
f0a0: 2a 66 69 6c 65 50 74 72 20 3d 20 28 57 69 6e 46  *filePtr = (WinF
f0b0: 69 6c 65 2a 29 20 69 6e 66 6f 50 74 72 2d 3e 77  ile*) infoPtr->w
f0c0: 72 69 74 65 46 69 6c 65 3b 0a 20 20 20 20 44 57  riteFile;.    DW
f0d0: 4f 52 44 20 62 79 74 65 73 57 72 69 74 74 65 6e  ORD bytesWritten
f0e0: 2c 20 74 69 6d 65 6f 75 74 3b 0a 0a 20 20 20 20  , timeout;..    
f0f0: 2a 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a  *errorCode = 0;.
f100: 0a 20 20 20 20 2f 2a 20 61 76 6f 69 64 20 62 6c  .    /* avoid bl
f110: 6f 63 6b 69 6e 67 20 69 66 20 70 69 70 65 2d 74  ocking if pipe-t
f120: 68 72 65 61 64 20 65 78 69 74 65 64 20 2a 2f 0a  hread exited */.
f130: 20 20 20 20 74 69 6d 65 6f 75 74 20 3d 20 28 28      timeout = ((
f140: 69 6e 66 6f 50 74 72 2d 3e 66 6c 61 67 73 20 26  infoPtr->flags &
f150: 20 50 49 50 45 5f 41 53 59 4e 43 29 0a 09 20 20   PIPE_ASYNC)..  
f160: 20 20 7c 7c 20 21 54 63 6c 50 69 70 65 54 68 72    || !TclPipeThr
f170: 65 61 64 49 73 41 6c 69 76 65 28 26 69 6e 66 6f  eadIsAlive(&info
f180: 50 74 72 2d 3e 77 72 69 74 65 54 49 29 0a 09 20  Ptr->writeTI).. 
f190: 20 20 20 7c 7c 20 54 63 6c 49 6e 45 78 69 74 28     || TclInExit(
f1a0: 29 20 7c 7c 20 54 63 6c 49 6e 54 68 72 65 61 64  ) || TclInThread
f1b0: 45 78 69 74 28 29 29 20 3f 20 30 20 3a 20 49 4e  Exit()) ? 0 : IN
f1c0: 46 49 4e 49 54 45 3b 0a 20 20 20 20 69 66 20 28  FINITE;.    if (
f1d0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
f1e0: 65 63 74 28 69 6e 66 6f 50 74 72 2d 3e 77 72 69  ect(infoPtr->wri
f1f0: 74 61 62 6c 65 2c 20 74 69 6d 65 6f 75 74 29 20  table, timeout) 
f200: 3d 3d 20 57 41 49 54 5f 54 49 4d 45 4f 55 54 29  == WAIT_TIMEOUT)
f210: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 77   {../*.. * The w
f220: 72 69 74 65 72 20 74 68 72 65 61 64 20 69 73 20  riter thread is 
f230: 62 6c 6f 63 6b 65 64 20 77 61 69 74 69 6e 67 20  blocked waiting 
f240: 66 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 63  for a write to c
f250: 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 09 20 2a 20  omplete and.. * 
f260: 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 73 20 69  the channel is i
f270: 6e 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6d  n non-blocking m
f280: 6f 64 65 2e 0a 09 20 2a 2f 0a 0a 09 65 72 72 6e  ode... */...errn
f290: 6f 20 3d 20 45 57 4f 55 4c 44 42 4c 4f 43 4b 3b  o = EWOULDBLOCK;
f2a0: 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20  ..goto error;.  
f2b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
f2c0: 20 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 62   * Check for a b
f2d0: 61 63 6b 67 72 6f 75 6e 64 20 65 72 72 6f 72 20  ackground error 
f2e0: 6f 6e 20 74 68 65 20 6c 61 73 74 20 77 72 69 74  on the last writ
f2f0: 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  e..     */..    
f300: 69 66 20 28 69 6e 66 6f 50 74 72 2d 3e 77 72 69  if (infoPtr->wri
f310: 74 65 45 72 72 6f 72 29 20 7b 0a 09 54 63 6c 5f  teError) {..Tcl_
f320: 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72 28  WinConvertError(
f330: 69 6e 66 6f 50 74 72 2d 3e 77 72 69 74 65 45 72  infoPtr->writeEr
f340: 72 6f 72 29 3b 0a 09 69 6e 66 6f 50 74 72 2d 3e  ror);..infoPtr->
f350: 77 72 69 74 65 45 72 72 6f 72 20 3d 20 30 3b 0a  writeError = 0;.
f360: 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20  .goto error;.   
f370: 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 66 6f   }..    if (info
f380: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 50 49 50  Ptr->flags & PIP
f390: 45 5f 41 53 59 4e 43 29 20 7b 0a 09 2f 2a 0a 09  E_ASYNC) {../*..
f3a0: 20 2a 20 54 68 65 20 70 69 70 65 20 69 73 20 6e   * The pipe is n
f3b0: 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 2c 20 73 6f 20  on-blocking, so 
f3c0: 63 6f 70 79 20 74 68 65 20 64 61 74 61 20 69 6e  copy the data in
f3d0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
f3e0: 66 66 65 72 0a 09 20 2a 20 61 6e 64 20 72 65 73  ffer.. * and res
f3f0: 74 61 72 74 20 74 68 65 20 77 72 69 74 65 72 20  tart the writer 
f400: 74 68 72 65 61 64 2e 0a 09 20 2a 2f 0a 0a 09 69  thread... */...i
f410: 66 20 28 74 6f 57 72 69 74 65 20 3e 20 69 6e 66  f (toWrite > inf
f420: 6f 50 74 72 2d 3e 77 72 69 74 65 42 75 66 4c 65  oPtr->writeBufLe
f430: 6e 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20  n) {..    /*..  
f440: 20 20 20 2a 20 52 65 61 6c 6c 6f 63 61 74 65 20     * Reallocate 
f450: 74 68 65 20 62 75 66 66 65 72 20 74 6f 20 62 65  the buffer to be
f460: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
f470: 20 68 6f 6c 64 20 74 68 65 20 64 61 74 61 2e 0a   hold the data..
f480: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69  .     */...    i
f490: 66 20 28 69 6e 66 6f 50 74 72 2d 3e 77 72 69 74  f (infoPtr->writ
f4a0: 65 42 75 66 29 20 7b 0a 09 09 54 63 6c 5f 46 72  eBuf) {...Tcl_Fr
f4b0: 65 65 28 69 6e 66 6f 50 74 72 2d 3e 77 72 69 74  ee(infoPtr->writ
f4c0: 65 42 75 66 29 3b 0a 09 20 20 20 20 7d 0a 09 20  eBuf);..    }.. 
f4d0: 20 20 20 69 6e 66 6f 50 74 72 2d 3e 77 72 69 74     infoPtr->writ
f4e0: 65 42 75 66 4c 65 6e 20 3d 20 74 6f 57 72 69 74  eBufLen = toWrit
f4f0: 65 3b 0a 09 20 20 20 20 69 6e 66 6f 50 74 72 2d  e;..    infoPtr-
f500: 3e 77 72 69 74 65 42 75 66 20 3d 20 28 63 68 61  >writeBuf = (cha
f510: 72 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 74 6f  r *)Tcl_Alloc(to
f520: 57 72 69 74 65 29 3b 0a 09 7d 0a 09 6d 65 6d 63  Write);..}..memc
f530: 70 79 28 69 6e 66 6f 50 74 72 2d 3e 77 72 69 74  py(infoPtr->writ
f540: 65 42 75 66 2c 20 62 75 66 2c 20 74 6f 57 72 69  eBuf, buf, toWri
f550: 74 65 29 3b 0a 09 69 6e 66 6f 50 74 72 2d 3e 74  te);..infoPtr->t
f560: 6f 57 72 69 74 65 20 3d 20 74 6f 57 72 69 74 65  oWrite = toWrite
f570: 3b 0a 09 52 65 73 65 74 45 76 65 6e 74 28 69 6e  ;..ResetEvent(in
f580: 66 6f 50 74 72 2d 3e 77 72 69 74 61 62 6c 65 29  foPtr->writable)
f590: 3b 0a 09 54 63 6c 50 69 70 65 54 68 72 65 61 64  ;..TclPipeThread
f5a0: 53 69 67 6e 61 6c 28 26 69 6e 66 6f 50 74 72 2d  Signal(&infoPtr-
f5b0: 3e 77 72 69 74 65 54 49 29 3b 0a 09 62 79 74 65  >writeTI);..byte
f5c0: 73 57 72 69 74 74 65 6e 20 3d 20 74 6f 57 72 69  sWritten = toWri
f5d0: 74 65 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  te;.    } else {
f5e0: 0a 09 2f 2a 0a 09 20 2a 20 49 6e 20 74 68 65 20  ../*.. * In the 
f5f0: 62 6c 6f 63 6b 69 6e 67 20 63 61 73 65 2c 20 6a  blocking case, j
f600: 75 73 74 20 74 72 79 20 74 6f 20 77 72 69 74 65  ust try to write
f610: 20 74 68 65 20 62 75 66 66 65 72 20 64 69 72 65   the buffer dire
f620: 63 74 6c 79 2e 20 54 68 69 73 0a 09 20 2a 20 61  ctly. This.. * a
f630: 76 6f 69 64 73 20 61 6e 20 75 6e 6e 65 63 65 73  voids an unneces
f640: 73 61 72 79 20 63 6f 70 79 2e 0a 09 20 2a 2f 0a  sary copy... */.
f650: 0a 09 69 66 20 28 57 72 69 74 65 46 69 6c 65 28  ..if (WriteFile(
f660: 66 69 6c 65 50 74 72 2d 3e 68 61 6e 64 6c 65 2c  filePtr->handle,
f670: 20 28 4c 50 56 4f 49 44 29 20 62 75 66 2c 20 28   (LPVOID) buf, (
f680: 44 57 4f 52 44 29 20 74 6f 57 72 69 74 65 2c 0a  DWORD) toWrite,.
f690: 09 09 26 62 79 74 65 73 57 72 69 74 74 65 6e 2c  ..&bytesWritten,
f6a0: 20 28 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 20   (LPOVERLAPPED) 
f6b0: 4e 55 4c 4c 29 20 3d 3d 20 46 41 4c 53 45 29 20  NULL) == FALSE) 
f6c0: 7b 0a 09 20 20 20 20 54 63 6c 5f 57 69 6e 43 6f  {..    Tcl_WinCo
f6d0: 6e 76 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61  nvertError(GetLa
f6e0: 73 74 45 72 72 6f 72 28 29 29 3b 0a 09 20 20 20  stError());..   
f6f0: 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a   goto error;..}.
f700: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
f710: 20 62 79 74 65 73 57 72 69 74 74 65 6e 3b 0a 0a   bytesWritten;..
f720: 20 20 65 72 72 6f 72 3a 0a 20 20 20 20 2a 65 72    error:.    *er
f730: 72 6f 72 43 6f 64 65 20 3d 20 65 72 72 6e 6f 3b  rorCode = errno;
f740: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
f750: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
f760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
f7a0: 20 2a 0a 20 2a 20 50 69 70 65 45 76 65 6e 74 50   *. * PipeEventP
f7b0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  roc --. *. *.Thi
f7c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
f7d0: 76 6f 6b 65 64 20 62 79 20 54 63 6c 5f 53 65 72  voked by Tcl_Ser
f7e0: 76 69 63 65 45 76 65 6e 74 20 77 68 65 6e 20 61  viceEvent when a
f7f0: 20 66 69 6c 65 20 65 76 65 6e 74 20 72 65 61 63   file event reac
f800: 68 65 73 0a 20 2a 09 74 68 65 20 66 72 6f 6e 74  hes. *.the front
f810: 20 6f 66 20 74 68 65 20 65 76 65 6e 74 20 71 75   of the event qu
f820: 65 75 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  eue. This functi
f830: 6f 6e 20 69 6e 76 6f 6b 65 73 20 54 63 6c 5f 4e  on invokes Tcl_N
f840: 6f 74 69 66 79 43 68 61 6e 6e 65 6c 0a 20 2a 09  otifyChannel. *.
f850: 6f 6e 20 74 68 65 20 70 69 70 65 2e 0a 20 2a 0a  on the pipe.. *.
f860: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52   * Results:. *.R
f870: 65 74 75 72 6e 73 20 31 20 69 66 20 74 68 65 20  eturns 1 if the 
f880: 65 76 65 6e 74 20 77 61 73 20 68 61 6e 64 6c 65  event was handle
f890: 64 2c 20 6d 65 61 6e 69 6e 67 20 69 74 20 73 68  d, meaning it sh
f8a0: 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20  ould be removed 
f8b0: 66 72 6f 6d 0a 20 2a 09 74 68 65 20 71 75 65 75  from. *.the queu
f8c0: 65 2e 20 52 65 74 75 72 6e 73 20 30 20 69 66 20  e. Returns 0 if 
f8d0: 74 68 65 20 65 76 65 6e 74 20 77 61 73 20 6e 6f  the event was no
f8e0: 74 20 68 61 6e 64 6c 65 64 2c 20 6d 65 61 6e 69  t handled, meani
f8f0: 6e 67 20 69 74 20 73 68 6f 75 6c 64 0a 20 2a 09  ng it should. *.
f900: 73 74 61 79 20 6f 6e 20 74 68 65 20 71 75 65 75  stay on the queu
f910: 65 2e 20 54 68 65 20 6f 6e 6c 79 20 74 69 6d 65  e. The only time
f920: 20 74 68 65 20 65 76 65 6e 74 20 69 73 6e 27 74   the event isn't
f930: 20 68 61 6e 64 6c 65 64 20 69 73 20 69 66 20 74   handled is if t
f940: 68 65 0a 20 2a 09 54 43 4c 5f 46 49 4c 45 5f 45  he. *.TCL_FILE_E
f950: 56 45 4e 54 53 20 66 6c 61 67 20 62 69 74 20 69  VENTS flag bit i
f960: 73 6e 27 74 20 73 65 74 2e 0a 20 2a 0a 20 2a 20  sn't set.. *. * 
f970: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
f980: 09 57 68 61 74 65 76 65 72 20 74 68 65 20 6e 6f  .Whatever the no
f990: 74 69 66 69 65 72 20 63 61 6c 6c 62 61 63 6b 20  tifier callback 
f9a0: 64 6f 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  does.. *. *-----
f9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9f0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  -. */..static in
fa00: 74 0a 50 69 70 65 45 76 65 6e 74 50 72 6f 63 28  t.PipeEventProc(
fa10: 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 20 2a  .    Tcl_Event *
fa20: 65 76 50 74 72 2c 09 09 2f 2a 20 45 76 65 6e 74  evPtr,../* Event
fa30: 20 74 6f 20 73 65 72 76 69 63 65 2e 20 2a 2f 0a   to service. */.
fa40: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09      int flags)..
fa50: 09 2f 2a 20 46 6c 61 67 73 20 74 68 61 74 20 69  ./* Flags that i
fa60: 6e 64 69 63 61 74 65 20 77 68 61 74 20 65 76 65  ndicate what eve
fa70: 6e 74 73 20 74 6f 0a 09 09 09 09 20 2a 20 68 61  nts to..... * ha
fa80: 6e 64 6c 65 2c 20 73 75 63 68 20 61 73 20 54 43  ndle, such as TC
fa90: 4c 5f 46 49 4c 45 5f 45 56 45 4e 54 53 2e 20 2a  L_FILE_EVENTS. *
faa0: 2f 0a 7b 0a 20 20 20 20 50 69 70 65 45 76 65 6e  /.{.    PipeEven
fab0: 74 20 2a 70 69 70 65 45 76 50 74 72 20 3d 20 28  t *pipeEvPtr = (
fac0: 50 69 70 65 45 76 65 6e 74 20 2a 29 65 76 50 74  PipeEvent *)evPt
fad0: 72 3b 0a 20 20 20 20 50 69 70 65 49 6e 66 6f 20  r;.    PipeInfo 
fae0: 2a 69 6e 66 6f 50 74 72 3b 0a 20 20 20 20 69 6e  *infoPtr;.    in
faf0: 74 20 6d 61 73 6b 3b 0a 20 20 20 20 54 68 72 65  t mask;.    Thre
fb00: 61 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a  adSpecificData *
fb10: 74 73 64 50 74 72 20 3d 20 54 43 4c 5f 54 53 44  tsdPtr = TCL_TSD
fb20: 5f 49 4e 49 54 28 26 64 61 74 61 4b 65 79 29 3b  _INIT(&dataKey);
fb30: 0a 0a 20 20 20 20 69 66 20 28 21 28 66 6c 61 67  ..    if (!(flag
fb40: 73 20 26 20 54 43 4c 5f 46 49 4c 45 5f 45 56 45  s & TCL_FILE_EVE
fb50: 4e 54 53 29 29 20 7b 0a 09 72 65 74 75 72 6e 20  NTS)) {..return 
fb60: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
fb70: 0a 20 20 20 20 20 2a 20 53 65 61 72 63 68 20 74  .     * Search t
fb80: 68 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20  hrough the list 
fb90: 6f 66 20 77 61 74 63 68 65 64 20 70 69 70 65 73  of watched pipes
fba0: 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 68 6f   for the one who
fbb0: 73 65 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 2a  se handle.     *
fbc0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 65 76 65   matches the eve
fbd0: 6e 74 2e 20 57 65 20 64 6f 20 74 68 69 73 20 72  nt. We do this r
fbe0: 61 74 68 65 72 20 74 68 61 6e 20 73 69 6d 70 6c  ather than simpl
fbf0: 79 20 64 65 72 65 66 65 72 65 6e 63 69 6e 67 20  y dereferencing 
fc00: 74 68 65 0a 20 20 20 20 20 2a 20 68 61 6e 64 6c  the.     * handl
fc10: 65 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 73  e in the event s
fc20: 6f 20 74 68 61 74 20 70 69 70 65 73 20 63 61 6e  o that pipes can
fc30: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 69 6c   be deleted whil
fc40: 65 20 74 68 65 20 65 76 65 6e 74 20 69 73 20 69  e the event is i
fc50: 6e 0a 20 20 20 20 20 2a 20 74 68 65 20 71 75 65  n.     * the que
fc60: 75 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ue..     */..   
fc70: 20 66 6f 72 20 28 69 6e 66 6f 50 74 72 20 3d 20   for (infoPtr = 
fc80: 74 73 64 50 74 72 2d 3e 66 69 72 73 74 50 69 70  tsdPtr->firstPip
fc90: 65 50 74 72 3b 20 69 6e 66 6f 50 74 72 20 21 3d  ePtr; infoPtr !=
fca0: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 69 6e 66 6f   NULL;..    info
fcb0: 50 74 72 20 3d 20 69 6e 66 6f 50 74 72 2d 3e 6e  Ptr = infoPtr->n
fcc0: 65 78 74 50 74 72 29 20 7b 0a 09 69 66 20 28 70  extPtr) {..if (p
fcd0: 69 70 65 45 76 50 74 72 2d 3e 69 6e 66 6f 50 74  ipeEvPtr->infoPt
fce0: 72 20 3d 3d 20 69 6e 66 6f 50 74 72 29 20 7b 0a  r == infoPtr) {.
fcf0: 09 20 20 20 20 69 6e 66 6f 50 74 72 2d 3e 66 6c  .    infoPtr->fl
fd00: 61 67 73 20 26 3d 20 7e 28 50 49 50 45 5f 50 45  ags &= ~(PIPE_PE
fd10: 4e 44 49 4e 47 29 3b 0a 09 20 20 20 20 62 72 65  NDING);..    bre
fd20: 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  ak;..}.    }..  
fd30: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 6d 6f    /*.     * Remo
fd40: 76 65 20 73 74 61 6c 65 20 65 76 65 6e 74 73 2e  ve stale events.
fd50: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
fd60: 20 28 21 69 6e 66 6f 50 74 72 29 20 7b 0a 09 72   (!infoPtr) {..r
fd70: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
fd80: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 68      /*.     * Ch
fd90: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
fda0: 65 20 70 69 70 65 20 69 73 20 72 65 61 64 61 62  e pipe is readab
fdb0: 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65  le. Note that we
fdc0: 20 63 61 6e 27 74 20 74 65 6c 6c 20 69 66 20 61   can't tell if a
fdd0: 20 70 69 70 65 0a 20 20 20 20 20 2a 20 69 73 20   pipe.     * is 
fde0: 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 77 65 20  writable, so we 
fdf0: 61 6c 77 61 79 73 20 72 65 70 6f 72 74 20 69 74  always report it
fe00: 20 61 73 20 62 65 69 6e 67 20 77 72 69 74 61 62   as being writab
fe10: 6c 65 20 75 6e 6c 65 73 73 20 77 65 20 68 61 76  le unless we hav
fe20: 65 0a 20 20 20 20 20 2a 20 64 65 74 65 63 74 65  e.     * detecte
fe30: 64 20 45 4f 46 2e 0a 20 20 20 20 20 2a 2f 0a 0a  d EOF..     */..
fe40: 20 20 20 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20      mask = 0;.  
fe50: 20 20 69 66 20 28 28 69 6e 66 6f 50 74 72 2d 3e    if ((infoPtr->
fe60: 77 61 74 63 68 4d 61 73 6b 20 26 20 54 43 4c 5f  watchMask & TCL_
fe70: 57 52 49 54 41 42 4c 45 29 20 26 26 0a 09 20 20  WRITABLE) &&..  
fe80: 20 20 28 57 61 69 74 46 6f 72 53 69 6e 67 6c 65    (WaitForSingle
fe90: 4f 62 6a 65 63 74 28 69 6e 66 6f 50 74 72 2d 3e  Object(infoPtr->
fea0: 77 72 69 74 61 62 6c 65 2c 20 30 29 20 21 3d 20  writable, 0) != 
feb0: 57 41 49 54 5f 54 49 4d 45 4f 55 54 29 29 20 7b  WAIT_TIMEOUT)) {
fec0: 0a 09 6d 61 73 6b 20 3d 20 54 43 4c 5f 57 52 49  ..mask = TCL_WRI
fed0: 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  TABLE;.    }..  
fee0: 20 20 69 66 20 28 28 69 6e 66 6f 50 74 72 2d 3e    if ((infoPtr->
fef0: 77 61 74 63 68 4d 61 73 6b 20 26 20 54 43 4c 5f  watchMask & TCL_
ff00: 52 45 41 44 41 42 4c 45 29 20 26 26 20 28 57 61  READABLE) && (Wa
ff10: 69 74 46 6f 72 52 65 61 64 28 69 6e 66 6f 50 74  itForRead(infoPt
ff20: 72 2c 30 29 20 3e 3d 20 30 29 29 20 7b 0a 09 69  r,0) >= 0)) {..i
ff30: 66 20 28 69 6e 66 6f 50 74 72 2d 3e 72 65 61 64  f (infoPtr->read
ff40: 46 6c 61 67 73 20 26 20 50 49 50 45 5f 45 4f 46  Flags & PIPE_EOF
ff50: 29 20 7b 0a 09 20 20 20 20 6d 61 73 6b 20 3d 20  ) {..    mask = 
ff60: 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 7d  TCL_READABLE;..}
ff70: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 61 73   else {..    mas
ff80: 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c  k |= TCL_READABL
ff90: 45 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  E;..}.    }..   
ffa0: 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 66 6f 72   /*.     * Infor
ffb0: 6d 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 6f 66  m the channel of
ffc0: 20 74 68 65 20 65 76 65 6e 74 73 2e 0a 20 20 20   the events..   
ffd0: 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f 4e 6f    */..    Tcl_No
ffe0: 74 69 66 79 43 68 61 6e 6e 65 6c 28 69 6e 66 6f  tifyChannel(info
fff0: 50 74 72 2d 3e 63 68 61 6e 6e 65 6c 2c 20 69 6e  Ptr->channel, in
10000 66 6f 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b  foPtr->watchMask
10010 20 26 20 6d 61 73 6b 29 3b 0a 20 20 20 20 72 65   & mask);.    re
10020 74 75 72 6e 20 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  turn 1;.}.../*. 
10030 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
10040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10070 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 69  -------. *. * Pi
10080 70 65 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20  peWatchProc --. 
10090 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74  *. *.Called by t
100a0 68 65 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 73  he notifier to s
100b0 65 74 20 75 70 20 74 6f 20 77 61 74 63 68 20 66  et up to watch f
100c0 6f 72 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 69  or events on thi
100d0 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  s channel.. *. *
100e0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
100f0 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  e.. *. * Side ef
10100 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
10110 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
10120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
10160 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 50 69 70  .static void.Pip
10170 65 57 61 74 63 68 50 72 6f 63 28 0a 20 20 20 20  eWatchProc(.    
10180 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 44 61  void *instanceDa
10190 74 61 2c 09 09 2f 2a 20 50 69 70 65 20 73 74 61  ta,../* Pipe sta
101a0 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  te. */.    int m
101b0 61 73 6b 29 09 09 09 2f 2a 20 57 68 61 74 20 65  ask).../* What e
101c0 76 65 6e 74 73 20 74 6f 20 77 61 74 63 68 20 66  vents to watch f
101d0 6f 72 2c 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e  or, OR-ed combin
101e0 61 74 69 6f 6e 0a 09 09 09 09 20 2a 20 6f 66 20  ation..... * of 
101f0 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 54 43  TCL_READABLE, TC
10200 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e 64 0a 09  L_WRITABLE and..
10210 09 09 09 20 2a 20 54 43 4c 5f 45 58 43 45 50 54  ... * TCL_EXCEPT
10220 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 50 69  ION. */.{.    Pi
10230 70 65 49 6e 66 6f 20 2a 2a 6e 65 78 74 50 74 72  peInfo **nextPtr
10240 50 74 72 2c 20 2a 70 74 72 3b 0a 20 20 20 20 50  Ptr, *ptr;.    P
10250 69 70 65 49 6e 66 6f 20 2a 69 6e 66 6f 50 74 72  ipeInfo *infoPtr
10260 20 3d 20 28 50 69 70 65 49 6e 66 6f 20 2a 29 20   = (PipeInfo *) 
10270 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
10280 20 20 69 6e 74 20 6f 6c 64 4d 61 73 6b 20 3d 20    int oldMask = 
10290 69 6e 66 6f 50 74 72 2d 3e 77 61 74 63 68 4d 61  infoPtr->watchMa
102a0 73 6b 3b 0a 20 20 20 20 54 68 72 65 61 64 53 70  sk;.    ThreadSp
102b0 65 63 69 66 69 63 44 61 74 61 20 2a 74 73 64 50  ecificData *tsdP
102c0 74 72 20 3d 20 54 43 4c 5f 54 53 44 5f 49 4e 49  tr = TCL_TSD_INI
102d0 54 28 26 64 61 74 61 4b 65 79 29 3b 0a 0a 20 20  T(&dataKey);..  
102e0 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 69 6e 63    /*.     * Sinc
102f0 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f  e most of the wo
10300 72 6b 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79  rk is handled by
10310 20 74 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20   the background 
10320 74 68 72 65 61 64 73 2c 20 77 65 20 6a 75 73 74  threads, we just
10330 0a 20 20 20 20 20 2a 20 6e 65 65 64 20 74 6f 20  .     * need to 
10340 75 70 64 61 74 65 20 74 68 65 20 77 61 74 63 68  update the watch
10350 4d 61 73 6b 20 61 6e 64 20 74 68 65 6e 20 66 6f  Mask and then fo
10360 72 63 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72  rce the notifier
10370 20 74 6f 20 70 6f 6c 6c 20 6f 6e 63 65 2e 0a 20   to poll once.. 
10380 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 6e 66 6f      */..    info
10390 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d  Ptr->watchMask =
103a0 20 6d 61 73 6b 20 26 20 69 6e 66 6f 50 74 72 2d   mask & infoPtr-
103b0 3e 76 61 6c 69 64 4d 61 73 6b 3b 0a 20 20 20 20  >validMask;.    
103c0 69 66 20 28 69 6e 66 6f 50 74 72 2d 3e 77 61 74  if (infoPtr->wat
103d0 63 68 4d 61 73 6b 29 20 7b 0a 09 54 63 6c 5f 54  chMask) {..Tcl_T
103e0 69 6d 65 20 62 6c 6f 63 6b 54 69 6d 65 20 3d 20  ime blockTime = 
103f0 7b 20 30 2c 20 30 20 7d 3b 0a 0a 09 69 66 20 28  { 0, 0 };...if (
10400 21 6f 6c 64 4d 61 73 6b 29 20 7b 0a 09 20 20 20  !oldMask) {..   
10410 20 69 6e 66 6f 50 74 72 2d 3e 6e 65 78 74 50 74   infoPtr->nextPt
10420 72 20 3d 20 74 73 64 50 74 72 2d 3e 66 69 72 73  r = tsdPtr->firs
10430 74 50 69 70 65 50 74 72 3b 0a 09 20 20 20 20 74  tPipePtr;..    t
10440 73 64 50 74 72 2d 3e 66 69 72 73 74 50 69 70 65  sdPtr->firstPipe
10450 50 74 72 20 3d 20 69 6e 66 6f 50 74 72 3b 0a 09  Ptr = infoPtr;..
10460 7d 0a 09 54 63 6c 5f 53 65 74 4d 61 78 42 6c 6f  }..Tcl_SetMaxBlo
10470 63 6b 54 69 6d 65 28 26 62 6c 6f 63 6b 54 69 6d  ckTime(&blockTim
10480 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  e);.    } else {
10490 0a 09 69 66 20 28 6f 6c 64 4d 61 73 6b 29 20 7b  ..if (oldMask) {
104a0 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
104b0 20 52 65 6d 6f 76 65 20 74 68 65 20 70 69 70 65   Remove the pipe
104c0 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
104d0 66 20 77 61 74 63 68 65 64 20 70 69 70 65 73 2e  f watched pipes.
104e0 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
104f0 66 6f 72 20 28 6e 65 78 74 50 74 72 50 74 72 20  for (nextPtrPtr 
10500 3d 20 26 28 74 73 64 50 74 72 2d 3e 66 69 72 73  = &(tsdPtr->firs
10510 74 50 69 70 65 50 74 72 29 2c 20 70 74 72 20 3d  tPipePtr), ptr =
10520 20 2a 6e 65 78 74 50 74 72 50 74 72 3b 0a 09 09   *nextPtrPtr;...
10530 20 20 20 20 70 74 72 20 21 3d 20 4e 55 4c 4c 3b      ptr != NULL;
10540 0a 09 09 20 20 20 20 6e 65 78 74 50 74 72 50 74  ...    nextPtrPt
10550 72 20 3d 20 26 70 74 72 2d 3e 6e 65 78 74 50 74  r = &ptr->nextPt
10560 72 2c 20 70 74 72 20 3d 20 2a 6e 65 78 74 50 74  r, ptr = *nextPt
10570 72 50 74 72 29 20 7b 0a 09 09 69 66 20 28 69 6e  rPtr) {...if (in
10580 66 6f 50 74 72 20 3d 3d 20 70 74 72 29 20 7b 0a  foPtr == ptr) {.
10590 09 09 20 20 20 20 2a 6e 65 78 74 50 74 72 50 74  ..    *nextPtrPt
105a0 72 20 3d 20 70 74 72 2d 3e 6e 65 78 74 50 74 72  r = ptr->nextPtr
105b0 3b 0a 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  ;...    break;..
105c0 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  .}..    }..}.   
105d0 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   }.}.../*. *----
105e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
105f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10620 2d 2d 0a 20 2a 0a 20 2a 20 50 69 70 65 47 65 74  --. *. * PipeGet
10630 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a  HandleProc --. *
10640 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d 20  . *.Called from 
10650 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61  Tcl_GetChannelHa
10660 6e 64 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65  ndle to retrieve
10670 20 4f 53 20 68 61 6e 64 6c 65 73 20 66 72 6f 6d   OS handles from
10680 20 69 6e 73 69 64 65 20 61 0a 20 2a 09 63 6f 6d   inside a. *.com
10690 6d 61 6e 64 20 70 69 70 65 6c 69 6e 65 20 62 61  mand pipeline ba
106a0 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a  sed channel.. *.
106b0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52   * Results:. *.R
106c0 65 74 75 72 6e 73 20 54 43 4c 5f 4f 4b 20 77 69  eturns TCL_OK wi
106d0 74 68 20 74 68 65 20 66 64 20 69 6e 20 68 61 6e  th the fd in han
106e0 64 6c 65 50 74 72 2c 20 6f 72 20 54 43 4c 5f 45  dlePtr, or TCL_E
106f0 52 52 4f 52 20 69 66 20 74 68 65 72 65 20 69 73  RROR if there is
10700 20 6e 6f 0a 20 2a 09 68 61 6e 64 6c 65 20 66 6f   no. *.handle fo
10710 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
10720 64 69 72 65 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a  direction.. *. *
10730 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
10740 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
10750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10790 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
107a0 69 6e 74 0a 50 69 70 65 47 65 74 48 61 6e 64 6c  int.PipeGetHandl
107b0 65 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20  eProc(.    void 
107c0 2a 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 09  *instanceData,..
107d0 2f 2a 20 54 68 65 20 70 69 70 65 20 73 74 61 74  /* The pipe stat
107e0 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 69  e. */.    int di
107f0 72 65 63 74 69 6f 6e 2c 09 09 2f 2a 20 54 43 4c  rection,../* TCL
10800 5f 52 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c  _READABLE or TCL
10810 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20  _WRITABLE */.   
10820 20 76 6f 69 64 20 2a 2a 68 61 6e 64 6c 65 50 74   void **handlePt
10830 72 29 09 09 2f 2a 20 57 68 65 72 65 20 74 6f 20  r)../* Where to 
10840 73 74 6f 72 65 20 74 68 65 20 68 61 6e 64 6c 65  store the handle
10850 2e 20 2a 2f 0a 7b 0a 20 20 20 20 50 69 70 65 49  . */.{.    PipeI
10860 6e 66 6f 20 2a 69 6e 66 6f 50 74 72 20 3d 20 28  nfo *infoPtr = (
10870 50 69 70 65 49 6e 66 6f 20 2a 29 20 69 6e 73 74  PipeInfo *) inst
10880 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 57 69  anceData;.    Wi
10890 6e 46 69 6c 65 20 2a 66 69 6c 65 50 74 72 3b 0a  nFile *filePtr;.
108a0 0a 20 20 20 20 69 66 20 28 64 69 72 65 63 74 69  .    if (directi
108b0 6f 6e 20 3d 3d 20 54 43 4c 5f 52 45 41 44 41 42  on == TCL_READAB
108c0 4c 45 20 26 26 20 69 6e 66 6f 50 74 72 2d 3e 72  LE && infoPtr->r
108d0 65 61 64 46 69 6c 65 29 20 7b 0a 09 66 69 6c 65  eadFile) {..file
108e0 50 74 72 20 3d 20 28 57 69 6e 46 69 6c 65 2a 29  Ptr = (WinFile*)
108f0 20 69 6e 66 6f 50 74 72 2d 3e 72 65 61 64 46 69   infoPtr->readFi
10900 6c 65 3b 0a 09 2a 68 61 6e 64 6c 65 50 74 72 20  le;..*handlePtr 
10910 3d 20 28 76 6f 69 64 20 2a 29 66 69 6c 65 50 74  = (void *)filePt
10920 72 2d 3e 68 61 6e 64 6c 65 3b 0a 09 72 65 74 75  r->handle;..retu
10930 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
10940 0a 20 20 20 20 69 66 20 28 64 69 72 65 63 74 69  .    if (directi
10950 6f 6e 20 3d 3d 20 54 43 4c 5f 57 52 49 54 41 42  on == TCL_WRITAB
10960 4c 45 20 26 26 20 69 6e 66 6f 50 74 72 2d 3e 77  LE && infoPtr->w
10970 72 69 74 65 46 69 6c 65 29 20 7b 0a 09 66 69 6c  riteFile) {..fil
10980 65 50 74 72 20 3d 20 28 57 69 6e 46 69 6c 65 2a  ePtr = (WinFile*
10990 29 20 69 6e 66 6f 50 74 72 2d 3e 77 72 69 74 65  ) infoPtr->write
109a0 46 69 6c 65 3b 0a 09 2a 68 61 6e 64 6c 65 50 74  File;..*handlePt
109b0 72 20 3d 20 28 76 6f 69 64 20 2a 29 66 69 6c 65  r = (void *)file
109c0 50 74 72 2d 3e 68 61 6e 64 6c 65 3b 0a 09 72 65  Ptr->handle;..re
109d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
109e0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
109f0 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0c 0a 2f 2a 0a  L_ERROR;.}.../*.
10a00 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a40 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
10a50 63 6c 5f 57 61 69 74 50 69 64 20 2d 2d 0a 20 2a  cl_WaitPid --. *
10a60 0a 20 2a 09 45 6d 75 6c 61 74 65 73 20 74 68 65  . *.Emulates the
10a70 20 77 61 69 74 70 69 64 20 73 79 73 74 65 6d 20   waitpid system 
10a80 63 61 6c 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  call.. *. * Resu
10a90 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20  lts:. *.Returns 
10aa0 30 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  0 if the process
10ab0 20 69 73 20 73 74 69 6c 6c 20 61 6c 69 76 65 2c   is still alive,
10ac0 20 2d 31 20 6f 6e 20 61 6e 20 65 72 72 6f 72 2c   -1 on an error,
10ad0 20 6f 72 20 74 68 65 20 70 69 64 20 6f 6e 0a 20   or the pid on. 
10ae0 2a 09 61 20 63 6c 65 61 6e 20 63 6c 6f 73 65 2e  *.a clean close.
10af0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
10b00 63 74 73 3a 0a 20 2a 09 55 6e 6c 65 73 73 20 57  cts:. *.Unless W
10b10 4e 4f 48 41 4e 47 20 69 73 20 73 65 74 20 61 6e  NOHANG is set an
10b20 64 20 74 68 65 20 77 61 69 74 20 74 69 6d 65 73  d the wait times
10b30 20 6f 75 74 2c 20 74 68 65 20 70 72 6f 63 65 73   out, the proces
10b40 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 2a  s information. *
10b50 09 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20  .record will be 
10b60 64 65 6c 65 74 65 64 20 61 6e 64 20 74 68 65 20  deleted and the 
10b70 70 72 6f 63 65 73 73 20 68 61 6e 64 6c 65 20 77  process handle w
10b80 69 6c 6c 20 62 65 20 63 6c 6f 73 65 64 2e 0a 20  ill be closed.. 
10b90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
10ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
10be0 54 63 6c 5f 50 69 64 0a 54 63 6c 5f 57 61 69 74  Tcl_Pid.Tcl_Wait
10bf0 50 69 64 28 0a 20 20 20 20 54 63 6c 5f 50 69 64  Pid(.    Tcl_Pid
10c00 20 70 69 64 2c 0a 20 20 20 20 69 6e 74 20 2a 73   pid,.    int *s
10c10 74 61 74 50 74 72 2c 0a 20 20 20 20 69 6e 74 20  tatPtr,.    int 
10c20 6f 70 74 69 6f 6e 73 29 0a 7b 0a 20 20 20 20 50  options).{.    P
10c30 72 6f 63 49 6e 66 6f 20 2a 69 6e 66 6f 50 74 72  rocInfo *infoPtr
10c40 20 3d 20 4e 55 4c 4c 2c 20 2a 2a 70 72 65 76 50   = NULL, **prevP
10c50 74 72 50 74 72 3b 0a 20 20 20 20 44 57 4f 52 44  trPtr;.    DWORD
10c60 20 66 6c 61 67 73 3b 0a 20 20 20 20 54 63 6c 5f   flags;.    Tcl_
10c70 50 69 64 20 72 65 73 75 6c 74 3b 0a 20 20 20 20  Pid result;.    
10c80 44 57 4f 52 44 20 72 65 74 2c 20 65 78 69 74 43  DWORD ret, exitC
10c90 6f 64 65 3b 0a 0a 20 20 20 20 50 69 70 65 49 6e  ode;..    PipeIn
10ca0 69 74 28 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  it();..    /*.  
10cb0 20 20 20 2a 20 49 66 20 6e 6f 20 70 69 64 20 69     * If no pid i
10cc0 73 20 73 70 65 63 69 66 69 65 64 2c 20 64 6f 20  s specified, do 
10cd0 6e 6f 74 68 69 6e 67 2e 0a 20 20 20 20 20 2a 2f  nothing..     */
10ce0 0a 0a 20 20 20 20 69 66 20 28 70 69 64 20 3d 3d  ..    if (pid ==
10cf0 20 30 29 20 7b 0a 09 2a 73 74 61 74 50 74 72 20   0) {..*statPtr 
10d00 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a  = 0;..return 0;.
10d10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
10d20 20 20 20 2a 20 46 69 6e 64 20 74 68 65 20 70 72     * Find the pr
10d30 6f 63 65 73 73 20 61 6e 64 20 63 75 74 20 69 74  ocess and cut it
10d40 20 66 72 6f 6d 20 74 68 65 20 70 72 6f 63 65 73   from the proces
10d50 73 20 6c 69 73 74 2e 0a 20 20 20 20 20 2a 2f 0a  s list..     */.
10d60 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f  .    Tcl_MutexLo
10d70 63 6b 28 26 70 69 70 65 4d 75 74 65 78 29 3b 0a  ck(&pipeMutex);.
10d80 20 20 20 20 70 72 65 76 50 74 72 50 74 72 20 3d      prevPtrPtr =
10d90 20 26 70 72 6f 63 4c 69 73 74 3b 0a 20 20 20 20   &procList;.    
10da0 66 6f 72 20 28 69 6e 66 6f 50 74 72 20 3d 20 70  for (infoPtr = p
10db0 72 6f 63 4c 69 73 74 3b 20 69 6e 66 6f 50 74 72  rocList; infoPtr
10dc0 20 21 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 70   != NULL;..    p
10dd0 72 65 76 50 74 72 50 74 72 20 3d 20 26 69 6e 66  revPtrPtr = &inf
10de0 6f 50 74 72 2d 3e 6e 65 78 74 50 74 72 2c 20 69  oPtr->nextPtr, i
10df0 6e 66 6f 50 74 72 20 3d 20 69 6e 66 6f 50 74 72  nfoPtr = infoPtr
10e00 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 69 66  ->nextPtr) {..if
10e10 20 28 69 6e 66 6f 50 74 72 2d 3e 64 77 50 72 6f   (infoPtr->dwPro
10e20 63 65 73 73 49 64 20 3d 3d 20 28 54 63 6c 5f 53  cessId == (Tcl_S
10e30 69 7a 65 29 70 69 64 29 20 7b 0a 09 20 20 20 20  ize)pid) {..    
10e40 2a 70 72 65 76 50 74 72 50 74 72 20 3d 20 69 6e  *prevPtrPtr = in
10e50 66 6f 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a  foPtr->nextPtr;.
10e60 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20  .    break;..}. 
10e70 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4d 75 74     }.    Tcl_Mut
10e80 65 78 55 6e 6c 6f 63 6b 28 26 70 69 70 65 4d 75  exUnlock(&pipeMu
10e90 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  tex);..    /*.  
10ea0 20 20 20 2a 20 49 66 20 74 68 65 20 70 69 64 20     * If the pid 
10eb0 69 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68  is not one of th
10ec0 65 20 70 72 6f 63 65 73 73 65 73 20 77 65 20 6b  e processes we k
10ed0 6e 6f 77 20 61 62 6f 75 74 20 28 77 65 20 73 74  now about (we st
10ee0 61 72 74 65 64 20 69 74 29 0a 20 20 20 20 20 2a  arted it).     *
10ef0 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
10f00 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
10f10 66 20 28 69 6e 66 6f 50 74 72 20 3d 3d 20 4e 55  f (infoPtr == NU
10f20 4c 4c 29 20 7b 0a 09 2a 73 74 61 74 50 74 72 20  LL) {..*statPtr 
10f30 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a  = 0;..return 0;.
10f40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
10f50 20 20 20 2a 20 4f 66 66 69 63 69 61 6c 6c 79 20     * Officially 
10f60 22 77 61 69 74 22 20 66 6f 72 20 69 74 20 74 6f  "wait" for it to
10f70 20 66 69 6e 69 73 68 2e 20 57 65 20 65 69 74 68   finish. We eith
10f80 65 72 20 70 6f 6c 6c 20 28 57 4e 4f 48 41 4e 47  er poll (WNOHANG
10f90 29 20 6f 72 20 77 61 69 74 0a 20 20 20 20 20 2a  ) or wait.     *
10fa0 20 66 6f 72 20 61 6e 20 69 6e 66 69 6e 69 74 65   for an infinite
10fb0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 2e   amount of time.
10fc0 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
10fd0 20 28 6f 70 74 69 6f 6e 73 20 26 20 57 4e 4f 48   (options & WNOH
10fe0 41 4e 47 29 20 7b 0a 09 66 6c 61 67 73 20 3d 20  ANG) {..flags = 
10ff0 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  0;.    } else {.
11000 09 66 6c 61 67 73 20 3d 20 49 4e 46 49 4e 49 54  .flags = INFINIT
11010 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  E;.    }.    ret
11020 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   = WaitForSingle
11030 4f 62 6a 65 63 74 28 69 6e 66 6f 50 74 72 2d 3e  Object(infoPtr->
11040 68 50 72 6f 63 65 73 73 2c 20 66 6c 61 67 73 29  hProcess, flags)
11050 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 3d 3d  ;.    if (ret ==
11060 20 57 41 49 54 5f 54 49 4d 45 4f 55 54 29 20 7b   WAIT_TIMEOUT) {
11070 0a 09 2a 73 74 61 74 50 74 72 20 3d 20 30 3b 0a  ..*statPtr = 0;.
11080 09 69 66 20 28 6f 70 74 69 6f 6e 73 20 26 20 57  .if (options & W
11090 4e 4f 48 41 4e 47 29 20 7b 0a 09 20 20 20 20 2f  NOHANG) {..    /
110a0 2a 0a 09 20 20 20 20 20 2a 20 52 65 2d 69 6e 73  *..     * Re-ins
110b0 65 72 74 20 74 68 69 73 20 69 6e 66 6f 50 74 72  ert this infoPtr
110c0 20 62 61 63 6b 20 6f 6e 20 74 68 65 20 6c 69 73   back on the lis
110d0 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  t...     */...  
110e0 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28    Tcl_MutexLock(
110f0 26 70 69 70 65 4d 75 74 65 78 29 3b 0a 09 20 20  &pipeMutex);..  
11100 20 20 69 6e 66 6f 50 74 72 2d 3e 6e 65 78 74 50    infoPtr->nextP
11110 74 72 20 3d 20 70 72 6f 63 4c 69 73 74 3b 0a 09  tr = procList;..
11120 20 20 20 20 70 72 6f 63 4c 69 73 74 20 3d 20 69      procList = i
11130 6e 66 6f 50 74 72 3b 0a 09 20 20 20 20 54 63 6c  nfoPtr;..    Tcl
11140 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 70 69  _MutexUnlock(&pi
11150 70 65 4d 75 74 65 78 29 3b 0a 09 20 20 20 20 72  peMutex);..    r
11160 65 74 75 72 6e 20 30 3b 0a 09 7d 20 65 6c 73 65  eturn 0;..} else
11170 20 7b 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d   {..    result =
11180 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73   0;..}.    } els
11190 65 20 69 66 20 28 72 65 74 20 3d 3d 20 57 41 49  e if (ret == WAI
111a0 54 5f 4f 42 4a 45 43 54 5f 30 29 20 7b 0a 09 47  T_OBJECT_0) {..G
111b0 65 74 45 78 69 74 43 6f 64 65 50 72 6f 63 65 73  etExitCodeProces
111c0 73 28 69 6e 66 6f 50 74 72 2d 3e 68 50 72 6f 63  s(infoPtr->hProc
111d0 65 73 73 2c 20 26 65 78 69 74 43 6f 64 65 29 3b  ess, &exitCode);
111e0 0a 0a 09 2f 2a 0a 09 20 2a 20 44 6f 65 73 20 74  .../*.. * Does t
111f0 68 65 20 65 78 69 74 20 63 6f 64 65 20 6c 6f 6f  he exit code loo
11200 6b 20 6c 69 6b 65 20 6f 6e 65 20 6f 66 20 74 68  k like one of th
11210 65 20 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65  e exception code
11220 73 3f 0a 09 20 2a 2f 0a 0a 09 73 77 69 74 63 68  s?.. */...switch
11230 20 28 65 78 69 74 43 6f 64 65 29 20 7b 0a 09 63   (exitCode) {..c
11240 61 73 65 20 45 58 43 45 50 54 49 4f 4e 5f 46 4c  ase EXCEPTION_FL
11250 54 5f 44 45 4e 4f 52 4d 41 4c 5f 4f 50 45 52 41  T_DENORMAL_OPERA
11260 4e 44 3a 0a 09 63 61 73 65 20 45 58 43 45 50 54  ND:..case EXCEPT
11270 49 4f 4e 5f 46 4c 54 5f 44 49 56 49 44 45 5f 42  ION_FLT_DIVIDE_B
11280 59 5f 5a 45 52 4f 3a 0a 09 63 61 73 65 20 45 58  Y_ZERO:..case EX
11290 43 45 50 54 49 4f 4e 5f 46 4c 54 5f 49 4e 45 58  CEPTION_FLT_INEX
112a0 41 43 54 5f 52 45 53 55 4c 54 3a 0a 09 63 61 73  ACT_RESULT:..cas
112b0 65 20 45 58 43 45 50 54 49 4f 4e 5f 46 4c 54 5f  e EXCEPTION_FLT_
112c0 49 4e 56 41 4c 49 44 5f 4f 50 45 52 41 54 49 4f  INVALID_OPERATIO
112d0 4e 3a 0a 09 63 61 73 65 20 45 58 43 45 50 54 49  N:..case EXCEPTI
112e0 4f 4e 5f 46 4c 54 5f 4f 56 45 52 46 4c 4f 57 3a  ON_FLT_OVERFLOW:
112f0 0a 09 63 61 73 65 20 45 58 43 45 50 54 49 4f 4e  ..case EXCEPTION
11300 5f 46 4c 54 5f 53 54 41 43 4b 5f 43 48 45 43 4b  _FLT_STACK_CHECK
11310 3a 0a 09 63 61 73 65 20 45 58 43 45 50 54 49 4f  :..case EXCEPTIO
11320 4e 5f 46 4c 54 5f 55 4e 44 45 52 46 4c 4f 57 3a  N_FLT_UNDERFLOW:
11330 0a 09 63 61 73 65 20 45 58 43 45 50 54 49 4f 4e  ..case EXCEPTION
11340 5f 49 4e 54 5f 44 49 56 49 44 45 5f 42 59 5f 5a  _INT_DIVIDE_BY_Z
11350 45 52 4f 3a 0a 09 63 61 73 65 20 45 58 43 45 50  ERO:..case EXCEP
11360 54 49 4f 4e 5f 49 4e 54 5f 4f 56 45 52 46 4c 4f  TION_INT_OVERFLO
11370 57 3a 0a 09 20 20 20 20 2a 73 74 61 74 50 74 72  W:..    *statPtr
11380 20 3d 20 30 78 43 30 30 30 30 30 30 30 20 7c 20   = 0xC0000000 | 
11390 53 49 47 46 50 45 3b 0a 09 20 20 20 20 62 72 65  SIGFPE;..    bre
113a0 61 6b 3b 0a 0a 09 63 61 73 65 20 45 58 43 45 50  ak;...case EXCEP
113b0 54 49 4f 4e 5f 50 52 49 56 5f 49 4e 53 54 52 55  TION_PRIV_INSTRU
113c0 43 54 49 4f 4e 3a 0a 09 63 61 73 65 20 45 58 43  CTION:..case EXC
113d0 45 50 54 49 4f 4e 5f 49 4c 4c 45 47 41 4c 5f 49  EPTION_ILLEGAL_I
113e0 4e 53 54 52 55 43 54 49 4f 4e 3a 0a 09 20 20 20  NSTRUCTION:..   
113f0 20 2a 73 74 61 74 50 74 72 20 3d 20 30 78 43 30   *statPtr = 0xC0
11400 30 30 30 30 30 30 20 7c 20 53 49 47 49 4c 4c 3b  000000 | SIGILL;
11410 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
11420 61 73 65 20 45 58 43 45 50 54 49 4f 4e 5f 41 43  ase EXCEPTION_AC
11430 43 45 53 53 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a  CESS_VIOLATION:.
11440 09 63 61 73 65 20 45 58 43 45 50 54 49 4f 4e 5f  .case EXCEPTION_
11450 41 52 52 41 59 5f 42 4f 55 4e 44 53 5f 45 58 43  ARRAY_BOUNDS_EXC
11460 45 45 44 45 44 3a 0a 09 63 61 73 65 20 45 58 43  EEDED:..case EXC
11470 45 50 54 49 4f 4e 5f 53 54 41 43 4b 5f 4f 56 45  EPTION_STACK_OVE
11480 52 46 4c 4f 57 3a 0a 09 63 61 73 65 20 45 58 43  RFLOW:..case EXC
11490 45 50 54 49 4f 4e 5f 4e 4f 4e 43 4f 4e 54 49 4e  EPTION_NONCONTIN
114a0 55 41 42 4c 45 5f 45 58 43 45 50 54 49 4f 4e 3a  UABLE_EXCEPTION:
114b0 0a 09 63 61 73 65 20 45 58 43 45 50 54 49 4f 4e  ..case EXCEPTION
114c0 5f 49 4e 56 41 4c 49 44 5f 44 49 53 50 4f 53 49  _INVALID_DISPOSI
114d0 54 49 4f 4e 3a 0a 09 63 61 73 65 20 45 58 43 45  TION:..case EXCE
114e0 50 54 49 4f 4e 5f 47 55 41 52 44 5f 50 41 47 45  PTION_GUARD_PAGE
114f0 3a 0a 09 63 61 73 65 20 45 58 43 45 50 54 49 4f  :..case EXCEPTIO
11500 4e 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  N_INVALID_HANDLE
11510 3a 0a 09 20 20 20 20 2a 73 74 61 74 50 74 72 20  :..    *statPtr 
11520 3d 20 30 78 43 30 30 30 30 30 30 30 20 7c 20 53  = 0xC0000000 | S
11530 49 47 53 45 47 56 3b 0a 09 20 20 20 20 62 72 65  IGSEGV;..    bre
11540 61 6b 3b 0a 0a 09 63 61 73 65 20 45 58 43 45 50  ak;...case EXCEP
11550 54 49 4f 4e 5f 44 41 54 41 54 59 50 45 5f 4d 49  TION_DATATYPE_MI
11560 53 41 4c 49 47 4e 4d 45 4e 54 3a 0a 09 20 20 20  SALIGNMENT:..   
11570 20 2a 73 74 61 74 50 74 72 20 3d 20 30 78 43 30   *statPtr = 0xC0
11580 30 30 30 30 30 30 20 7c 20 53 49 47 42 55 53 3b  000000 | SIGBUS;
11590 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63  ..    break;...c
115a0 61 73 65 20 45 58 43 45 50 54 49 4f 4e 5f 42 52  ase EXCEPTION_BR
115b0 45 41 4b 50 4f 49 4e 54 3a 0a 09 63 61 73 65 20  EAKPOINT:..case 
115c0 45 58 43 45 50 54 49 4f 4e 5f 53 49 4e 47 4c 45  EXCEPTION_SINGLE
115d0 5f 53 54 45 50 3a 0a 09 20 20 20 20 2a 73 74 61  _STEP:..    *sta
115e0 74 50 74 72 20 3d 20 30 78 43 30 30 30 30 30 30  tPtr = 0xC000000
115f0 30 20 7c 20 53 49 47 54 52 41 50 3b 0a 09 20 20  0 | SIGTRAP;..  
11600 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20    break;...case 
11610 43 4f 4e 54 52 4f 4c 5f 43 5f 45 58 49 54 3a 0a  CONTROL_C_EXIT:.
11620 09 20 20 20 20 2a 73 74 61 74 50 74 72 20 3d 20  .    *statPtr = 
11630 30 78 43 30 30 30 30 30 30 30 20 7c 20 53 49 47  0xC0000000 | SIG
11640 49 4e 54 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  INT;..    break;
11650 0a 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20  ...default:..   
11660 20 2f 2a 0a 09 20 20 20 20 20 2a 20 4e 6f 6e 2d   /*..     * Non-
11670 65 78 63 65 70 74 69 6f 6e 61 6c 2c 20 6e 6f 72  exceptional, nor
11680 6d 61 6c 2c 20 65 78 69 74 20 63 6f 64 65 2e 20  mal, exit code. 
11690 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65 78  Note that the ex
116a0 69 74 20 63 6f 64 65 20 69 73 0a 09 20 20 20 20  it code is..    
116b0 20 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20   * truncated to 
116c0 61 20 73 69 67 6e 65 64 20 73 68 6f 72 74 20 72  a signed short r
116d0 61 6e 67 65 20 5b 2d 33 32 37 36 38 2c 33 32 37  ange [-32768,327
116e0 36 38 29 20 77 68 65 74 68 65 72 20 69 74 0a 09  68) whether it..
116f0 20 20 20 20 20 2a 20 66 69 74 73 20 69 6e 74 6f       * fits into
11700 20 74 68 69 73 20 72 61 6e 67 65 20 6f 72 20 6e   this range or n
11710 6f 74 2e 0a 09 20 20 20 20 20 2a 0a 09 20 20 20  ot...     *..   
11720 20 20 2a 20 42 55 47 3a 20 45 76 65 6e 20 74 68    * BUG: Even th
11730 6f 75 67 68 20 74 68 65 20 65 78 69 74 20 63 6f  ough the exit co
11740 64 65 20 69 73 20 61 20 44 57 4f 52 44 2c 20 69  de is a DWORD, i
11750 74 20 69 73 20 75 6e 64 65 72 73 74 6f 6f 64 20  t is understood 
11760 62 79 0a 09 20 20 20 20 20 2a 20 63 6f 6e 76 65  by..     * conve
11770 6e 74 69 6f 6e 20 74 6f 20 62 65 20 61 20 73 69  ntion to be a si
11780 67 6e 65 64 20 69 6e 74 65 67 65 72 2c 20 79 65  gned integer, ye
11790 74 20 74 68 65 72 65 20 69 73 6e 27 74 20 65 6e  t there isn't en
117a0 6f 75 67 68 20 72 6f 6f 6d 0a 09 20 20 20 20 20  ough room..     
117b0 2a 20 74 6f 20 66 69 74 20 74 68 69 73 20 69 6e  * to fit this in
117c0 74 6f 20 74 68 65 20 50 4f 53 49 58 20 73 74 79  to the POSIX sty
117d0 6c 65 20 77 61 69 74 73 74 61 74 75 73 20 6d 61  le waitstatus ma
117e0 73 6b 20 77 69 74 68 6f 75 74 0a 09 20 20 20 20  sk without..    
117f0 20 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74   * truncating it
11800 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  ...     */...   
11810 20 2a 73 74 61 74 50 74 72 20 3d 20 65 78 69 74   *statPtr = exit
11820 43 6f 64 65 3b 0a 09 20 20 20 20 62 72 65 61 6b  Code;..    break
11830 3b 0a 09 7d 0a 09 72 65 73 75 6c 74 20 3d 20 70  ;..}..result = p
11840 69 64 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  id;.    } else {
11850 0a 09 65 72 72 6e 6f 20 3d 20 45 43 48 49 4c 44  ..errno = ECHILD
11860 3b 0a 09 2a 73 74 61 74 50 74 72 20 3d 20 30 78  ;..*statPtr = 0x
11870 43 30 30 30 30 30 30 30 20 7c 20 45 43 48 49 4c  C0000000 | ECHIL
11880 44 3b 0a 09 72 65 73 75 6c 74 20 3d 20 28 54 63  D;..result = (Tc
11890 6c 5f 50 69 64 29 2d 31 3b 0a 20 20 20 20 7d 0a  l_Pid)-1;.    }.
118a0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4f  .    /*.     * O
118b0 66 66 69 63 69 61 6c 6c 79 20 63 6c 6f 73 65 20  fficially close 
118c0 74 68 65 20 70 72 6f 63 65 73 73 20 68 61 6e 64  the process hand
118d0 6c 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  le..     */..   
118e0 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 69 6e 66   CloseHandle(inf
118f0 6f 50 74 72 2d 3e 68 50 72 6f 63 65 73 73 29 3b  oPtr->hProcess);
11900 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 69 6e  .    Tcl_Free(in
11910 66 6f 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74  foPtr);..    ret
11920 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a  urn result;.}...
11930 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
11940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
11980 2a 20 54 63 6c 57 69 6e 41 64 64 50 72 6f 63 65  * TclWinAddProce
11990 73 73 20 2d 2d 0a 20 2a 0a 20 2a 09 41 64 64 20  ss --. *. *.Add 
119a0 61 20 70 72 6f 63 65 73 73 20 74 6f 20 74 68 65  a process to the
119b0 20 70 72 6f 63 65 73 73 20 6c 69 73 74 20 73 6f   process list so
119c0 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65   that we can use
119d0 20 54 63 6c 5f 57 61 69 74 50 69 64 20 6f 6e 0a   Tcl_WaitPid on.
119e0 20 2a 09 74 68 65 20 70 72 6f 63 65 73 73 2e 0a   *.the process..
119f0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
11a00 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
11a10 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64  e effects:. *.Ad
11a20 64 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ds the specified
11a30 20 70 72 6f 63 65 73 73 20 68 61 6e 64 6c 65 20   process handle 
11a40 74 6f 20 74 68 65 20 70 72 6f 63 65 73 73 20 6c  to the process l
11a50 69 73 74 20 73 6f 20 54 63 6c 5f 57 61 69 74 50  ist so Tcl_WaitP
11a60 69 64 0a 20 2a 09 6b 6e 6f 77 73 20 61 62 6f 75  id. *.knows abou
11a70 74 20 69 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  t it.. *. *-----
11a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ac0 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63 6c 57  -. */..void.TclW
11ad0 69 6e 41 64 64 50 72 6f 63 65 73 73 28 0a 20 20  inAddProcess(.  
11ae0 20 20 76 6f 69 64 20 2a 68 50 72 6f 63 65 73 73    void *hProcess
11af0 2c 09 09 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20  ,../* Handle to 
11b00 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 54  process */.    T
11b10 63 6c 5f 53 69 7a 65 20 69 64 29 09 09 2f 2a 20  cl_Size id)../* 
11b20 47 6c 6f 62 61 6c 20 70 72 6f 63 65 73 73 20 69  Global process i
11b30 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 7b 0a 20  dentifier */.{. 
11b40 20 20 20 50 72 6f 63 49 6e 66 6f 20 2a 70 72 6f     ProcInfo *pro
11b50 63 50 74 72 20 3d 20 28 50 72 6f 63 49 6e 66 6f  cPtr = (ProcInfo
11b60 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a   *)Tcl_Alloc(siz
11b70 65 6f 66 28 50 72 6f 63 49 6e 66 6f 29 29 3b 0a  eof(ProcInfo));.
11b80 0a 20 20 20 20 50 69 70 65 49 6e 69 74 28 29 3b  .    PipeInit();
11b90 0a 0a 20 20 20 20 70 72 6f 63 50 74 72 2d 3e 68  ..    procPtr->h
11ba0 50 72 6f 63 65 73 73 20 3d 20 68 50 72 6f 63 65  Process = hProce
11bb0 73 73 3b 0a 20 20 20 20 70 72 6f 63 50 74 72 2d  ss;.    procPtr-
11bc0 3e 64 77 50 72 6f 63 65 73 73 49 64 20 3d 20 28  >dwProcessId = (
11bd0 69 6e 74 29 69 64 3b 0a 20 20 20 20 54 63 6c 5f  int)id;.    Tcl_
11be0 4d 75 74 65 78 4c 6f 63 6b 28 26 70 69 70 65 4d  MutexLock(&pipeM
11bf0 75 74 65 78 29 3b 0a 20 20 20 20 70 72 6f 63 50  utex);.    procP
11c00 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 70 72  tr->nextPtr = pr
11c10 6f 63 4c 69 73 74 3b 0a 20 20 20 20 70 72 6f 63  ocList;.    proc
11c20 4c 69 73 74 20 3d 20 70 72 6f 63 50 74 72 3b 0a  List = procPtr;.
11c30 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c      Tcl_MutexUnl
11c40 6f 63 6b 28 26 70 69 70 65 4d 75 74 65 78 29 3b  ock(&pipeMutex);
11c50 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
11c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ca0 0a 20 2a 0a 20 2a 20 54 63 6c 5f 50 69 64 4f 62  . *. * Tcl_PidOb
11cb0 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
11cc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
11cd0 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
11ce0 73 20 74 68 65 20 22 70 69 64 22 20 54 63 6c 20  s the "pid" Tcl 
11cf0 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68 65  command. See the
11d00 0a 20 2a 09 75 73 65 72 20 64 6f 63 75 6d 65 6e  . *.user documen
11d10 74 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  tation for detai
11d20 6c 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f  ls on what it do
11d30 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  es.. *. * Result
11d40 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
11d50 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
11d60 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
11d70 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 72  . *.See the user
11d80 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a   documentation..
11d90 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
11da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
11de0 0a 69 6e 74 0a 54 63 6c 5f 50 69 64 4f 62 6a 43  .int.Tcl_PidObjC
11df0 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  md(.    TCL_UNUS
11e00 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20  ED(void *),.    
11e10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11e20 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  rp,../* Current 
11e30 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a  interpreter. */.
11e40 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09      int objc,...
11e50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
11e60 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54  uments. */.    T
11e70 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f  cl_Obj *const *o
11e80 62 6a 76 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74  bjv)./* Argument
11e90 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 7b 0a 20   strings. */.{. 
11ea0 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
11eb0 68 61 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 54  han;.    const T
11ec0 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2a  cl_ChannelType *
11ed0 63 68 61 6e 54 79 70 65 50 74 72 3b 0a 20 20 20  chanTypePtr;.   
11ee0 20 50 69 70 65 49 6e 66 6f 20 2a 70 69 70 65 50   PipeInfo *pipeP
11ef0 74 72 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 69  tr;.    size_t i
11f00 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72  ;.    Tcl_Obj *r
11f10 65 73 75 6c 74 50 74 72 3b 0a 0a 20 20 20 20 69  esultPtr;..    i
11f20 66 20 28 6f 62 6a 63 20 3e 20 32 29 20 7b 0a 09  f (objc > 2) {..
11f30 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11f40 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11f50 2c 20 22 3f 63 68 61 6e 6e 65 6c 3f 22 29 3b 0a  , "?channel?");.
11f60 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
11f70 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
11f80 28 6f 62 6a 63 20 3d 3d 20 31 29 20 7b 0a 09 54  (objc == 1) {..T
11f90 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11fa0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
11fb0 69 64 65 49 6e 74 4f 62 6a 28 67 65 74 70 69 64  ideIntObj(getpid
11fc0 28 29 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ()));.    } else
11fd0 20 7b 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47   {..chan = Tcl_G
11fe0 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
11ff0 2c 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f  , TclGetString(o
12000 62 6a 76 5b 31 5d 29 2c 0a 09 09 4e 55 4c 4c 29  bjv[1]),...NULL)
12010 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28  ;..if (chan == (
12020 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
12030 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  L) {..    return
12040 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09   TCL_ERROR;..}..
12050 63 68 61 6e 54 79 70 65 50 74 72 20 3d 20 54 63  chanTypePtr = Tc
12060 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
12070 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 63 68 61  (chan);..if (cha
12080 6e 54 79 70 65 50 74 72 20 21 3d 20 26 70 69 70  nTypePtr != &pip
12090 65 43 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a  eChannelType) {.
120a0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
120b0 4f 4b 3b 0a 09 7d 0a 0a 09 70 69 70 65 50 74 72  OK;..}...pipePtr
120c0 20 3d 20 28 50 69 70 65 49 6e 66 6f 20 2a 29 20   = (PipeInfo *) 
120d0 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
120e0 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
120f0 3b 0a 09 54 63 6c 4e 65 77 4f 62 6a 28 72 65 73  ;..TclNewObj(res
12100 75 6c 74 50 74 72 29 3b 0a 09 66 6f 72 20 28 69  ultPtr);..for (i
12110 20 3d 20 30 3b 20 69 20 3c 20 70 69 70 65 50 74   = 0; i < pipePt
12120 72 2d 3e 6e 75 6d 50 69 64 73 3b 20 69 2b 2b 29  r->numPids; i++)
12130 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
12140 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12150 28 2f 2a 69 6e 74 65 72 70 2a 2f 20 4e 55 4c 4c  (/*interp*/ NULL
12160 2c 20 72 65 73 75 6c 74 50 74 72 2c 0a 09 09 20  , resultPtr,... 
12170 20 20 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e     Tcl_NewWideIn
12180 74 4f 62 6a 28 0a 09 09 09 20 20 20 20 54 63 6c  tObj(....    Tcl
12190 70 47 65 74 50 69 64 28 70 69 70 65 50 74 72 2d  pGetPid(pipePtr-
121a0 3e 70 69 64 50 74 72 5b 69 5d 29 29 29 3b 0a 09  >pidPtr[i])));..
121b0 7d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  }..Tcl_SetObjRes
121c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75  ult(interp, resu
121d0 6c 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ltPtr);.    }.  
121e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
121f0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
12200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12240 0a 20 2a 0a 20 2a 20 57 61 69 74 46 6f 72 52 65  . *. * WaitForRe
12250 61 64 20 2d 2d 0a 20 2a 0a 20 2a 09 57 61 69 74  ad --. *. *.Wait
12260 20 75 6e 74 69 6c 20 73 6f 6d 65 20 64 61 74 61   until some data
12270 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74   is available, t
12280 68 65 20 70 69 70 65 20 69 73 20 61 74 20 45 4f  he pipe is at EO
12290 46 20 6f 72 20 74 68 65 20 72 65 61 64 65 72 0a  F or the reader.
122a0 20 2a 09 74 68 72 65 61 64 20 69 73 20 62 6c 6f   *.thread is blo
122b0 63 6b 65 64 20 77 61 69 74 69 6e 67 20 66 6f 72  cked waiting for
122c0 20 64 61 74 61 20 28 69 66 20 74 68 65 20 63 68   data (if the ch
122d0 61 6e 6e 65 6c 20 69 73 20 69 6e 20 6e 6f 6e 2d  annel is in non-
122e0 62 6c 6f 63 6b 69 6e 67 0a 20 2a 09 6d 6f 64 65  blocking. *.mode
122f0 29 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ).. *. * Results
12300 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 31 20 69  :. *.Returns 1 i
12310 66 20 70 69 70 65 20 69 73 20 72 65 61 64 61 62  f pipe is readab
12320 6c 65 2e 20 52 65 74 75 72 6e 73 20 30 20 69 66  le. Returns 0 if
12330 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 61 74   there is no dat
12340 61 20 6f 6e 20 74 68 65 0a 20 2a 09 70 69 70 65  a on the. *.pipe
12350 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20 62  , but there is b
12360 75 66 66 65 72 65 64 20 64 61 74 61 2e 20 52 65  uffered data. Re
12370 74 75 72 6e 73 20 2d 31 20 69 66 20 61 6e 20 65  turns -1 if an e
12380 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2e 20 49  rror occurred. I
12390 66 0a 20 2a 09 61 6e 20 65 72 72 6f 72 20 6f 63  f. *.an error oc
123a0 63 75 72 72 65 64 2c 20 74 68 65 20 74 68 72 65  curred, the thre
123b0 61 64 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 73  ads may not be s
123c0 79 6e 63 68 72 6f 6e 69 7a 65 64 2e 0a 20 2a 0a  ynchronized.. *.
123d0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
123e0 0a 20 2a 09 55 70 64 61 74 65 73 20 74 68 65 20  . *.Updates the 
123f0 73 68 61 72 65 64 20 73 74 61 74 65 20 66 6c 61  shared state fla
12400 67 73 20 61 6e 64 20 6d 61 79 20 63 6f 6e 73 75  gs and may consu
12410 6d 65 20 31 20 62 79 74 65 20 6f 66 20 64 61 74  me 1 byte of dat
12420 61 20 66 72 6f 6d 20 74 68 65 0a 20 2a 09 70 69  a from the. *.pi
12430 70 65 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  pe. If no error 
12440 6f 63 63 75 72 72 65 64 2c 20 74 68 65 20 72 65  occurred, the re
12450 61 64 65 72 20 74 68 72 65 61 64 20 69 73 20 62  ader thread is b
12460 6c 6f 63 6b 65 64 20 77 61 69 74 69 6e 67 20 66  locked waiting f
12470 6f 72 20 61 0a 20 2a 09 73 69 67 6e 61 6c 20 66  or a. *.signal f
12480 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 68 72  rom the main thr
12490 65 61 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ead.. *. *------
124a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124e0 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
124f0 0a 57 61 69 74 46 6f 72 52 65 61 64 28 0a 20 20  .WaitForRead(.  
12500 20 20 50 69 70 65 49 6e 66 6f 20 2a 69 6e 66 6f    PipeInfo *info
12510 50 74 72 2c 09 09 2f 2a 20 50 69 70 65 20 73 74  Ptr,../* Pipe st
12520 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ate. */.    int 
12530 62 6c 6f 63 6b 69 6e 67 29 09 09 2f 2a 20 49 6e  blocking)../* In
12540 64 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20  dicates whether 
12550 63 61 6c 6c 20 73 68 6f 75 6c 64 20 62 65 20 62  call should be b
12560 6c 6f 63 6b 69 6e 67 0a 09 09 09 09 20 2a 20 6f  locking..... * o
12570 72 20 6e 6f 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20  r not. */.{.    
12580 44 57 4f 52 44 20 74 69 6d 65 6f 75 74 2c 20 63  DWORD timeout, c
12590 6f 75 6e 74 3b 0a 20 20 20 20 48 41 4e 44 4c 45  ount;.    HANDLE
125a0 20 68 61 6e 64 6c 65 20 3d 20 28 28 57 69 6e 46   handle = ((WinF
125b0 69 6c 65 20 2a 29 20 69 6e 66 6f 50 74 72 2d 3e  ile *) infoPtr->
125c0 72 65 61 64 46 69 6c 65 29 2d 3e 68 61 6e 64 6c  readFile)->handl
125d0 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 31  e;..    while (1
125e0 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 79 6e 63  ) {../*.. * Sync
125f0 68 72 6f 6e 69 7a 65 20 77 69 74 68 20 74 68 65  hronize with the
12600 20 72 65 61 64 65 72 20 74 68 72 65 61 64 2e 0a   reader thread..
12610 09 20 2a 2f 0a 0a 09 2f 2a 20 61 76 6f 69 64 20  . */.../* avoid 
12620 62 6c 6f 63 6b 69 6e 67 20 69 66 20 70 69 70 65  blocking if pipe
12630 2d 74 68 72 65 61 64 20 65 78 69 74 65 64 20 2a  -thread exited *
12640 2f 0a 09 74 69 6d 65 6f 75 74 20 3d 20 28 21 62  /..timeout = (!b
12650 6c 6f 63 6b 69 6e 67 20 7c 7c 20 21 54 63 6c 50  locking || !TclP
12660 69 70 65 54 68 72 65 61 64 49 73 41 6c 69 76 65  ipeThreadIsAlive
12670 28 26 69 6e 66 6f 50 74 72 2d 3e 72 65 61 64 54  (&infoPtr->readT
12680 49 29 0a 09 09 7c 7c 20 54 63 6c 49 6e 45 78 69  I)...|| TclInExi
12690 74 28 29 20 7c 7c 20 54 63 6c 49 6e 54 68 72 65  t() || TclInThre
126a0 61 64 45 78 69 74 28 29 29 20 3f 20 30 20 3a 20  adExit()) ? 0 : 
126b0 49 4e 46 49 4e 49 54 45 3b 0a 09 69 66 20 28 57  INFINITE;..if (W
126c0 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
126d0 63 74 28 69 6e 66 6f 50 74 72 2d 3e 72 65 61 64  ct(infoPtr->read
126e0 61 62 6c 65 2c 20 74 69 6d 65 6f 75 74 29 20 3d  able, timeout) =
126f0 3d 20 57 41 49 54 5f 54 49 4d 45 4f 55 54 29 20  = WAIT_TIMEOUT) 
12700 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20  {..    /*..     
12710 2a 20 54 68 65 20 72 65 61 64 65 72 20 74 68 72  * The reader thr
12720 65 61 64 20 69 73 20 62 6c 6f 63 6b 65 64 20 77  ead is blocked w
12730 61 69 74 69 6e 67 20 66 6f 72 20 64 61 74 61 20  aiting for data 
12740 61 6e 64 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a  and the channel.
12750 09 20 20 20 20 20 2a 20 69 73 20 69 6e 20 6e 6f  .     * is in no
12760 6e 2d 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e  n-blocking mode.
12770 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
12780 65 72 72 6e 6f 20 3d 20 45 57 4f 55 4c 44 42 4c  errno = EWOULDBL
12790 4f 43 4b 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  OCK;..    return
127a0 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a   -1;..}.../*.. *
127b0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
127c0 74 68 65 20 74 77 6f 20 74 68 72 65 61 64 73 20  the two threads 
127d0 61 72 65 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  are synchronized
127e0 2c 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20  , so it is safe 
127f0 74 6f 0a 09 20 2a 20 61 63 63 65 73 73 20 73 68  to.. * access sh
12800 61 72 65 64 20 73 74 61 74 65 2e 0a 09 20 2a 2f  ared state... */
12810 0a 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 74 68 65  .../*.. * If the
12820 20 70 69 70 65 20 68 61 73 20 68 69 74 20 45 4f   pipe has hit EO
12830 46 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  F, it is always 
12840 72 65 61 64 61 62 6c 65 2e 0a 09 20 2a 2f 0a 0a  readable... */..
12850 09 69 66 20 28 69 6e 66 6f 50 74 72 2d 3e 72 65  .if (infoPtr->re
12860 61 64 46 6c 61 67 73 20 26 20 50 49 50 45 5f 45  adFlags & PIPE_E
12870 4f 46 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  OF) {..    retur
12880 6e 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  n 1;..}.../*.. *
12890 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
128a0 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 64 61   there is any da
128b0 74 61 20 73 69 74 74 69 6e 67 20 69 6e 20 74 68  ta sitting in th
128c0 65 20 70 69 70 65 2e 0a 09 20 2a 2f 0a 0a 09 69  e pipe... */...i
128d0 66 20 28 50 65 65 6b 4e 61 6d 65 64 50 69 70 65  f (PeekNamedPipe
128e0 28 68 61 6e 64 6c 65 2c 20 28 4c 50 56 4f 49 44  (handle, (LPVOID
128f0 29 20 4e 55 4c 4c 2c 20 28 44 57 4f 52 44 29 20  ) NULL, (DWORD) 
12900 30 2c 0a 09 09 28 4c 50 44 57 4f 52 44 29 20 4e  0,...(LPDWORD) N
12910 55 4c 4c 2c 20 26 63 6f 75 6e 74 2c 20 28 4c 50  ULL, &count, (LP
12920 44 57 4f 52 44 29 20 4e 55 4c 4c 29 20 21 3d 20  DWORD) NULL) != 
12930 54 52 55 45 29 20 7b 0a 09 20 20 20 20 54 63 6c  TRUE) {..    Tcl
12940 5f 57 69 6e 43 6f 6e 76 65 72 74 45 72 72 6f 72  _WinConvertError
12950 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  (GetLastError())
12960 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20  ;...    /*..    
12970 20 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20   * Check to see 
12980 69 66 20 74 68 65 20 70 65 65 6b 20 66 61 69 6c  if the peek fail
12990 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 45 4f  ed because of EO
129a0 46 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  F...     */...  
129b0 20 20 69 66 20 28 65 72 72 6e 6f 20 3d 3d 20 45    if (errno == E
129c0 50 49 50 45 29 20 7b 0a 09 09 69 6e 66 6f 50 74  PIPE) {...infoPt
129d0 72 2d 3e 72 65 61 64 46 6c 61 67 73 20 7c 3d 20  r->readFlags |= 
129e0 50 49 50 45 5f 45 4f 46 3b 0a 09 09 72 65 74 75  PIPE_EOF;...retu
129f0 72 6e 20 31 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  rn 1;..    }... 
12a00 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 49 67     /*..     * Ig
12a10 6e 6f 72 65 20 65 72 72 6f 72 73 20 69 66 20 74  nore errors if t
12a20 68 65 72 65 20 69 73 20 64 61 74 61 20 69 6e 20  here is data in 
12a30 74 68 65 20 62 75 66 66 65 72 2e 0a 09 20 20 20  the buffer...   
12a40 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 69    */...    if (i
12a50 6e 66 6f 50 74 72 2d 3e 72 65 61 64 46 6c 61 67  nfoPtr->readFlag
12a60 73 20 26 20 50 49 50 45 5f 45 58 54 52 41 42 59  s & PIPE_EXTRABY
12a70 54 45 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 30  TE) {...return 0
12a80 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
12a90 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 20 20  ..return -1;..  
12aa0 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20    }..}.../*.. * 
12ab0 57 65 20 66 6f 75 6e 64 20 73 6f 6d 65 20 64 61  We found some da
12ac0 74 61 20 69 6e 20 74 68 65 20 70 69 70 65 2c 20  ta in the pipe, 
12ad0 73 6f 20 69 74 20 6d 75 73 74 20 62 65 20 72 65  so it must be re
12ae0 61 64 61 62 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 69  adable... */...i
12af0 66 20 28 63 6f 75 6e 74 20 3e 20 30 29 20 7b 0a  f (count > 0) {.
12b00 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09  .    return 1;..
12b10 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 70  }.../*.. * The p
12b20 69 70 65 20 69 73 6e 27 74 20 72 65 61 64 61 62  ipe isn't readab
12b30 6c 65 2c 20 62 75 74 20 74 68 65 72 65 20 69 73  le, but there is
12b40 20 73 6f 6d 65 20 64 61 74 61 20 73 69 74 74 69   some data sitti
12b50 6e 67 20 69 6e 20 74 68 65 0a 09 20 2a 20 62 75  ng in the.. * bu
12b60 66 66 65 72 2c 20 73 6f 20 72 65 74 75 72 6e 20  ffer, so return 
12b70 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 09 20 2a  immediately... *
12b80 2f 0a 0a 09 69 66 20 28 69 6e 66 6f 50 74 72 2d  /...if (infoPtr-
12b90 3e 72 65 61 64 46 6c 61 67 73 20 26 20 50 49 50  >readFlags & PIP
12ba0 45 5f 45 58 54 52 41 42 59 54 45 29 20 7b 0a 09  E_EXTRABYTE) {..
12bb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d      return 0;..}
12bc0 0a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 72 65 20  .../*.. * There 
12bd0 77 61 73 6e 27 74 20 61 6e 79 20 64 61 74 61 20  wasn't any data 
12be0 61 76 61 69 6c 61 62 6c 65 2c 20 73 6f 20 72 65  available, so re
12bf0 73 65 74 20 74 68 65 20 74 68 72 65 61 64 20 61  set the thread a
12c00 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 0a 09 20  nd try again... 
12c10 2a 2f 0a 0a 09 52 65 73 65 74 45 76 65 6e 74 28  */...ResetEvent(
12c20 69 6e 66 6f 50 74 72 2d 3e 72 65 61 64 61 62 6c  infoPtr->readabl
12c30 65 29 3b 0a 09 54 63 6c 50 69 70 65 54 68 72 65  e);..TclPipeThre
12c40 61 64 53 69 67 6e 61 6c 28 26 69 6e 66 6f 50 74  adSignal(&infoPt
12c50 72 2d 3e 72 65 61 64 54 49 29 3b 0a 20 20 20 20  r->readTI);.    
12c60 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  }.}.../*. *-----
12c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12cb0 2d 0a 20 2a 0a 20 2a 20 50 69 70 65 52 65 61 64  -. *. * PipeRead
12cc0 65 72 54 68 72 65 61 64 20 2d 2d 0a 20 2a 0a 20  erThread --. *. 
12cd0 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
12ce0 72 75 6e 73 20 69 6e 20 61 20 73 65 70 61 72 61  runs in a separa
12cf0 74 65 20 74 68 72 65 61 64 20 61 6e 64 20 77 61  te thread and wa
12d00 69 74 73 20 66 6f 72 20 69 6e 70 75 74 20 74 6f  its for input to
12d10 20 62 65 63 6f 6d 65 0a 20 2a 09 61 76 61 69 6c   become. *.avail
12d20 61 62 6c 65 20 6f 6e 20 61 20 70 69 70 65 2e 0a  able on a pipe..
12d30 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
12d40 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69  *.None.. *. * Si
12d50 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
12d60 69 67 6e 61 6c 73 20 74 68 65 20 6d 61 69 6e 20  ignals the main 
12d70 74 68 72 65 61 64 20 77 68 65 6e 20 69 6e 70 75  thread when inpu
12d80 74 20 62 65 63 6f 6d 65 20 61 76 61 69 6c 61 62  t become availab
12d90 6c 65 2e 20 4d 61 79 20 63 61 75 73 65 20 74 68  le. May cause th
12da0 65 0a 20 2a 09 6d 61 69 6e 20 74 68 72 65 61 64  e. *.main thread
12db0 20 74 6f 20 77 61 6b 65 20 75 70 20 62 79 20 70   to wake up by p
12dc0 6f 73 74 69 6e 67 20 61 20 6d 65 73 73 61 67 65  osting a message
12dd0 2e 20 4d 61 79 20 63 6f 6e 73 75 6d 65 20 6f 6e  . May consume on
12de0 65 20 62 79 74 65 20 66 72 6f 6d 0a 20 2a 09 74  e byte from. *.t
12df0 68 65 20 70 69 70 65 20 66 6f 72 20 65 61 63 68  he pipe for each
12e00 20 77 61 69 74 20 6f 70 65 72 61 74 69 6f 6e 2e   wait operation.
12e10 20 57 69 6c 6c 20 63 61 75 73 65 20 61 20 6d 65   Will cause a me
12e20 6d 6f 72 79 20 6c 65 61 6b 20 6f 66 20 7e 34 6b  mory leak of ~4k
12e30 2c 20 69 66 0a 20 2a 09 66 6f 72 63 65 66 75 6c  , if. *.forceful
12e40 6c 79 20 74 65 72 6d 69 6e 61 74 65 64 20 77 69  ly terminated wi
12e50 74 68 20 54 65 72 6d 69 6e 61 74 65 54 68 72 65  th TerminateThre
12e60 61 64 28 29 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ad().. *. *-----
12e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12eb0 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 44 57  -. */..static DW
12ec0 4f 52 44 20 57 49 4e 41 50 49 0a 50 69 70 65 52  ORD WINAPI.PipeR
12ed0 65 61 64 65 72 54 68 72 65 61 64 28 0a 20 20 20  eaderThread(.   
12ee0 20 4c 50 56 4f 49 44 20 61 72 67 29 0a 7b 0a 20   LPVOID arg).{. 
12ef0 20 20 20 54 63 6c 50 69 70 65 54 68 72 65 61 64     TclPipeThread
12f00 49 6e 66 6f 20 2a 70 69 70 65 54 49 20 3d 20 28  Info *pipeTI = (
12f10 54 63 6c 50 69 70 65 54 68 72 65 61 64 49 6e 66  TclPipeThreadInf
12f20 6f 20 2a 29 20 61 72 67 3b 0a 20 20 20 20 50 69  o *) arg;.    Pi
12f30 70 65 49 6e 66 6f 20 2a 69 6e 66 6f 50 74 72 20  peInfo *infoPtr 
12f40 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 61 63 63 65 73  = NULL;./* acces
12f50 73 20 69 6e 66 6f 20 6f 6e 6c 79 20 61 66 74 65  s info only afte
12f60 72 20 73 75 63 63 65 73 73 20 69 6e 69 74 2f 77  r success init/w
12f70 61 69 74 20 2a 2f 0a 20 20 20 20 48 41 4e 44 4c  ait */.    HANDL
12f80 45 20 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b  E handle = NULL;
12f90 0a 20 20 20 20 44 57 4f 52 44 20 63 6f 75 6e 74  .    DWORD count
12fa0 2c 20 65 72 72 3b 0a 20 20 20 20 69 6e 74 20 64  , err;.    int d
12fb0 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 20 20 77 68  one = 0;..    wh
12fc0 69 6c 65 20 28 21 64 6f 6e 65 29 20 7b 0a 09 2f  ile (!done) {../
12fd0 2a 0a 09 20 2a 20 57 61 69 74 20 66 6f 72 20 74  *.. * Wait for t
12fe0 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20 74  he main thread t
12ff0 6f 20 73 69 67 6e 61 6c 20 62 65 66 6f 72 65 20  o signal before 
13000 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 77 61  attempting to wa
13010 69 74 20 6f 6e 20 74 68 65 0a 09 20 2a 20 70 69  it on the.. * pi
13020 70 65 20 62 65 63 6f 6d 69 6e 67 20 72 65 61 64  pe becoming read
13030 61 62 6c 65 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20  able... */...if 
13040 28 21 54 63 6c 50 69 70 65 54 68 72 65 61 64 57  (!TclPipeThreadW
13050 61 69 74 46 6f 72 53 69 67 6e 61 6c 28 26 70 69  aitForSignal(&pi
13060 70 65 54 49 29 29 20 7b 0a 09 20 20 20 20 2f 2a  peTI)) {..    /*
13070 20 65 78 69 74 20 2a 2f 0a 09 20 20 20 20 62 72   exit */..    br
13080 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 69  eak;..}...if (!i
13090 6e 66 6f 50 74 72 29 20 7b 0a 09 20 20 20 20 69  nfoPtr) {..    i
130a0 6e 66 6f 50 74 72 20 3d 20 28 50 69 70 65 49 6e  nfoPtr = (PipeIn
130b0 66 6f 20 2a 29 20 70 69 70 65 54 49 2d 3e 63 6c  fo *) pipeTI->cl
130c0 69 65 6e 74 44 61 74 61 3b 0a 09 20 20 20 20 68  ientData;..    h
130d0 61 6e 64 6c 65 20 3d 20 28 28 57 69 6e 46 69 6c  andle = ((WinFil
130e0 65 20 2a 29 20 69 6e 66 6f 50 74 72 2d 3e 72 65  e *) infoPtr->re
130f0 61 64 46 69 6c 65 29 2d 3e 68 61 6e 64 6c 65 3b  adFile)->handle;
13100 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 54 72 79  ..}.../*.. * Try
13110 20 77 61 69 74 69 6e 67 20 66 6f 72 20 30 20 62   waiting for 0 b
13120 79 74 65 73 2e 20 54 68 69 73 20 77 69 6c 6c 20  ytes. This will 
13130 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 73 6f 6d 65  block until some
13140 20 64 61 74 61 20 69 73 0a 09 20 2a 20 61 76 61   data is.. * ava
13150 69 6c 61 62 6c 65 20 6f 6e 20 4e 54 2c 20 62 75  ilable on NT, bu
13160 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d  t will return im
13170 6d 65 64 69 61 74 65 6c 79 20 6f 6e 20 57 69 6e  mediately on Win
13180 20 39 35 2e 20 53 6f 2c 20 69 66 20 6e 6f 0a 09   95. So, if no..
13190 20 2a 20 64 61 74 61 20 69 73 20 61 76 61 69 6c   * data is avail
131a0 61 62 6c 65 20 61 66 74 65 72 20 74 68 65 20 66  able after the f
131b0 69 72 73 74 20 72 65 61 64 2c 20 77 65 20 62 6c  irst read, we bl
131c0 6f 63 6b 20 75 6e 74 69 6c 20 77 65 20 63 61 6e  ock until we can
131d0 20 72 65 61 64 0a 09 20 2a 20 61 20 73 69 6e 67   read.. * a sing
131e0 6c 65 20 62 79 74 65 20 6f 66 66 20 6f 66 20 74  le byte off of t
131f0 68 65 20 70 69 70 65 2e 0a 09 20 2a 2f 0a 0a 09  he pipe... */...
13200 69 66 20 28 52 65 61 64 46 69 6c 65 28 68 61 6e  if (ReadFile(han
13210 64 6c 65 2c 20 4e 55 4c 4c 2c 20 30 2c 20 26 63  dle, NULL, 0, &c
13220 6f 75 6e 74 2c 20 4e 55 4c 4c 29 20 3d 3d 20 46  ount, NULL) == F
13230 41 4c 53 45 20 7c 7c 0a 09 09 50 65 65 6b 4e 61  ALSE ||...PeekNa
13240 6d 65 64 50 69 70 65 28 68 61 6e 64 6c 65 2c 20  medPipe(handle, 
13250 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 26  NULL, 0, NULL, &
13260 63 6f 75 6e 74 2c 20 4e 55 4c 4c 29 20 3d 3d 20  count, NULL) == 
13270 46 41 4c 53 45 29 20 7b 0a 09 20 20 20 20 2f 2a  FALSE) {..    /*
13280 0a 09 20 20 20 20 20 2a 20 54 68 65 20 65 72 72  ..     * The err
13290 6f 72 20 69 73 20 61 20 72 65 73 75 6c 74 20 6f  or is a result o
132a0 66 20 61 6e 20 45 4f 46 20 63 6f 6e 64 69 74 69  f an EOF conditi
132b0 6f 6e 2c 20 73 6f 20 73 65 74 20 74 68 65 20 45  on, so set the E
132c0 4f 46 20 62 69 74 0a 09 20 20 20 20 20 2a 20 62  OF bit..     * b
132d0 65 66 6f 72 65 20 73 69 67 6e 61 6c 6c 69 6e 67  efore signalling
132e0 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64   the main thread
132f0 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  ...     */...   
13300 20 65 72 72 20 3d 20 47 65 74 4c 61 73 74 45 72   err = GetLastEr
13310 72 6f 72 28 29 3b 0a 09 20 20 20 20 69 66 20 28  ror();..    if (
13320 65 72 72 20 3d 3d 20 45 52 52 4f 52 5f 42 52 4f  err == ERROR_BRO
13330 4b 45 4e 5f 50 49 50 45 29 20 7b 0a 09 09 69 6e  KEN_PIPE) {...in
13340 66 6f 50 74 72 2d 3e 72 65 61 64 46 6c 61 67 73  foPtr->readFlags
13350 20 7c 3d 20 50 49 50 45 5f 45 4f 46 3b 0a 09 09   |= PIPE_EOF;...
13360 64 6f 6e 65 20 3d 20 31 3b 0a 09 20 20 20 20 7d  done = 1;..    }
13370 20 65 6c 73 65 20 69 66 20 28 65 72 72 20 3d 3d   else if (err ==
13380 20 45 52 52 4f 52 5f 49 4e 56 41 4c 49 44 5f 48   ERROR_INVALID_H
13390 41 4e 44 4c 45 29 20 7b 0a 09 09 64 6f 6e 65 20  ANDLE) {...done 
133a0 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65  = 1;..    }..} e
133b0 6c 73 65 20 69 66 20 28 63 6f 75 6e 74 20 3d 3d  lse if (count ==
133c0 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 52   0) {..    if (R
133d0 65 61 64 46 69 6c 65 28 68 61 6e 64 6c 65 2c 20  eadFile(handle, 
133e0 26 28 69 6e 66 6f 50 74 72 2d 3e 65 78 74 72 61  &(infoPtr->extra
133f0 42 79 74 65 29 2c 20 31 2c 20 26 63 6f 75 6e 74  Byte), 1, &count
13400 2c 20 4e 55 4c 4c 29 0a 09 09 20 20 20 20 21 3d  , NULL)...    !=
13410 20 46 41 4c 53 45 29 20 7b 0a 09 09 2f 2a 0a 09   FALSE) {.../*..
13420 09 20 2a 20 4f 6e 65 20 62 79 74 65 20 77 61 73  . * One byte was
13430 20 63 6f 6e 73 75 6d 65 64 20 61 73 20 61 20 73   consumed as a s
13440 69 64 65 20 65 66 66 65 63 74 20 6f 66 20 77 61  ide effect of wa
13450 69 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 09 09  iting for the...
13460 20 2a 20 70 69 70 65 20 74 6f 20 62 65 63 6f 6d   * pipe to becom
13470 65 20 72 65 61 64 61 62 6c 65 2e 0a 09 09 20 2a  e readable.... *
13480 2f 0a 0a 09 09 69 6e 66 6f 50 74 72 2d 3e 72 65  /....infoPtr->re
13490 61 64 46 6c 61 67 73 20 7c 3d 20 50 49 50 45 5f  adFlags |= PIPE_
134a0 45 58 54 52 41 42 59 54 45 3b 0a 09 20 20 20 20  EXTRABYTE;..    
134b0 7d 20 65 6c 73 65 20 7b 0a 09 09 65 72 72 20 3d  } else {...err =
134c0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
134d0 0a 09 09 69 66 20 28 65 72 72 20 3d 3d 20 45 52  ...if (err == ER
134e0 52 4f 52 5f 42 52 4f 4b 45 4e 5f 50 49 50 45 29  ROR_BROKEN_PIPE)
134f0 20 7b 0a 09 09 20 20 20 20 2f 2a 0a 09 09 20 20   {...    /*...  
13500 20 20 20 2a 20 54 68 65 20 65 72 72 6f 72 20 69     * The error i
13510 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  s a result of an
13520 20 45 4f 46 20 63 6f 6e 64 69 74 69 6f 6e 2c 20   EOF condition, 
13530 73 6f 20 73 65 74 20 74 68 65 0a 09 09 20 20 20  so set the...   
13540 20 20 2a 20 45 4f 46 20 62 69 74 20 62 65 66 6f    * EOF bit befo
13550 72 65 20 73 69 67 6e 61 6c 6c 69 6e 67 20 74 68  re signalling th
13560 65 20 6d 61 69 6e 20 74 68 72 65 61 64 2e 0a 09  e main thread...
13570 09 20 20 20 20 20 2a 2f 0a 0a 09 09 20 20 20 20  .     */....    
13580 69 6e 66 6f 50 74 72 2d 3e 72 65 61 64 46 6c 61  infoPtr->readFla
13590 67 73 20 7c 3d 20 50 49 50 45 5f 45 4f 46 3b 0a  gs |= PIPE_EOF;.
135a0 09 09 20 20 20 20 64 6f 6e 65 20 3d 20 31 3b 0a  ..    done = 1;.
135b0 09 09 7d 20 65 6c 73 65 20 69 66 20 28 65 72 72  ..} else if (err
135c0 20 3d 3d 20 45 52 52 4f 52 5f 49 4e 56 41 4c 49   == ERROR_INVALI
135d0 44 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09 20 20  D_HANDLE) {...  
135e0 20 20 64 6f 6e 65 20 3d 20 31 3b 0a 09 09 7d 0a    done = 1;...}.
135f0 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 0a 09  .    }..}.../*..
13600 20 2a 20 53 69 67 6e 61 6c 20 74 68 65 20 6d 61   * Signal the ma
13610 69 6e 20 74 68 72 65 61 64 20 62 79 20 73 69 67  in thread by sig
13620 6e 61 6c 6c 69 6e 67 20 74 68 65 20 72 65 61 64  nalling the read
13630 61 62 6c 65 20 65 76 65 6e 74 20 61 6e 64 20 74  able event and t
13640 68 65 6e 0a 09 20 2a 20 77 61 6b 69 6e 67 20 75  hen.. * waking u
13650 70 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 74  p the notifier t
13660 68 72 65 61 64 2e 0a 09 20 2a 2f 0a 0a 09 53 65  hread... */...Se
13670 74 45 76 65 6e 74 28 69 6e 66 6f 50 74 72 2d 3e  tEvent(infoPtr->
13680 72 65 61 64 61 62 6c 65 29 3b 0a 0a 09 2f 2a 0a  readable);.../*.
13690 09 20 2a 20 41 6c 65 72 74 20 74 68 65 20 66 6f  . * Alert the fo
136a0 72 65 67 72 6f 75 6e 64 20 74 68 72 65 61 64 2e  reground thread.
136b0 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 6e 65   Note that we ne
136c0 65 64 20 74 6f 20 74 72 65 61 74 20 74 68 69 73  ed to treat this
136d0 20 6c 69 6b 65 20 61 0a 09 20 2a 20 63 72 69 74   like a.. * crit
136e0 69 63 61 6c 20 73 65 63 74 69 6f 6e 20 73 6f 20  ical section so 
136f0 74 68 65 20 66 6f 72 65 67 72 6f 75 6e 64 20 74  the foreground t
13700 68 72 65 61 64 20 64 6f 65 73 20 6e 6f 74 20 74  hread does not t
13710 65 72 6d 69 6e 61 74 65 20 74 68 69 73 0a 09 20  erminate this.. 
13720 2a 20 74 68 72 65 61 64 20 77 68 69 6c 65 20 77  * thread while w
13730 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20  e are holding a 
13740 6d 75 74 65 78 20 69 6e 20 74 68 65 20 6e 6f 74  mutex in the not
13750 69 66 69 65 72 20 63 6f 64 65 2e 0a 09 20 2a 2f  ifier code... */
13760 0a 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b  ...Tcl_MutexLock
13770 28 26 70 69 70 65 4d 75 74 65 78 29 3b 0a 09 69  (&pipeMutex);..i
13780 66 20 28 69 6e 66 6f 50 74 72 2d 3e 74 68 72 65  f (infoPtr->thre
13790 61 64 49 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  adId != NULL) {.
137a0 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
137b0 54 49 50 20 23 32 31 38 2e 20 57 68 65 6e 20 69  TIP #218. When i
137c0 6e 20 66 6c 69 67 68 74 20 69 67 6e 6f 72 65 20  n flight ignore 
137d0 74 68 65 20 65 76 65 6e 74 2c 20 6e 6f 20 6f 6e  the event, no on
137e0 65 20 77 69 6c 6c 20 72 65 63 65 69 76 65 0a 09  e will receive..
137f0 20 20 20 20 20 2a 20 69 74 20 61 6e 79 77 61 79       * it anyway
13800 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  ...     */...   
13810 20 54 63 6c 5f 54 68 72 65 61 64 41 6c 65 72 74   Tcl_ThreadAlert
13820 28 69 6e 66 6f 50 74 72 2d 3e 74 68 72 65 61 64  (infoPtr->thread
13830 49 64 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4d 75 74  Id);..}..Tcl_Mut
13840 65 78 55 6e 6c 6f 63 6b 28 26 70 69 70 65 4d 75  exUnlock(&pipeMu
13850 74 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  tex);.    }..   
13860 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 73 74   /*.     * If st
13870 61 74 65 20 6f 66 20 74 68 72 65 61 64 20 77 61  ate of thread wa
13880 73 20 73 65 74 20 74 6f 20 73 74 6f 70 2c 20 77  s set to stop, w
13890 65 20 63 61 6e 20 73 61 6e 65 20 66 72 65 65 20  e can sane free 
138a0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2c 0a  info structure,.
138b0 20 20 20 20 20 2a 20 6f 74 68 65 72 77 69 73 65       * otherwise
138c0 20 69 74 20 69 73 20 73 68 61 72 65 64 20 77 69   it is shared wi
138d0 74 68 20 6d 61 69 6e 20 74 68 72 65 61 64 2c 20  th main thread, 
138e0 73 6f 20 6d 61 69 6e 20 74 68 72 65 61 64 20 77  so main thread w
138f0 69 6c 6c 20 6f 77 6e 20 69 74 0a 20 20 20 20 20  ill own it.     
13900 2a 2f 0a 20 20 20 20 54 63 6c 50 69 70 65 54 68  */.    TclPipeTh
13910 72 65 61 64 45 78 69 74 28 26 70 69 70 65 54 49  readExit(&pipeTI
13920 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 30  );..    return 0
13930 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
13940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13980 2d 0a 20 2a 0a 20 2a 20 50 69 70 65 57 72 69 74  -. *. * PipeWrit
13990 65 72 54 68 72 65 61 64 20 2d 2d 0a 20 2a 0a 20  erThread --. *. 
139a0 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  *.This function 
139b0 72 75 6e 73 20 69 6e 20 61 20 73 65 70 61 72 61  runs in a separa
139c0 74 65 20 74 68 72 65 61 64 20 61 6e 64 20 77 72  te thread and wr
139d0 69 74 65 73 20 64 61 74 61 20 6f 6e 74 6f 20 61  ites data onto a
139e0 20 70 69 70 65 2e 0a 20 2a 0a 20 2a 20 52 65 73   pipe.. *. * Res
139f0 75 6c 74 73 3a 0a 20 2a 09 41 6c 77 61 79 73 20  ults:. *.Always 
13a00 72 65 74 75 72 6e 73 20 30 2e 0a 20 2a 0a 20 2a  returns 0.. *. *
13a10 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
13a20 2a 09 53 69 67 6e 61 6c 73 20 74 68 65 20 6d 61  *.Signals the ma
13a30 69 6e 20 74 68 72 65 61 64 20 77 68 65 6e 20 61  in thread when a
13a40 6e 20 6f 75 74 70 75 74 20 6f 70 65 72 61 74 69  n output operati
13a50 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
13a60 20 4d 61 79 0a 20 2a 09 63 61 75 73 65 20 74 68   May. *.cause th
13a70 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20 74 6f  e main thread to
13a80 20 77 61 6b 65 20 75 70 20 62 79 20 70 6f 73 74   wake up by post
13a90 69 6e 67 20 61 20 6d 65 73 73 61 67 65 2e 0a 20  ing a message.. 
13aa0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
13af0 73 74 61 74 69 63 20 44 57 4f 52 44 20 57 49 4e  static DWORD WIN
13b00 41 50 49 0a 50 69 70 65 57 72 69 74 65 72 54 68  API.PipeWriterTh
13b10 72 65 61 64 28 0a 20 20 20 20 4c 50 56 4f 49 44  read(.    LPVOID
13b20 20 61 72 67 29 0a 7b 0a 20 20 20 20 54 63 6c 50   arg).{.    TclP
13b30 69 70 65 54 68 72 65 61 64 49 6e 66 6f 20 2a 70  ipeThreadInfo *p
13b40 69 70 65 54 49 20 3d 20 28 54 63 6c 50 69 70 65  ipeTI = (TclPipe
13b50 54 68 72 65 61 64 49 6e 66 6f 20 2a 29 61 72 67  ThreadInfo *)arg
13b60 3b 0a 20 20 20 20 50 69 70 65 49 6e 66 6f 20 2a  ;.    PipeInfo *
13b70 69 6e 66 6f 50 74 72 20 3d 20 4e 55 4c 4c 3b 09  infoPtr = NULL;.
13b80 2f 2a 20 61 63 63 65 73 73 20 69 6e 66 6f 20 6f  /* access info o
13b90 6e 6c 79 20 61 66 74 65 72 20 73 75 63 63 65 73  nly after succes
13ba0 73 20 69 6e 69 74 2f 77 61 69 74 20 2a 2f 0a 20  s init/wait */. 
13bb0 20 20 20 48 41 4e 44 4c 45 20 68 61 6e 64 6c 65     HANDLE handle
13bc0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 44 57 4f   = NULL;.    DWO
13bd0 52 44 20 63 6f 75 6e 74 2c 20 74 6f 57 72 69 74  RD count, toWrit
13be0 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66  e;.    char *buf
13bf0 3b 0a 20 20 20 20 69 6e 74 20 64 6f 6e 65 20 3d  ;.    int done =
13c00 20 30 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28   0;..    while (
13c10 21 64 6f 6e 65 29 20 7b 0a 09 2f 2a 0a 09 20 2a  !done) {../*.. *
13c20 20 57 61 69 74 20 66 6f 72 20 74 68 65 20 6d 61   Wait for the ma
13c30 69 6e 20 74 68 72 65 61 64 20 74 6f 20 73 69 67  in thread to sig
13c40 6e 61 6c 20 62 65 66 6f 72 65 20 61 74 74 65 6d  nal before attem
13c50 70 74 69 6e 67 20 74 6f 20 77 72 69 74 65 2e 0a  pting to write..
13c60 09 20 2a 2f 0a 09 69 66 20 28 21 54 63 6c 50 69  . */..if (!TclPi
13c70 70 65 54 68 72 65 61 64 57 61 69 74 46 6f 72 53  peThreadWaitForS
13c80 69 67 6e 61 6c 28 26 70 69 70 65 54 49 29 29 20  ignal(&pipeTI)) 
13c90 7b 0a 09 20 20 20 20 2f 2a 20 65 78 69 74 20 2a  {..    /* exit *
13ca0 2f 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  /..    break;..}
13cb0 0a 0a 09 69 66 20 28 21 69 6e 66 6f 50 74 72 29  ...if (!infoPtr)
13cc0 20 7b 0a 09 20 20 20 20 69 6e 66 6f 50 74 72 20   {..    infoPtr 
13cd0 3d 20 28 50 69 70 65 49 6e 66 6f 20 2a 29 70 69  = (PipeInfo *)pi
13ce0 70 65 54 49 2d 3e 63 6c 69 65 6e 74 44 61 74 61  peTI->clientData
13cf0 3b 0a 09 20 20 20 20 68 61 6e 64 6c 65 20 3d 20  ;..    handle = 
13d00 28 28 57 69 6e 46 69 6c 65 20 2a 29 20 69 6e 66  ((WinFile *) inf
13d10 6f 50 74 72 2d 3e 77 72 69 74 65 46 69 6c 65 29  oPtr->writeFile)
13d20 2d 3e 68 61 6e 64 6c 65 3b 0a 09 7d 0a 0a 09 62  ->handle;..}...b
13d30 75 66 20 3d 20 69 6e 66 6f 50 74 72 2d 3e 77 72  uf = infoPtr->wr
13d40 69 74 65 42 75 66 3b 0a 09 74 6f 57 72 69 74 65  iteBuf;..toWrite
13d50 20 3d 20 69 6e 66 6f 50 74 72 2d 3e 74 6f 57 72   = infoPtr->toWr
13d60 69 74 65 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 4c 6f  ite;.../*.. * Lo
13d70 6f 70 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20  op until all of 
13d80 74 68 65 20 62 79 74 65 73 20 61 72 65 20 77 72  the bytes are wr
13d90 69 74 74 65 6e 20 6f 72 20 61 6e 20 65 72 72 6f  itten or an erro
13da0 72 20 6f 63 63 75 72 73 2e 0a 09 20 2a 2f 0a 0a  r occurs... */..
13db0 09 77 68 69 6c 65 20 28 74 6f 57 72 69 74 65 20  .while (toWrite 
13dc0 3e 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28  > 0) {..    if (
13dd0 57 72 69 74 65 46 69 6c 65 28 68 61 6e 64 6c 65  WriteFile(handle
13de0 2c 20 62 75 66 2c 20 74 6f 57 72 69 74 65 2c 20  , buf, toWrite, 
13df0 26 63 6f 75 6e 74 2c 20 4e 55 4c 4c 29 20 3d 3d  &count, NULL) ==
13e00 20 46 41 4c 53 45 29 20 7b 0a 09 09 69 6e 66 6f   FALSE) {...info
13e10 50 74 72 2d 3e 77 72 69 74 65 45 72 72 6f 72 20  Ptr->writeError 
13e20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
13e30 3b 0a 09 09 64 6f 6e 65 20 3d 20 31 3b 0a 09 09  ;...done = 1;...
13e40 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 20 65 6c  break;..    } el
13e50 73 65 20 7b 0a 09 09 74 6f 57 72 69 74 65 20 2d  se {...toWrite -
13e60 3d 20 63 6f 75 6e 74 3b 0a 09 09 62 75 66 20 2b  = count;...buf +
13e70 3d 20 63 6f 75 6e 74 3b 0a 09 20 20 20 20 7d 0a  = count;..    }.
13e80 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 53 69 67 6e  .}.../*.. * Sign
13e90 61 6c 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65  al the main thre
13ea0 61 64 20 62 79 20 73 69 67 6e 61 6c 6c 69 6e 67  ad by signalling
13eb0 20 74 68 65 20 77 72 69 74 61 62 6c 65 20 65 76   the writable ev
13ec0 65 6e 74 20 61 6e 64 20 74 68 65 6e 0a 09 20 2a  ent and then.. *
13ed0 20 77 61 6b 69 6e 67 20 75 70 20 74 68 65 20 6e   waking up the n
13ee0 6f 74 69 66 69 65 72 20 74 68 72 65 61 64 2e 0a  otifier thread..
13ef0 09 20 2a 2f 0a 0a 09 53 65 74 45 76 65 6e 74 28  . */...SetEvent(
13f00 69 6e 66 6f 50 74 72 2d 3e 77 72 69 74 61 62 6c  infoPtr->writabl
13f10 65 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 41 6c 65  e);.../*.. * Ale
13f20 72 74 20 74 68 65 20 66 6f 72 65 67 72 6f 75 6e  rt the foregroun
13f30 64 20 74 68 72 65 61 64 2e 20 4e 6f 74 65 20 74  d thread. Note t
13f40 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f 20 74  hat we need to t
13f50 72 65 61 74 20 74 68 69 73 20 6c 69 6b 65 20 61  reat this like a
13f60 0a 09 20 2a 20 63 72 69 74 69 63 61 6c 20 73 65  .. * critical se
13f70 63 74 69 6f 6e 20 73 6f 20 74 68 65 20 66 6f 72  ction so the for
13f80 65 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 64  eground thread d
13f90 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74  oes not terminat
13fa0 65 20 74 68 69 73 0a 09 20 2a 20 74 68 72 65 61  e this.. * threa
13fb0 64 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 68  d while we are h
13fc0 6f 6c 64 69 6e 67 20 61 20 6d 75 74 65 78 20 69  olding a mutex i
13fd0 6e 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 63  n the notifier c
13fe0 6f 64 65 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f  ode... */...Tcl_
13ff0 4d 75 74 65 78 4c 6f 63 6b 28 26 70 69 70 65 4d  MutexLock(&pipeM
14000 75 74 65 78 29 3b 0a 09 69 66 20 28 69 6e 66 6f  utex);..if (info
14010 50 74 72 2d 3e 74 68 72 65 61 64 49 64 20 21 3d  Ptr->threadId !=
14020 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a   NULL) {..    /*
14030 0a 09 20 20 20 20 20 2a 20 54 49 50 20 23 32 31  ..     * TIP #21
14040 38 2e 20 57 68 65 6e 20 69 6e 20 66 6c 69 67 68  8. When in fligh
14050 74 20 69 67 6e 6f 72 65 20 74 68 65 20 65 76 65  t ignore the eve
14060 6e 74 2c 20 6e 6f 20 6f 6e 65 20 77 69 6c 6c 20  nt, no one will 
14070 72 65 63 65 69 76 65 0a 09 20 20 20 20 20 2a 20  receive..     * 
14080 69 74 20 61 6e 79 77 61 79 2e 0a 09 20 20 20 20  it anyway...    
14090 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 54 68   */...    Tcl_Th
140a0 72 65 61 64 41 6c 65 72 74 28 69 6e 66 6f 50 74  readAlert(infoPt
140b0 72 2d 3e 74 68 72 65 61 64 49 64 29 3b 0a 09 7d  r->threadId);..}
140c0 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63  ..Tcl_MutexUnloc
140d0 6b 28 26 70 69 70 65 4d 75 74 65 78 29 3b 0a 20  k(&pipeMutex);. 
140e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
140f0 20 20 2a 20 49 66 20 73 74 61 74 65 20 6f 66 20    * If state of 
14100 74 68 72 65 61 64 20 77 61 73 20 73 65 74 20 74  thread was set t
14110 6f 20 73 74 6f 70 2c 20 77 65 20 63 61 6e 20 73  o stop, we can s
14120 61 6e 65 20 66 72 65 65 20 69 6e 66 6f 20 73 74  ane free info st
14130 72 75 63 74 75 72 65 2c 0a 20 20 20 20 20 2a 20  ructure,.     * 
14140 6f 74 68 65 72 77 69 73 65 20 69 74 20 69 73 20  otherwise it is 
14150 73 68 61 72 65 64 20 77 69 74 68 20 6d 61 69 6e  shared with main
14160 20 74 68 72 65 61 64 2c 20 73 6f 20 6d 61 69 6e   thread, so main
14170 20 74 68 72 65 61 64 20 77 69 6c 6c 20 6f 77 6e   thread will own
14180 20 69 74 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20   it..     */.   
14190 20 54 63 6c 50 69 70 65 54 68 72 65 61 64 45 78   TclPipeThreadEx
141a0 69 74 28 26 70 69 70 65 54 49 29 3b 0a 0a 20 20  it(&pipeTI);..  
141b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a    return 0;.}...
141c0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
141d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
14210 2a 20 50 69 70 65 54 68 72 65 61 64 41 63 74 69  * PipeThreadActi
14220 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  onProc --. *. *.
14230 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65  Insert or remove
14240 20 61 6e 79 20 74 68 72 65 61 64 20 6c 6f 63 61   any thread loca
14250 6c 20 72 65 66 73 20 74 6f 20 74 68 69 73 20 63  l refs to this c
14260 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65  hannel.. *. * Re
14270 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  sults:. *.None..
14280 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
14290 74 73 3a 0a 20 2a 09 43 68 61 6e 67 65 73 20 74  ts:. *.Changes t
142a0 68 72 65 61 64 20 6c 6f 63 61 6c 20 6c 69 73 74  hread local list
142b0 20 6f 66 20 76 61 6c 69 64 20 63 68 61 6e 6e 65   of valid channe
142c0 6c 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ls.. *. *-------
142d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
142e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
142f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14310 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
14320 0a 50 69 70 65 54 68 72 65 61 64 41 63 74 69 6f  .PipeThreadActio
14330 6e 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20  nProc(.    void 
14340 2a 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20  *instanceData,. 
14350 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 29 0a 7b     int action).{
14360 0a 20 20 20 20 50 69 70 65 49 6e 66 6f 20 2a 69  .    PipeInfo *i
14370 6e 66 6f 50 74 72 20 3d 20 28 50 69 70 65 49 6e  nfoPtr = (PipeIn
14380 66 6f 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61  fo *) instanceDa
14390 74 61 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ta;..    /*.    
143a0 20 2a 20 57 65 20 64 6f 20 6e 6f 74 20 61 63 63   * We do not acc
143b0 65 73 73 20 66 69 72 73 74 50 69 70 65 50 74 72  ess firstPipePtr
143c0 20 69 6e 20 74 68 65 20 74 68 72 65 61 64 20 73   in the thread s
143d0 74 72 75 63 74 75 72 65 73 2e 20 54 68 69 73 20  tructures. This 
143e0 69 73 20 6e 6f 74 20 66 6f 72 0a 20 20 20 20 20  is not for.     
143f0 2a 20 61 6c 6c 20 70 69 70 65 73 20 6d 61 6e 61  * all pipes mana
14400 67 65 64 20 62 79 20 74 68 65 20 74 68 72 65 61  ged by the threa
14410 64 2c 20 62 75 74 20 6f 6e 6c 79 20 74 68 6f 73  d, but only thos
14420 65 20 77 65 20 61 72 65 20 77 61 74 63 68 69 6e  e we are watchin
14430 67 2e 0a 20 20 20 20 20 2a 20 52 65 6d 6f 76 61  g..     * Remova
14440 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 65 76 65  l of the fileeve
14450 6e 74 20 68 61 6e 64 6c 65 72 73 20 62 65 66 6f  nt handlers befo
14460 72 65 20 74 72 61 6e 73 66 65 72 20 74 68 75 73  re transfer thus
14470 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 0a 20   takes care of. 
14480 20 20 20 20 2a 20 74 68 69 73 20 73 74 72 75 63      * this struc
14490 74 75 72 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  ture..     */.. 
144a0 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b     Tcl_MutexLock
144b0 28 26 70 69 70 65 4d 75 74 65 78 29 3b 0a 20 20  (&pipeMutex);.  
144c0 20 20 69 66 20 28 61 63 74 69 6f 6e 20 3d 3d 20    if (action == 
144d0 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 54 48 52 45  TCL_CHANNEL_THRE
144e0 41 44 5f 49 4e 53 45 52 54 29 20 7b 0a 09 2f 2a  AD_INSERT) {../*
144f0 0a 09 20 2a 20 57 65 20 63 61 6e 27 74 20 63 6f  .. * We can't co
14500 70 79 20 74 68 65 20 74 68 72 65 61 64 20 69 6e  py the thread in
14510 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
14520 68 65 20 63 68 61 6e 6e 65 6c 20 77 68 65 6e 20  he channel when 
14530 74 68 65 0a 09 20 2a 20 63 68 61 6e 6e 65 6c 20  the.. * channel 
14540 69 73 20 63 72 65 61 74 65 64 2e 20 41 74 20 74  is created. At t
14550 68 69 73 20 74 69 6d 65 20 74 68 65 20 63 68 61  his time the cha
14560 6e 6e 65 6c 20 62 61 63 6b 20 70 6f 69 6e 74 65  nnel back pointe
14570 72 20 68 61 73 20 6e 6f 74 0a 09 20 2a 20 62 65  r has not.. * be
14580 65 6e 20 73 65 74 20 79 65 74 2e 20 48 6f 77 65  en set yet. Howe
14590 76 65 72 20 69 6e 20 74 68 61 74 20 63 61 73 65  ver in that case
145a0 20 74 68 65 20 74 68 72 65 61 64 49 64 20 68 61   the threadId ha
145b0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 09  s already been..
145c0 20 2a 20 73 65 74 20 62 79 20 54 63 6c 70 43 72   * set by TclpCr
145d0 65 61 74 65 43 6f 6d 6d 61 6e 64 43 68 61 6e 6e  eateCommandChann
145e0 65 6c 20 69 74 73 65 6c 66 2c 20 73 6f 20 74 68  el itself, so th
145f0 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73  e structure is s
14600 74 69 6c 6c 0a 09 20 2a 20 67 6f 6f 64 2e 0a 09  till.. * good...
14610 20 2a 2f 0a 0a 09 50 69 70 65 49 6e 69 74 28 29   */...PipeInit()
14620 3b 0a 09 69 66 20 28 69 6e 66 6f 50 74 72 2d 3e  ;..if (infoPtr->
14630 63 68 61 6e 6e 65 6c 20 21 3d 20 4e 55 4c 4c 29  channel != NULL)
14640 20 7b 0a 09 20 20 20 20 69 6e 66 6f 50 74 72 2d   {..    infoPtr-
14650 3e 74 68 72 65 61 64 49 64 20 3d 20 54 63 6c 5f  >threadId = Tcl_
14660 47 65 74 43 68 61 6e 6e 65 6c 54 68 72 65 61 64  GetChannelThread
14670 28 69 6e 66 6f 50 74 72 2d 3e 63 68 61 6e 6e 65  (infoPtr->channe
14680 6c 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  l);..}.    } els
14690 65 20 7b 0a 09 69 6e 66 6f 50 74 72 2d 3e 74 68  e {..infoPtr->th
146a0 72 65 61 64 49 64 20 3d 20 4e 55 4c 4c 3b 0a 20  readId = NULL;. 
146b0 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4d 75 74     }.    Tcl_Mut
146c0 65 78 55 6e 6c 6f 63 6b 28 26 70 69 70 65 4d 75  exUnlock(&pipeMu
146d0 74 65 78 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  tex);.}.../*. *-
146e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14720 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 70  -----. *. * Tclp
14730 4f 70 65 6e 54 65 6d 70 6f 72 61 72 79 46 69 6c  OpenTemporaryFil
14740 65 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74  e --. *. *.Creat
14750 65 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  es a temporary f
14760 69 6c 65 2c 20 70 6f 73 73 69 62 6c 79 20 62 61  ile, possibly ba
14770 73 65 64 20 6f 6e 20 74 68 65 20 73 75 70 70 6c  sed on the suppl
14780 69 65 64 20 62 69 74 73 20 61 6e 64 0a 20 2a 09  ied bits and. *.
14790 70 69 65 63 65 73 20 6f 66 20 74 65 6d 70 6c 61  pieces of templa
147a0 74 65 20 73 75 70 70 6c 69 65 64 20 69 6e 20 74  te supplied in t
147b0 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 61  he first three a
147c0 72 67 75 6d 65 6e 74 73 2e 20 49 66 20 74 68 65  rguments. If the
147d0 0a 20 2a 09 66 6f 75 72 74 68 20 61 72 67 75 6d  . *.fourth argum
147e0 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ent is non-NULL,
147f0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 54   it contains a T
14800 63 6c 5f 4f 62 6a 20 74 6f 20 73 74 6f 72 65 20  cl_Obj to store 
14810 74 68 65 20 6e 61 6d 65 0a 20 2a 09 6f 66 20 74  the name. *.of t
14820 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
14830 65 20 69 6e 20 28 61 6e 64 20 69 74 20 69 73 20  e in (and it is 
14840 63 61 6c 6c 65 72 27 73 20 72 65 73 70 6f 6e 73  caller's respons
14850 69 62 69 6c 69 74 79 20 74 6f 20 63 6c 65 61 6e  ibility to clean
14860 0a 20 2a 09 75 70 29 2e 20 49 66 20 74 68 65 20  . *.up). If the 
14870 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
14880 69 73 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20  is NULL, try to 
14890 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20  arrange for the 
148a0 74 65 6d 70 6f 72 61 72 79 0a 20 2a 09 66 69 6c  temporary. *.fil
148b0 65 20 74 6f 20 67 6f 20 61 77 61 79 20 6f 6e 63  e to go away onc
148c0 65 20 69 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e it is no longe
148d0 72 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20  r needed.. *. * 
148e0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 72 65  Results:. *.A re
148f0 61 64 2d 77 72 69 74 65 20 54 63 6c 20 43 68 61  ad-write Tcl Cha
14900 6e 6e 65 6c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  nnel open on the
14910 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   file.. *. *----
14920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14960 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 43 68 61 6e  --. */..Tcl_Chan
14970 6e 65 6c 0a 54 63 6c 70 4f 70 65 6e 54 65 6d 70  nel.TclpOpenTemp
14980 6f 72 61 72 79 46 69 6c 65 28 0a 20 20 20 20 54  oraryFile(.    T
14990 43 4c 5f 55 4e 55 53 45 44 28 54 63 6c 5f 4f 62  CL_UNUSED(Tcl_Ob
149a0 6a 20 2a 29 20 2f 2a 64 69 72 4f 62 6a 2a 2f 2c  j *) /*dirObj*/,
149b0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 62 61  .    Tcl_Obj *ba
149c0 73 65 6e 61 6d 65 4f 62 6a 2c 0a 20 20 20 20 54  senameObj,.    T
149d0 43 4c 5f 55 4e 55 53 45 44 28 54 63 6c 5f 4f 62  CL_UNUSED(Tcl_Ob
149e0 6a 20 2a 29 20 2f 2a 65 78 74 65 6e 73 69 6f 6e  j *) /*extension
149f0 4f 62 6a 2a 2f 2c 0a 20 20 20 20 54 63 6c 5f 4f  Obj*/,.    Tcl_O
14a00 62 6a 20 2a 72 65 73 75 6c 74 69 6e 67 4e 61 6d  bj *resultingNam
14a10 65 4f 62 6a 29 0a 7b 0a 20 20 20 20 57 43 48 41  eObj).{.    WCHA
14a20 52 20 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 5d  R name[MAX_PATH]
14a30 3b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65  ;.    char *name
14a40 50 74 72 3b 0a 20 20 20 20 48 41 4e 44 4c 45 20  Ptr;.    HANDLE 
14a50 68 61 6e 64 6c 65 3b 0a 20 20 20 20 44 57 4f 52  handle;.    DWOR
14a60 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 41  D flags = FILE_A
14a70 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41  TTRIBUTE_TEMPORA
14a80 52 59 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  RY;.    Tcl_Size
14a90 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20 69 6e 74   length;.    int
14aa0 20 63 6f 75 6e 74 65 72 2c 20 63 6f 75 6e 74 65   counter, counte
14ab0 72 32 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r2;.    Tcl_DStr
14ac0 69 6e 67 20 62 75 66 3b 0a 0a 20 20 20 20 69 66  ing buf;..    if
14ad0 20 28 21 72 65 73 75 6c 74 69 6e 67 4e 61 6d 65   (!resultingName
14ae0 4f 62 6a 29 20 7b 0a 09 66 6c 61 67 73 20 7c 3d  Obj) {..flags |=
14af0 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54   FILE_FLAG_DELET
14b00 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  E_ON_CLOSE;.    
14b10 7d 0a 0a 20 20 20 20 6e 61 6d 65 50 74 72 20 3d  }..    namePtr =
14b20 20 28 63 68 61 72 20 2a 29 20 6e 61 6d 65 3b 0a   (char *) name;.
14b30 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 47 65 74      length = Get
14b40 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41  TempPathW(MAX_PA
14b50 54 48 2c 20 6e 61 6d 65 29 3b 0a 20 20 20 20 69  TH, name);.    i
14b60 66 20 28 6c 65 6e 67 74 68 20 3d 3d 20 30 29 20  f (length == 0) 
14b70 7b 0a 09 67 6f 74 6f 20 67 6f 74 45 72 72 6f 72  {..goto gotError
14b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 61 6d 65  ;.    }.    name
14b90 50 74 72 20 2b 3d 20 6c 65 6e 67 74 68 20 2a 20  Ptr += length * 
14ba0 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20  sizeof(WCHAR);. 
14bb0 20 20 20 69 66 20 28 62 61 73 65 6e 61 6d 65 4f     if (basenameO
14bc0 62 6a 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61  bj) {..const cha
14bd0 72 20 2a 73 74 72 69 6e 67 20 3d 20 54 63 6c 47  r *string = TclG
14be0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
14bf0 62 61 73 65 6e 61 6d 65 4f 62 6a 2c 20 26 6c 65  basenameObj, &le
14c00 6e 67 74 68 29 3b 0a 0a 09 54 63 6c 5f 44 53 74  ngth);...Tcl_DSt
14c10 72 69 6e 67 49 6e 69 74 28 26 62 75 66 29 3b 0a  ringInit(&buf);.
14c20 09 54 63 6c 5f 55 74 66 54 6f 57 43 68 61 72 44  .Tcl_UtfToWCharD
14c30 53 74 72 69 6e 67 28 73 74 72 69 6e 67 2c 20 6c  String(string, l
14c40 65 6e 67 74 68 2c 20 26 62 75 66 29 3b 0a 09 6d  ength, &buf);..m
14c50 65 6d 63 70 79 28 6e 61 6d 65 50 74 72 2c 20 54  emcpy(namePtr, T
14c60 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
14c70 26 62 75 66 29 2c 20 54 63 6c 5f 44 53 74 72 69  &buf), Tcl_DStri
14c80 6e 67 4c 65 6e 67 74 68 28 26 62 75 66 29 29 3b  ngLength(&buf));
14c90 0a 09 6e 61 6d 65 50 74 72 20 2b 3d 20 54 63 6c  ..namePtr += Tcl
14ca0 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26  _DStringLength(&
14cb0 62 75 66 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  buf);..Tcl_DStri
14cc0 6e 67 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20  ngFree(&buf);.  
14cd0 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 6f 6e 73    } else {..cons
14ce0 74 20 57 43 48 41 52 20 2a 62 61 73 65 53 74 72  t WCHAR *baseStr
14cf0 20 3d 20 4c 22 54 43 4c 22 3b 0a 09 6c 65 6e 67   = L"TCL";..leng
14d00 74 68 20 3d 20 33 20 2a 20 73 69 7a 65 6f 66 28  th = 3 * sizeof(
14d10 57 43 48 41 52 29 3b 0a 0a 09 6d 65 6d 63 70 79  WCHAR);...memcpy
14d20 28 6e 61 6d 65 50 74 72 2c 20 62 61 73 65 53 74  (namePtr, baseSt
14d30 72 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 6e 61 6d  r, length);..nam
14d40 65 50 74 72 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a  ePtr += length;.
14d50 20 20 20 20 7d 0a 20 20 20 20 63 6f 75 6e 74 65      }.    counte
14d60 72 20 3d 20 28 69 6e 74 29 28 54 63 6c 70 47 65  r = (int)(TclpGe
14d70 74 43 6c 69 63 6b 73 28 29 20 25 20 36 35 35 33  tClicks() % 6553
14d80 33 29 3b 0a 20 20 20 20 63 6f 75 6e 74 65 72 32  3);.    counter2
14d90 20 3d 20 31 30 32 34 3b 09 09 09 2f 2a 20 4f 6e   = 1024;.../* On
14da0 6c 79 20 74 72 79 20 74 68 69 73 20 6d 61 6e 79  ly try this many
14db0 20 74 69 6d 65 73 21 20 50 72 65 76 65 6e 74 73   times! Prevents
14dc0 0a 09 09 09 09 09 20 2a 20 61 6e 20 69 6e 66 69  ...... * an infi
14dd0 6e 69 74 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 0a 20  nite loop. */.. 
14de0 20 20 20 64 6f 20 7b 0a 09 63 68 61 72 20 6e 75     do {..char nu
14df0 6d 62 65 72 5b 54 43 4c 5f 49 4e 54 45 47 45 52  mber[TCL_INTEGER
14e00 5f 53 50 41 43 45 20 2b 20 34 5d 3b 0a 0a 09 73  _SPACE + 4];...s
14e10 6e 70 72 69 6e 74 66 28 6e 75 6d 62 65 72 2c 20  nprintf(number, 
14e20 73 69 7a 65 6f 66 28 6e 75 6d 62 65 72 29 2c 20  sizeof(number), 
14e30 22 25 64 2e 54 4d 50 22 2c 20 63 6f 75 6e 74 65  "%d.TMP", counte
14e40 72 29 3b 0a 09 63 6f 75 6e 74 65 72 20 3d 20 28  r);..counter = (
14e50 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 29 20  unsigned short) 
14e60 28 63 6f 75 6e 74 65 72 20 2b 20 31 29 3b 0a 09  (counter + 1);..
14e70 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
14e80 26 62 75 66 29 3b 0a 09 54 63 6c 5f 55 74 66 54  &buf);..Tcl_UtfT
14e90 6f 57 43 68 61 72 44 53 74 72 69 6e 67 28 6e 75  oWCharDString(nu
14ea0 6d 62 65 72 2c 20 73 74 72 6c 65 6e 28 6e 75 6d  mber, strlen(num
14eb0 62 65 72 29 2c 20 26 62 75 66 29 3b 0a 09 54 63  ber), &buf);..Tc
14ec0 6c 5f 44 53 74 72 69 6e 67 53 65 74 4c 65 6e 67  l_DStringSetLeng
14ed0 74 68 28 26 62 75 66 2c 20 54 63 6c 5f 44 53 74  th(&buf, Tcl_DSt
14ee0 72 69 6e 67 4c 65 6e 67 74 68 28 26 62 75 66 29  ringLength(&buf)
14ef0 20 2b 20 31 29 3b 0a 09 6d 65 6d 63 70 79 28 6e   + 1);..memcpy(n
14f00 61 6d 65 50 74 72 2c 20 54 63 6c 5f 44 53 74 72  amePtr, Tcl_DStr
14f10 69 6e 67 56 61 6c 75 65 28 26 62 75 66 29 2c 20  ingValue(&buf), 
14f20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74  Tcl_DStringLengt
14f30 68 28 26 62 75 66 29 20 2b 20 31 29 3b 0a 09 54  h(&buf) + 1);..T
14f40 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
14f50 62 75 66 29 3b 0a 0a 09 68 61 6e 64 6c 65 20 3d  buf);...handle =
14f60 20 43 72 65 61 74 65 46 69 6c 65 57 28 6e 61 6d   CreateFileW(nam
14f70 65 2c 0a 09 09 47 45 4e 45 52 49 43 5f 52 45 41  e,...GENERIC_REA
14f80 44 7c 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c  D|GENERIC_WRITE,
14f90 20 30 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45   0, NULL, CREATE
14fa0 5f 4e 45 57 2c 20 66 6c 61 67 73 2c 20 4e 55 4c  _NEW, flags, NUL
14fb0 4c 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20  L);.    } while 
14fc0 28 68 61 6e 64 6c 65 20 3d 3d 20 49 4e 56 41 4c  (handle == INVAL
14fd0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 0a  ID_HANDLE_VALUE.
14fe0 09 20 20 20 20 26 26 20 2d 2d 63 6f 75 6e 74 65  .    && --counte
14ff0 72 32 20 3e 20 30 0a 09 20 20 20 20 26 26 20 47  r2 > 0..    && G
15000 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d 3d  etLastError() ==
15010 20 45 52 52 4f 52 5f 46 49 4c 45 5f 45 58 49 53   ERROR_FILE_EXIS
15020 54 53 29 3b 0a 20 20 20 20 69 66 20 28 68 61 6e  TS);.    if (han
15030 64 6c 65 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 48  dle == INVALID_H
15040 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 7b 0a 09  ANDLE_VALUE) {..
15050 67 6f 74 6f 20 67 6f 74 45 72 72 6f 72 3b 0a 20  goto gotError;. 
15060 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 72 65     }..    if (re
15070 73 75 6c 74 69 6e 67 4e 61 6d 65 4f 62 6a 29 20  sultingNameObj) 
15080 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 74 6d 70 4f  {..Tcl_Obj *tmpO
15090 62 6a 20 3d 20 54 63 6c 70 4e 61 74 69 76 65 54  bj = TclpNativeT
150a0 6f 4e 6f 72 6d 61 6c 69 7a 65 64 28 6e 61 6d 65  oNormalized(name
150b0 29 3b 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 4f  );...Tcl_AppendO
150c0 62 6a 54 6f 4f 62 6a 28 72 65 73 75 6c 74 69 6e  bjToObj(resultin
150d0 67 4e 61 6d 65 4f 62 6a 2c 20 74 6d 70 4f 62 6a  gNameObj, tmpObj
150e0 29 3b 0a 09 54 63 6c 44 65 63 72 52 65 66 43 6f  );..TclDecrRefCo
150f0 75 6e 74 28 74 6d 70 4f 62 6a 29 3b 0a 20 20 20  unt(tmpObj);.   
15100 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54   }..    return T
15110 63 6c 5f 4d 61 6b 65 46 69 6c 65 43 68 61 6e 6e  cl_MakeFileChann
15120 65 6c 28 28 76 6f 69 64 20 2a 29 68 61 6e 64 6c  el((void *)handl
15130 65 2c 0a 09 20 20 20 20 54 43 4c 5f 52 45 41 44  e,..    TCL_READ
15140 41 42 4c 45 7c 54 43 4c 5f 57 52 49 54 41 42 4c  ABLE|TCL_WRITABL
15150 45 29 3b 0a 0a 20 20 67 6f 74 45 72 72 6f 72 3a  E);..  gotError:
15160 0a 20 20 20 20 54 63 6c 5f 57 69 6e 43 6f 6e 76  .    Tcl_WinConv
15170 65 72 74 45 72 72 6f 72 28 47 65 74 4c 61 73 74  ertError(GetLast
15180 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65  Error());.    re
15190 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0c 0a 2f  turn NULL;.}.../
151a0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
151b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
151e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
151f0 20 54 63 6c 50 69 70 65 54 68 72 65 61 64 43 72   TclPipeThreadCr
15200 65 61 74 65 54 49 20 2d 2d 0a 20 2a 0a 20 2a 09  eateTI --. *. *.
15210 43 72 65 61 74 65 73 20 61 20 74 68 72 65 61 64  Creates a thread
15220 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2c   info structure,
15230 20 63 61 6e 20 62 65 20 6f 77 6e 65 64 20 62 79   can be owned by
15240 20 77 6f 72 6b 65 72 2e 0a 20 2a 0a 20 2a 20 52   worker.. *. * R
15250 65 73 75 6c 74 73 3a 0a 20 2a 09 50 6f 69 6e 74  esults:. *.Point
15260 65 72 20 74 6f 20 63 72 65 61 74 65 64 20 54 49  er to created TI
15270 20 73 74 72 75 63 74 75 72 65 2e 0a 20 2a 0a 20   structure.. *. 
15280 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
152c0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c  -------. */..Tcl
152d0 50 69 70 65 54 68 72 65 61 64 49 6e 66 6f 20 2a  PipeThreadInfo *
152e0 0a 54 63 6c 50 69 70 65 54 68 72 65 61 64 43 72  .TclPipeThreadCr
152f0 65 61 74 65 54 49 28 0a 20 20 20 20 54 63 6c 50  eateTI(.    TclP
15300 69 70 65 54 68 72 65 61 64 49 6e 66 6f 20 2a 2a  ipeThreadInfo **
15310 70 69 70 65 54 49 50 74 72 2c 0a 20 20 20 20 76  pipeTIPtr,.    v
15320 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
15330 0a 20 20 20 20 48 41 4e 44 4c 45 20 77 61 6b 65  .    HANDLE wake
15340 45 76 65 6e 74 29 0a 7b 0a 20 20 20 20 54 63 6c  Event).{.    Tcl
15350 50 69 70 65 54 68 72 65 61 64 49 6e 66 6f 20 2a  PipeThreadInfo *
15360 70 69 70 65 54 49 3b 0a 23 69 66 6e 64 65 66 20  pipeTI;.#ifndef 
15370 5f 50 54 49 5f 55 53 45 5f 43 4b 41 4c 4c 4f 43  _PTI_USE_CKALLOC
15380 0a 20 20 20 20 70 69 70 65 54 49 20 3d 20 28 54  .    pipeTI = (T
15390 63 6c 50 69 70 65 54 68 72 65 61 64 49 6e 66 6f  clPipeThreadInfo
153a0 20 2a 29 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   *)malloc(sizeof
153b0 28 54 63 6c 50 69 70 65 54 68 72 65 61 64 49 6e  (TclPipeThreadIn
153c0 66 6f 29 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  fo));.#else.    
153d0 70 69 70 65 54 49 20 3d 20 28 54 63 6c 50 69 70  pipeTI = (TclPip
153e0 65 54 68 72 65 61 64 49 6e 66 6f 20 2a 29 54 63  eThreadInfo *)Tc
153f0 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54  l_Alloc(sizeof(T
15400 63 6c 50 69 70 65 54 68 72 65 61 64 49 6e 66 6f  clPipeThreadInfo
15410 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 5f  ));.#endif /* !_
15420 50 54 49 5f 55 53 45 5f 43 4b 41 4c 4c 4f 43 20  PTI_USE_CKALLOC 
15430 2a 2f 0a 20 20 20 20 70 69 70 65 54 49 2d 3e 65  */.    pipeTI->e
15440 76 43 6f 6e 74 72 6f 6c 20 3d 20 43 72 65 61 74  vControl = Creat
15450 65 45 76 65 6e 74 57 28 4e 55 4c 4c 2c 20 46 41  eEventW(NULL, FA
15460 4c 53 45 2c 20 46 41 4c 53 45 2c 20 4e 55 4c 4c  LSE, FALSE, NULL
15470 29 3b 0a 20 20 20 20 70 69 70 65 54 49 2d 3e 73  );.    pipeTI->s
15480 74 61 74 65 20 3d 20 50 54 49 5f 53 54 41 54 45  tate = PTI_STATE
15490 5f 49 44 4c 45 3b 0a 20 20 20 20 70 69 70 65 54  _IDLE;.    pipeT
154a0 49 2d 3e 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  I->clientData = 
154b0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
154c0 70 69 70 65 54 49 2d 3e 65 76 57 61 6b 65 55 70  pipeTI->evWakeUp
154d0 20 3d 20 77 61 6b 65 45 76 65 6e 74 3b 0a 20 20   = wakeEvent;.  
154e0 20 20 72 65 74 75 72 6e 20 28 2a 70 69 70 65 54    return (*pipeT
154f0 49 50 74 72 20 3d 20 70 69 70 65 54 49 29 3b 0a  IPtr = pipeTI);.
15500 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
15550 20 2a 0a 20 2a 20 54 63 6c 50 69 70 65 54 68 72   *. * TclPipeThr
15560 65 61 64 57 61 69 74 46 6f 72 53 69 67 6e 61 6c  eadWaitForSignal
15570 20 2d 2d 0a 20 2a 0a 20 2a 09 57 61 69 74 20 66   --. *. *.Wait f
15580 6f 72 20 77 6f 72 6b 2f 73 74 6f 70 20 73 69 67  or work/stop sig
15590 6e 61 6c 73 20 69 6e 73 69 64 65 20 70 69 70 65  nals inside pipe
155a0 20 77 6f 72 6b 65 72 2e 0a 20 2a 0a 20 2a 20 52   worker.. *. * R
155b0 65 73 75 6c 74 73 3a 0a 20 2a 09 31 20 69 66 20  esults:. *.1 if 
155c0 73 69 67 6e 61 6c 65 64 20 74 6f 20 77 6f 72 6b  signaled to work
155d0 2c 20 30 20 69 66 20 73 69 67 6e 61 6c 65 64 20  , 0 if signaled 
155e0 74 6f 20 73 74 6f 70 2e 0a 20 2a 0a 20 2a 20 53  to stop.. *. * S
155f0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
15600 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
15610 20 72 65 74 75 72 6e 73 20 30 2c 20 54 49 2d 73   returns 0, TI-s
15620 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 72  tructure pointer
15630 20 67 69 76 65 6e 20 76 69 61 20 70 69 70 65 54   given via pipeT
15640 49 50 74 72 0a 20 2a 09 6d 61 79 20 62 65 20 4e  IPtr. *.may be N
15650 55 4c 4c 2c 20 73 6f 20 6e 6f 74 20 61 63 63 65  ULL, so not acce
15660 73 73 69 62 6c 65 20 28 63 61 6e 20 62 65 20 6f  ssible (can be o
15670 77 6e 65 64 20 62 79 20 6d 61 69 6e 20 74 68 72  wned by main thr
15680 65 61 64 29 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ead).. *. *-----
15690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156d0 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 50 69  -. */..int.TclPi
156e0 70 65 54 68 72 65 61 64 57 61 69 74 46 6f 72 53  peThreadWaitForS
156f0 69 67 6e 61 6c 28 0a 20 20 20 20 54 63 6c 50 69  ignal(.    TclPi
15700 70 65 54 68 72 65 61 64 49 6e 66 6f 20 2a 2a 70  peThreadInfo **p
15710 69 70 65 54 49 50 74 72 29 0a 7b 0a 20 20 20 20  ipeTIPtr).{.    
15720 54 63 6c 50 69 70 65 54 68 72 65 61 64 49 6e 66  TclPipeThreadInf
15730 6f 20 2a 70 69 70 65 54 49 20 3d 20 2a 70 69 70  o *pipeTI = *pip
15740 65 54 49 50 74 72 3b 0a 20 20 20 20 4c 4f 4e 47  eTIPtr;.    LONG
15750 20 73 74 61 74 65 3b 0a 20 20 20 20 44 57 4f 52   state;.    DWOR
15760 44 20 77 61 69 74 52 65 73 75 6c 74 3b 0a 20 20  D waitResult;.  
15770 20 20 48 41 4e 44 4c 45 20 77 61 6b 65 45 76 65    HANDLE wakeEve
15780 6e 74 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 69  nt;..    if (!pi
15790 70 65 54 49 29 20 7b 0a 09 72 65 74 75 72 6e 20  peTI) {..return 
157a0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 61  0;.    }..    wa
157b0 6b 65 45 76 65 6e 74 20 3d 20 70 69 70 65 54 49  keEvent = pipeTI
157c0 2d 3e 65 76 57 61 6b 65 55 70 3b 0a 0a 20 20 20  ->evWakeUp;..   
157d0 20 2f 2a 0a 20 20 20 20 20 2a 20 57 61 69 74 20   /*.     * Wait 
157e0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 74 68 72  for the main thr
157f0 65 61 64 20 74 6f 20 73 69 67 6e 61 6c 20 62 65  ead to signal be
15800 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
15810 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
15820 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a       */..    /*.
15830 20 20 20 20 20 2a 20 52 65 73 65 74 20 77 6f 72       * Reset wor
15840 6b 20 73 74 61 74 65 20 6f 66 20 74 68 72 65 61  k state of threa
15850 64 20 28 69 64 6c 65 2f 77 61 69 74 69 6e 67 29  d (idle/waiting)
15860 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 74  .     */..    st
15870 61 74 65 20 3d 20 49 6e 74 65 72 6c 6f 63 6b 65  ate = Interlocke
15880 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
15890 28 26 70 69 70 65 54 49 2d 3e 73 74 61 74 65 2c  (&pipeTI->state,
158a0 20 50 54 49 5f 53 54 41 54 45 5f 49 44 4c 45 2c   PTI_STATE_IDLE,
158b0 0a 09 20 20 20 20 50 54 49 5f 53 54 41 54 45 5f  ..    PTI_STATE_
158c0 57 4f 52 4b 29 3b 0a 20 20 20 20 69 66 20 28 73  WORK);.    if (s
158d0 74 61 74 65 20 26 20 28 50 54 49 5f 53 54 41 54  tate & (PTI_STAT
158e0 45 5f 53 54 4f 50 7c 50 54 49 5f 53 54 41 54 45  E_STOP|PTI_STATE
158f0 5f 45 4e 44 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a  _END)) {../*.. *
15900 20 45 6e 64 20 6f 66 20 77 6f 72 6b 2c 20 63 68   End of work, ch
15910 65 63 6b 20 74 68 65 20 6f 77 6e 65 72 20 6f 66  eck the owner of
15920 20 73 74 72 75 63 74 75 72 65 2e 0a 09 20 2a 2f   structure... */
15930 0a 0a 09 67 6f 74 6f 20 65 6e 64 3b 0a 20 20 20  ...goto end;.   
15940 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
15950 2a 20 45 6e 74 65 72 69 6e 67 20 77 61 69 74 0a  * Entering wait.
15960 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 77 61 69       */..    wai
15970 74 52 65 73 75 6c 74 20 3d 20 57 61 69 74 46 6f  tResult = WaitFo
15980 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 70 69  rSingleObject(pi
15990 70 65 54 49 2d 3e 65 76 43 6f 6e 74 72 6f 6c 2c  peTI->evControl,
159a0 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 20   INFINITE);.    
159b0 69 66 20 28 77 61 69 74 52 65 73 75 6c 74 20 21  if (waitResult !
159c0 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 29  = WAIT_OBJECT_0)
159d0 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 63   {../*.. * The c
159e0 6f 6e 74 72 6f 6c 20 65 76 65 6e 74 20 77 61 73  ontrol event was
159f0 20 6e 6f 74 20 73 69 67 6e 61 6c 65 64 2c 20 73   not signaled, s
15a00 6f 20 65 6e 64 20 6f 66 20 77 6f 72 6b 20 28 75  o end of work (u
15a10 6e 65 78 70 65 63 74 65 64 0a 09 20 2a 20 62 65  nexpected.. * be
15a20 68 61 76 69 6f 75 72 2c 20 6d 61 69 6e 20 74 68  haviour, main th
15a30 72 65 61 64 20 63 61 6e 20 62 65 20 64 65 61 64  read can be dead
15a40 3f 29 2e 0a 09 20 2a 2f 0a 0a 09 67 6f 74 6f 20  ?)... */...goto 
15a50 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
15a60 2f 2a 0a 20 20 20 20 20 2a 20 54 72 79 20 74 6f  /*.     * Try to
15a70 20 73 65 74 20 77 6f 72 6b 20 73 74 61 74 65 20   set work state 
15a80 6f 66 20 74 68 72 65 61 64 0a 20 20 20 20 20 2a  of thread.     *
15a90 2f 0a 0a 20 20 20 20 73 74 61 74 65 20 3d 20 49  /..    state = I
15aa0 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
15ab0 65 45 78 63 68 61 6e 67 65 28 26 70 69 70 65 54  eExchange(&pipeT
15ac0 49 2d 3e 73 74 61 74 65 2c 20 50 54 49 5f 53 54  I->state, PTI_ST
15ad0 41 54 45 5f 57 4f 52 4b 2c 0a 09 20 20 20 20 50  ATE_WORK,..    P
15ae0 54 49 5f 53 54 41 54 45 5f 49 44 4c 45 29 3b 0a  TI_STATE_IDLE);.
15af0 20 20 20 20 69 66 20 28 73 74 61 74 65 20 26 20      if (state & 
15b00 28 50 54 49 5f 53 54 41 54 45 5f 53 54 4f 50 7c  (PTI_STATE_STOP|
15b10 50 54 49 5f 53 54 41 54 45 5f 45 4e 44 29 29 20  PTI_STATE_END)) 
15b20 7b 0a 09 2f 2a 0a 09 20 2a 20 45 6e 64 20 6f 66  {../*.. * End of
15b30 20 77 6f 72 6b 0a 09 20 2a 2f 0a 0a 09 67 6f 74   work.. */...got
15b40 6f 20 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  o end;.    }..  
15b50 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 69 67 6e    /*.     * Sign
15b60 61 6c 65 64 20 74 6f 20 77 6f 72 6b 2e 0a 20 20  aled to work..  
15b70 20 20 20 2a 2f 0a 0a 20 20 20 20 72 65 74 75 72     */..    retur
15b80 6e 20 31 3b 0a 0a 20 20 65 6e 64 3a 0a 20 20 20  n 1;..  end:.   
15b90 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f   /*.     * End o
15ba0 66 20 77 6f 72 6b 2c 20 63 68 65 63 6b 20 74 68  f work, check th
15bb0 65 20 6f 77 6e 65 72 20 6f 66 20 74 68 65 20 54  e owner of the T
15bc0 49 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20  I structure..   
15bd0 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73 74    */..    if (st
15be0 61 74 65 20 21 3d 20 50 54 49 5f 53 54 41 54 45  ate != PTI_STATE
15bf0 5f 53 54 4f 50 29 20 7b 0a 09 2a 70 69 70 65 54  _STOP) {..*pipeT
15c00 49 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  IPtr = NULL;.   
15c10 20 7d 20 65 6c 73 65 20 7b 0a 09 70 69 70 65 54   } else {..pipeT
15c20 49 2d 3e 65 76 57 61 6b 65 55 70 20 3d 20 4e 55  I->evWakeUp = NU
15c30 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
15c40 20 28 77 61 6b 65 45 76 65 6e 74 29 20 7b 0a 09   (wakeEvent) {..
15c50 53 65 74 45 76 65 6e 74 28 77 61 6b 65 45 76 65  SetEvent(wakeEve
15c60 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  nt);.    }.    r
15c70 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a  eturn 0;.}.../*.
15c80 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
15cd0 63 6c 50 69 70 65 54 68 72 65 61 64 53 74 6f 70  clPipeThreadStop
15ce0 53 69 67 6e 61 6c 20 2d 2d 0a 20 2a 0a 20 2a 09  Signal --. *. *.
15cf0 53 65 6e 64 20 73 74 6f 70 20 73 69 67 6e 61 6c  Send stop signal
15d00 20 74 6f 20 74 68 65 20 70 69 70 65 20 77 6f 72   to the pipe wor
15d10 6b 65 72 20 28 77 69 74 68 6f 75 74 20 77 61 69  ker (without wai
15d20 74 69 6e 67 29 2e 0a 20 2a 0a 20 2a 09 41 66 74  ting).. *. *.Aft
15d30 65 72 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  er calling of th
15d40 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 54 49 2d  is function, TI-
15d50 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
15d60 72 20 67 69 76 65 6e 20 76 69 61 20 70 69 70 65  r given via pipe
15d70 54 49 50 74 72 0a 20 2a 09 6d 61 79 20 62 65 20  TIPtr. *.may be 
15d80 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  NULL.. *. * Resu
15d90 6c 74 73 3a 0a 20 2a 09 31 20 69 66 20 73 69 67  lts:. *.1 if sig
15da0 6e 61 6c 65 64 20 28 6f 72 20 70 69 70 65 2d 74  naled (or pipe-t
15db0 68 72 65 61 64 20 69 73 20 64 6f 77 6e 29 2c 20  hread is down), 
15dc0 30 20 69 66 20 70 69 70 65 20 74 68 72 65 61 64  0 if pipe thread
15dd0 20 73 74 69 6c 6c 20 77 6f 72 6b 69 6e 67 2e 0a   still working..
15de0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
15df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
15e30 0a 69 6e 74 0a 54 63 6c 50 69 70 65 54 68 72 65  .int.TclPipeThre
15e40 61 64 53 74 6f 70 53 69 67 6e 61 6c 28 0a 20 20  adStopSignal(.  
15e50 20 20 54 63 6c 50 69 70 65 54 68 72 65 61 64 49    TclPipeThreadI
15e60 6e 66 6f 20 2a 2a 70 69 70 65 54 49 50 74 72 2c  nfo **pipeTIPtr,
15e70 0a 20 20 20 20 48 41 4e 44 4c 45 20 77 61 6b 65  .    HANDLE wake
15e80 45 76 65 6e 74 29 0a 7b 0a 20 20 20 20 54 63 6c  Event).{.    Tcl
15e90 50 69 70 65 54 68 72 65 61 64 49 6e 66 6f 20 2a  PipeThreadInfo *
15ea0 70 69 70 65 54 49 20 3d 20 2a 70 69 70 65 54 49  pipeTI = *pipeTI
15eb0 50 74 72 3b 0a 20 20 20 20 48 41 4e 44 4c 45 20  Ptr;.    HANDLE 
15ec0 65 76 43 6f 6e 74 72 6f 6c 3b 0a 20 20 20 20 69  evControl;.    i
15ed0 6e 74 20 73 74 61 74 65 3b 0a 0a 20 20 20 20 69  nt state;..    i
15ee0 66 20 28 21 70 69 70 65 54 49 29 20 7b 0a 09 72  f (!pipeTI) {..r
15ef0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
15f00 20 20 20 65 76 43 6f 6e 74 72 6f 6c 20 3d 20 70     evControl = p
15f10 69 70 65 54 49 2d 3e 65 76 43 6f 6e 74 72 6f 6c  ipeTI->evControl
15f20 3b 0a 20 20 20 20 70 69 70 65 54 49 2d 3e 65 76  ;.    pipeTI->ev
15f30 57 61 6b 65 55 70 20 3d 20 77 61 6b 65 45 76 65  WakeUp = wakeEve
15f40 6e 74 3b 0a 20 20 20 20 73 74 61 74 65 20 3d 20  nt;.    state = 
15f50 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
15f60 72 65 45 78 63 68 61 6e 67 65 28 26 70 69 70 65  reExchange(&pipe
15f70 54 49 2d 3e 73 74 61 74 65 2c 20 50 54 49 5f 53  TI->state, PTI_S
15f80 54 41 54 45 5f 53 54 4f 50 2c 0a 09 20 20 20 20  TATE_STOP,..    
15f90 50 54 49 5f 53 54 41 54 45 5f 49 44 4c 45 29 3b  PTI_STATE_IDLE);
15fa0 0a 20 20 20 20 73 77 69 74 63 68 20 28 73 74 61  .    switch (sta
15fb0 74 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20 50  te) {.    case P
15fc0 54 49 5f 53 54 41 54 45 5f 49 44 4c 45 3a 0a 09  TI_STATE_IDLE:..
15fd0 2f 2a 0a 09 20 2a 20 54 68 72 65 61 64 20 77 61  /*.. * Thread wa
15fe0 73 20 69 64 6c 65 2f 77 61 69 74 69 6e 67 2c 20  s idle/waiting, 
15ff0 6e 6f 74 69 66 79 20 69 74 20 67 6f 65 73 20 74  notify it goes t
16000 65 61 72 64 6f 77 6e 0a 09 20 2a 2f 0a 0a 09 53  eardown.. */...S
16010 65 74 45 76 65 6e 74 28 65 76 43 6f 6e 74 72 6f  etEvent(evContro
16020 6c 29 3b 0a 09 2a 70 69 70 65 54 49 50 74 72 20  l);..*pipeTIPtr 
16030 3d 20 4e 55 4c 4c 3b 0a 09 54 43 4c 5f 46 41 4c  = NULL;..TCL_FAL
16040 4c 54 48 52 4f 55 47 48 28 29 3b 0a 20 20 20 20  LTHROUGH();.    
16050 63 61 73 65 20 50 54 49 5f 53 54 41 54 45 5f 44  case PTI_STATE_D
16060 4f 57 4e 3a 0a 09 72 65 74 75 72 6e 20 31 3b 0a  OWN:..return 1;.
16070 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f  .    default:../
16080 2a 0a 09 20 2a 20 54 68 72 65 61 64 20 77 6f 72  *.. * Thread wor
16090 6b 73 20 63 75 72 72 65 6e 74 6c 79 2c 20 77 65  ks currently, we
160a0 20 73 68 6f 75 6c 64 20 74 72 79 20 74 6f 20 65   should try to e
160b0 6e 64 20 69 74 2c 20 6f 77 6e 20 74 68 65 20 54  nd it, own the T
160c0 49 0a 09 20 2a 20 73 74 72 75 63 74 75 72 65 20  I.. * structure 
160d0 28 62 65 63 61 75 73 65 20 6f 66 20 70 6f 73 73  (because of poss
160e0 69 62 6c 65 20 73 68 61 72 69 6e 67 20 74 68 65  ible sharing the
160f0 20 6a 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65   joint structure
16100 73 20 77 69 74 68 0a 09 20 2a 20 74 68 72 65 61  s with.. * threa
16110 64 29 0a 09 20 2a 2f 0a 0a 09 49 6e 74 65 72 6c  d).. */...Interl
16120 6f 63 6b 65 64 45 78 63 68 61 6e 67 65 28 26 70  ockedExchange(&p
16130 69 70 65 54 49 2d 3e 73 74 61 74 65 2c 20 50 54  ipeTI->state, PT
16140 49 5f 53 54 41 54 45 5f 45 4e 44 29 3b 0a 09 62  I_STATE_END);..b
16150 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
16160 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f   return 0;.}.../
16170 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
16180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
161c0 20 54 63 6c 50 69 70 65 54 68 72 65 61 64 53 74   TclPipeThreadSt
161d0 6f 70 20 2d 2d 0a 20 2a 0a 20 2a 09 53 65 6e 64  op --. *. *.Send
161e0 20 73 74 6f 70 20 73 69 67 6e 61 6c 20 74 6f 20   stop signal to 
161f0 74 68 65 20 70 69 70 65 20 77 6f 72 6b 65 72 20  the pipe worker 
16200 61 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68 72  and wait for thr
16210 65 61 64 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 0a  ead completion..
16220 20 2a 0a 20 2a 09 4d 61 79 20 62 65 20 63 6f 6d   *. *.May be com
16230 62 69 6e 65 64 20 77 69 74 68 20 54 63 6c 50 69  bined with TclPi
16240 70 65 54 68 72 65 61 64 53 74 6f 70 53 69 67 6e  peThreadStopSign
16250 61 6c 2e 0a 20 2a 0a 20 2a 09 41 66 74 65 72 20  al.. *. *.After 
16260 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 20  calling of this 
16270 66 75 6e 63 74 69 6f 6e 2c 20 54 49 2d 73 74 72  function, TI-str
16280 75 63 74 75 72 65 20 70 6f 69 6e 74 65 72 20 67  ucture pointer g
16290 69 76 65 6e 20 76 69 61 20 70 69 70 65 54 49 50  iven via pipeTIP
162a0 74 72 0a 20 2a 09 69 73 20 6e 6f 74 20 61 63 63  tr. *.is not acc
162b0 65 73 73 69 62 6c 65 20 28 6f 77 6e 65 64 20 62  essible (owned b
162c0 79 20 70 69 70 65 20 77 6f 72 6b 65 72 20 6f 72  y pipe worker or
162d0 20 72 65 6c 65 61 73 65 64 20 68 65 72 65 29 2e   released here).
162e0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
162f0 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53   *.None.. *. * S
16300 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
16310 43 61 6e 20 74 65 72 6d 69 6e 61 74 65 20 70 69  Can terminate pi
16320 70 65 20 77 6f 72 6b 65 72 20 28 61 6e 64 20 2f  pe worker (and /
16330 20 6f 72 20 73 74 6f 70 20 69 74 73 20 73 79 6e   or stop its syn
16340 63 68 72 6f 6e 6f 75 73 20 6f 70 65 72 61 74 69  chronous operati
16350 6f 6e 73 29 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ons).. *. *-----
16360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163a0 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63 6c 50  -. */..void.TclP
163b0 69 70 65 54 68 72 65 61 64 53 74 6f 70 28 0a 20  ipeThreadStop(. 
163c0 20 20 20 54 63 6c 50 69 70 65 54 68 72 65 61 64     TclPipeThread
163d0 49 6e 66 6f 20 2a 2a 70 69 70 65 54 49 50 74 72  Info **pipeTIPtr
163e0 2c 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 54 68  ,.    HANDLE hTh
163f0 72 65 61 64 29 0a 7b 0a 20 20 20 20 54 63 6c 50  read).{.    TclP
16400 69 70 65 54 68 72 65 61 64 49 6e 66 6f 20 2a 70  ipeThreadInfo *p
16410 69 70 65 54 49 20 3d 20 2a 70 69 70 65 54 49 50  ipeTI = *pipeTIP
16420 74 72 3b 0a 20 20 20 20 48 41 4e 44 4c 45 20 65  tr;.    HANDLE e
16430 76 43 6f 6e 74 72 6f 6c 3b 0a 20 20 20 20 69 6e  vControl;.    in
16440 74 20 73 74 61 74 65 3b 0a 0a 20 20 20 20 69 66  t state;..    if
16450 20 28 21 70 69 70 65 54 49 29 20 7b 0a 09 72 65   (!pipeTI) {..re
16460 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
16470 70 69 70 65 54 49 20 3d 20 2a 70 69 70 65 54 49  pipeTI = *pipeTI
16480 50 74 72 3b 0a 20 20 20 20 65 76 43 6f 6e 74 72  Ptr;.    evContr
16490 6f 6c 20 3d 20 70 69 70 65 54 49 2d 3e 65 76 43  ol = pipeTI->evC
164a0 6f 6e 74 72 6f 6c 3b 0a 20 20 20 20 70 69 70 65  ontrol;.    pipe
164b0 54 49 2d 3e 65 76 57 61 6b 65 55 70 20 3d 20 4e  TI->evWakeUp = N
164c0 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ULL;..    /*.   
164d0 20 20 2a 20 54 72 79 20 74 6f 20 73 61 6e 65 20    * Try to sane 
164e0 73 74 6f 70 20 74 68 65 20 70 69 70 65 20 77 6f  stop the pipe wo
164f0 72 6b 65 72 2c 20 63 6f 72 72 65 73 70 6f 6e 64  rker, correspond
16500 69 6e 67 20 69 74 73 20 63 75 72 72 65 6e 74 20  ing its current 
16510 73 74 61 74 65 0a 20 20 20 20 20 2a 2f 0a 0a 20  state.     */.. 
16520 20 20 20 73 74 61 74 65 20 3d 20 49 6e 74 65 72     state = Inter
16530 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
16540 68 61 6e 67 65 28 26 70 69 70 65 54 49 2d 3e 73  hange(&pipeTI->s
16550 74 61 74 65 2c 20 50 54 49 5f 53 54 41 54 45 5f  tate, PTI_STATE_
16560 53 54 4f 50 2c 0a 09 20 20 20 20 50 54 49 5f 53  STOP,..    PTI_S
16570 54 41 54 45 5f 49 44 4c 45 29 3b 0a 20 20 20 20  TATE_IDLE);.    
16580 73 77 69 74 63 68 20 28 73 74 61 74 65 29 20 7b  switch (state) {
16590 0a 20 20 20 20 63 61 73 65 20 50 54 49 5f 53 54  .    case PTI_ST
165a0 41 54 45 5f 49 44 4c 45 3a 0a 09 2f 2a 0a 09 20  ATE_IDLE:../*.. 
165b0 2a 20 54 68 72 65 61 64 20 77 61 73 20 69 64 6c  * Thread was idl
165c0 65 2f 77 61 69 74 69 6e 67 2c 20 6e 6f 74 69 66  e/waiting, notif
165d0 79 20 69 74 20 67 6f 65 73 20 74 65 61 72 64 6f  y it goes teardo
165e0 77 6e 0a 09 20 2a 2f 0a 0a 09 53 65 74 45 76 65  wn.. */...SetEve
165f0 6e 74 28 65 76 43 6f 6e 74 72 6f 6c 29 3b 0a 0a  nt(evControl);..
16600 09 2f 2a 0a 09 20 2a 20 57 65 20 64 6f 6e 27 74  ./*.. * We don't
16610 20 6e 65 65 64 20 74 6f 20 77 61 69 74 20 66 6f   need to wait fo
16620 72 20 69 74 20 61 74 20 61 6c 6c 2c 20 74 68 72  r it at all, thr
16630 65 61 64 20 66 72 65 65 73 20 68 69 6d 73 65 6c  ead frees himsel
16640 66 20 28 6f 77 6e 73 20 74 68 65 0a 09 20 2a 20  f (owns the.. * 
16650 54 49 20 73 74 72 75 63 74 75 72 65 29 0a 09 20  TI structure).. 
16660 2a 2f 0a 0a 09 70 69 70 65 54 49 20 3d 20 4e 55  */...pipeTI = NU
16670 4c 4c 3b 0a 09 62 72 65 61 6b 3b 0a 0a 20 20 20  LL;..break;..   
16680 20 63 61 73 65 20 50 54 49 5f 53 54 41 54 45 5f   case PTI_STATE_
16690 53 54 4f 50 3a 0a 09 2f 2a 0a 09 20 2a 20 41 6c  STOP:../*.. * Al
166a0 72 65 61 64 79 20 73 74 6f 70 70 65 64 2c 20 74  ready stopped, t
166b0 68 72 65 61 64 20 66 72 65 65 73 20 68 69 6d 73  hread frees hims
166c0 65 6c 66 20 28 6f 77 6e 73 20 74 68 65 20 54 49  elf (owns the TI
166d0 20 73 74 72 75 63 74 75 72 65 29 0a 09 20 2a 2f   structure).. */
166e0 0a 0a 09 70 69 70 65 54 49 20 3d 20 4e 55 4c 4c  ...pipeTI = NULL
166f0 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
16700 73 65 20 50 54 49 5f 53 54 41 54 45 5f 44 4f 57  se PTI_STATE_DOW
16710 4e 3a 0a 09 2f 2a 0a 09 20 2a 20 54 68 72 65 61  N:../*.. * Threa
16720 64 20 61 6c 72 65 61 64 79 20 64 6f 77 6e 20 28  d already down (
16730 3f 29 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 0a 09  ?), do nothing..
16740 20 2a 2f 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65 20   */.../*.. * We 
16750 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 61  don't need to wa
16760 69 74 20 66 6f 72 20 69 74 2c 20 62 75 74 20 77  it for it, but w
16770 65 20 73 68 6f 75 6c 64 20 66 72 65 65 20 70 69  e should free pi
16780 70 65 54 49 0a 09 20 2a 2f 0a 09 68 54 68 72 65  peTI.. */..hThre
16790 61 64 20 3d 20 4e 55 4c 4c 3b 0a 09 62 72 65 61  ad = NULL;..brea
167a0 6b 3b 0a 0a 09 2f 2a 20 63 61 73 65 20 50 54 49  k;.../* case PTI
167b0 5f 53 54 41 54 45 5f 57 4f 52 4b 3a 20 2a 2f 0a  _STATE_WORK: */.
167c0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a      default:../*
167d0 0a 09 20 2a 20 54 68 72 65 61 64 20 77 6f 72 6b  .. * Thread work
167e0 73 20 63 75 72 72 65 6e 74 6c 79 2c 20 77 65 20  s currently, we 
167f0 73 68 6f 75 6c 64 20 74 72 79 20 74 6f 20 65 6e  should try to en
16800 64 20 69 74 2c 20 6f 77 6e 20 74 68 65 20 54 49  d it, own the TI
16810 0a 09 20 2a 20 73 74 72 75 63 74 75 72 65 20 28  .. * structure (
16820 62 65 63 61 75 73 65 20 6f 66 20 70 6f 73 73 69  because of possi
16830 62 6c 65 20 73 68 61 72 69 6e 67 20 74 68 65 20  ble sharing the 
16840 6a 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73  joint structures
16850 20 77 69 74 68 0a 09 20 2a 20 74 68 72 65 61 64   with.. * thread
16860 29 0a 09 20 2a 2f 0a 0a 09 73 74 61 74 65 20 3d  ).. */...state =
16870 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70   InterlockedComp
16880 61 72 65 45 78 63 68 61 6e 67 65 28 26 70 69 70  areExchange(&pip
16890 65 54 49 2d 3e 73 74 61 74 65 2c 20 50 54 49 5f  eTI->state, PTI_
168a0 53 54 41 54 45 5f 45 4e 44 2c 0a 09 09 50 54 49  STATE_END,...PTI
168b0 5f 53 54 41 54 45 5f 57 4f 52 4b 29 3b 0a 09 69  _STATE_WORK);..i
168c0 66 20 28 73 74 61 74 65 20 3d 3d 20 50 54 49 5f  f (state == PTI_
168d0 53 54 41 54 45 5f 44 4f 57 4e 29 20 7b 0a 09 20  STATE_DOWN) {.. 
168e0 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57 65     /*..     * We
168f0 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77   don't need to w
16900 61 69 74 20 66 6f 72 20 69 74 2c 20 62 75 74 20  ait for it, but 
16910 77 65 20 73 68 6f 75 6c 64 20 66 72 65 65 20 70  we should free p
16920 69 70 65 54 49 0a 09 20 20 20 20 20 2a 2f 0a 09  ipeTI..     */..
16930 20 20 20 20 68 54 68 72 65 61 64 20 3d 20 4e 55      hThread = NU
16940 4c 4c 3b 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20  LL;..}..break;. 
16950 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 70 69     }..    if (pi
16960 70 65 54 49 20 26 26 20 68 54 68 72 65 61 64 29  peTI && hThread)
16970 20 7b 0a 09 44 57 4f 52 44 20 65 78 69 74 43 6f   {..DWORD exitCo
16980 64 65 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65  de;.../*.. * The
16990 20 74 68 72 65 61 64 20 6d 61 79 20 61 6c 72 65   thread may alre
169a0 61 64 79 20 68 61 76 65 20 63 6c 6f 73 65 64 20  ady have closed 
169b0 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 43 68 65 63  on its own. Chec
169c0 6b 20 69 74 73 20 65 78 69 74 0a 09 20 2a 20 63  k its exit.. * c
169d0 6f 64 65 2e 0a 09 20 2a 2f 0a 0a 09 47 65 74 45  ode... */...GetE
169e0 78 69 74 43 6f 64 65 54 68 72 65 61 64 28 68 54  xitCodeThread(hT
169f0 68 72 65 61 64 2c 20 26 65 78 69 74 43 6f 64 65  hread, &exitCode
16a00 29 3b 0a 0a 09 69 66 20 28 65 78 69 74 43 6f 64  );...if (exitCod
16a10 65 20 3d 3d 20 53 54 49 4c 4c 5f 41 43 54 49 56  e == STILL_ACTIV
16a20 45 29 20 7b 0a 09 20 20 20 20 69 6e 74 20 69 6e  E) {..    int in
16a30 45 78 69 74 20 3d 20 28 54 63 6c 49 6e 45 78 69  Exit = (TclInExi
16a40 74 28 29 20 7c 7c 20 54 63 6c 49 6e 54 68 72 65  t() || TclInThre
16a50 61 64 45 78 69 74 28 29 29 3b 0a 0a 09 20 20 20  adExit());...   
16a60 20 2f 2a 0a 09 20 20 20 20 20 2a 20 53 65 74 20   /*..     * Set 
16a70 74 68 65 20 73 74 6f 70 20 65 76 65 6e 74 20 73  the stop event s
16a80 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 70 69  o that if the pi
16a90 70 65 20 74 68 72 65 61 64 20 69 73 20 62 6c 6f  pe thread is blo
16aa0 63 6b 65 64 0a 09 20 20 20 20 20 2a 20 73 6f 6d  cked..     * som
16ab0 65 77 68 65 72 65 2c 20 69 74 20 6d 61 79 20 68  ewhere, it may h
16ac0 65 72 65 61 66 74 65 72 20 73 61 6e 65 20 65 78  ereafter sane ex
16ad0 69 74 20 63 6c 65 61 6e 6c 79 2e 0a 09 20 20 20  it cleanly...   
16ae0 20 20 2a 2f 0a 0a 09 20 20 20 20 53 65 74 45 76    */...    SetEv
16af0 65 6e 74 28 65 76 43 6f 6e 74 72 6f 6c 29 3b 0a  ent(evControl);.
16b00 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
16b10 20 43 61 6e 63 65 6c 20 61 6c 6c 20 73 79 6e 63   Cancel all sync
16b20 2d 49 4f 20 6f 66 20 74 68 69 73 20 74 68 72 65  -IO of this thre
16b30 61 64 20 28 6d 61 79 20 62 65 20 62 6c 6f 63 6b  ad (may be block
16b40 65 64 20 74 68 65 72 65 29 2e 0a 09 20 20 20 20  ed there)...    
16b50 20 2a 2f 0a 0a 09 20 20 20 20 43 61 6e 63 65 6c   */...    Cancel
16b60 53 79 6e 63 68 72 6f 6e 6f 75 73 49 6f 28 68 54  SynchronousIo(hT
16b70 68 72 65 61 64 29 3b 0a 0a 09 20 20 20 20 2f 2a  hread);...    /*
16b80 0a 09 20 20 20 20 20 2a 20 57 61 69 74 20 61 74  ..     * Wait at
16b90 20 6d 6f 73 74 20 32 30 20 6d 69 6c 6c 69 73 65   most 20 millise
16ba0 63 6f 6e 64 73 20 66 6f 72 20 74 68 65 20 72 65  conds for the re
16bb0 61 64 65 72 20 74 68 72 65 61 64 20 74 6f 20 63  ader thread to c
16bc0 6c 6f 73 65 0a 09 20 20 20 20 20 2a 20 28 72 65  lose..     * (re
16bd0 67 61 72 64 69 6e 67 20 54 49 50 23 33 39 38 2d  garding TIP#398-
16be0 66 61 73 74 2d 65 78 69 74 29 2e 0a 09 20 20 20  fast-exit)...   
16bf0 20 20 2a 2f 0a 0a 09 20 20 20 20 2f 2a 0a 09 20    */...    /*.. 
16c00 20 20 20 20 2a 20 49 66 20 77 65 20 77 61 6e 74      * If we want
16c10 20 54 49 50 23 33 39 38 2d 66 61 73 74 2d 65 78   TIP#398-fast-ex
16c20 69 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  it...     */... 
16c30 20 20 20 69 66 20 28 57 61 69 74 46 6f 72 53 69     if (WaitForSi
16c40 6e 67 6c 65 4f 62 6a 65 63 74 28 68 54 68 72 65  ngleObject(hThre
16c50 61 64 2c 20 69 6e 45 78 69 74 20 3f 20 30 20 3a  ad, inExit ? 0 :
16c60 20 32 30 29 20 3d 3d 20 57 41 49 54 5f 54 49 4d   20) == WAIT_TIM
16c70 45 4f 55 54 29 20 7b 0a 09 09 2f 2a 0a 09 09 20  EOUT) {.../*... 
16c80 2a 20 54 68 65 20 74 68 72 65 61 64 20 6d 75 73  * The thread mus
16c90 74 20 62 65 20 62 6c 6f 63 6b 65 64 20 77 61 69  t be blocked wai
16ca0 74 69 6e 67 20 66 6f 72 20 74 68 65 20 70 69 70  ting for the pip
16cb0 65 20 74 6f 20 62 65 63 6f 6d 65 0a 09 09 20 2a  e to become... *
16cc0 20 72 65 61 64 61 62 6c 65 20 69 6e 20 52 65 61   readable in Rea
16cd0 64 46 69 6c 65 28 29 2e 20 54 68 65 72 65 20 69  dFile(). There i
16ce0 73 6e 27 74 20 61 20 63 6c 65 61 6e 20 77 61 79  sn't a clean way
16cf0 20 74 6f 20 65 78 69 74 20 74 68 65 0a 09 09 20   to exit the... 
16d00 2a 20 74 68 72 65 61 64 20 66 72 6f 6d 20 74 68  * thread from th
16d10 69 73 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 57 65  is condition. We
16d20 20 73 68 6f 75 6c 64 20 74 65 72 6d 69 6e 61 74   should terminat
16d30 65 20 74 68 65 20 63 68 69 6c 64 0a 09 09 20 2a  e the child... *
16d40 20 70 72 6f 63 65 73 73 20 69 6e 73 74 65 61 64   process instead
16d50 20 74 6f 20 67 65 74 20 74 68 65 20 72 65 61 64   to get the read
16d60 65 72 20 74 68 72 65 61 64 20 74 6f 20 66 61 6c  er thread to fal
16d70 6c 20 6f 75 74 20 6f 66 0a 09 09 20 2a 20 52 65  l out of... * Re
16d80 61 64 46 69 6c 65 20 77 69 74 68 20 61 20 46 41  adFile with a FA
16d90 4c 53 45 2e 20 28 62 65 6c 6f 77 29 20 69 73 20  LSE. (below) is 
16da0 6e 6f 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  not the correct 
16db0 77 61 79 20 74 6f 20 64 6f 0a 09 09 20 2a 20 74  way to do... * t
16dc0 68 69 73 2c 20 62 75 74 20 77 69 6c 6c 20 73 74  his, but will st
16dd0 61 79 20 68 65 72 65 20 75 6e 74 69 6c 20 61 20  ay here until a 
16de0 62 65 74 74 65 72 20 73 6f 6c 75 74 69 6f 6e 20  better solution 
16df0 69 73 20 66 6f 75 6e 64 2e 0a 09 09 20 2a 0a 09  is found.... *..
16e00 09 20 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 65  . * Note that we
16e10 20 6e 65 65 64 20 74 6f 20 67 75 61 72 64 20 61   need to guard a
16e20 67 61 69 6e 73 74 20 74 65 72 6d 69 6e 61 74 69  gainst terminati
16e30 6e 67 20 74 68 65 20 74 68 72 65 61 64 0a 09 09  ng the thread...
16e40 20 2a 20 77 68 69 6c 65 20 69 74 20 69 73 20 69   * while it is i
16e50 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
16e60 54 63 6c 5f 54 68 72 65 61 64 41 6c 65 72 74 20  Tcl_ThreadAlert 
16e70 62 65 63 61 75 73 65 20 69 74 0a 09 09 20 2a 20  because it... * 
16e80 77 6f 6e 27 74 20 62 65 20 61 62 6c 65 20 74 6f  won't be able to
16e90 20 72 65 6c 65 61 73 65 20 74 68 65 20 6e 6f 74   release the not
16ea0 69 66 69 65 72 20 6c 6f 63 6b 2e 0a 09 09 20 2a  ifier lock.... *
16eb0 0a 09 09 20 2a 20 41 6c 73 6f 20 6e 6f 74 65 20  ... * Also note 
16ec0 74 68 61 74 20 74 65 72 6d 69 6e 61 74 69 6e 67  that terminating
16ed0 20 74 68 72 65 61 64 73 20 64 75 72 69 6e 67 20   threads during 
16ee0 74 68 65 69 72 0a 09 09 20 2a 20 69 6e 69 74 69  their... * initi
16ef0 61 6c 69 7a 61 74 69 6f 6e 20 6f 72 20 74 65 61  alization or tea
16f00 72 64 6f 77 6e 20 70 68 61 73 65 20 6d 61 79 20  rdown phase may 
16f10 72 65 73 75 6c 74 20 69 6e 20 6e 74 64 6c 6c 2e  result in ntdll.
16f20 64 6c 6c 27 73 0a 09 09 20 2a 20 4c 6f 61 64 65  dll's... * Loade
16f30 72 4c 6f 63 6b 20 74 6f 20 72 65 6d 61 69 6e 20  rLock to remain 
16f40 6c 6f 63 6b 65 64 20 69 6e 64 65 66 69 6e 69 74  locked indefinit
16f50 65 6c 79 2e 20 20 54 68 69 73 20 63 61 75 73 65  ely.  This cause
16f60 73 0a 09 09 20 2a 20 6e 74 64 6c 6c 2e 64 6c 6c  s... * ntdll.dll
16f70 27 73 20 4c 64 72 70 49 6e 69 74 69 61 6c 69 7a  's LdrpInitializ
16f80 65 54 68 72 65 61 64 28 29 20 74 6f 20 64 65 61  eThread() to dea
16f90 64 6c 6f 63 6b 20 74 72 79 69 6e 67 20 74 6f 0a  dlock trying to.
16fa0 09 09 20 2a 20 61 63 71 75 69 72 65 20 4c 6f 61  .. * acquire Loa
16fb0 64 65 72 4c 6f 63 6b 2e 20 20 4c 64 72 70 49 6e  derLock.  LdrpIn
16fc0 69 74 69 61 6c 69 7a 65 54 68 72 65 61 64 28 29  itializeThread()
16fd0 20 69 73 20 65 78 65 63 75 74 65 64 0a 09 09 20   is executed... 
16fe0 2a 20 77 69 74 68 69 6e 20 6e 65 77 20 74 68 72  * within new thr
16ff0 65 61 64 73 20 74 6f 20 70 65 72 66 6f 72 6d 20  eads to perform 
17000 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61  initialization a
17010 6e 64 20 74 6f 20 65 78 65 63 75 74 65 0a 09 09  nd to execute...
17020 20 2a 20 44 6c 6c 4d 61 69 6e 28 29 20 6f 66 20   * DllMain() of 
17030 61 6c 6c 20 6c 6f 61 64 65 64 20 64 6c 6c 73 2e  all loaded dlls.
17040 20 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20 61    As a result, a
17050 6c 6c 20 6e 65 77 20 74 68 72 65 61 64 73 0a 09  ll new threads..
17060 09 20 2a 20 61 72 65 20 64 65 61 64 6c 6f 63 6b  . * are deadlock
17070 65 64 20 69 6e 20 74 68 65 69 72 20 69 6e 69 74  ed in their init
17080 69 61 6c 69 7a 61 74 69 6f 6e 20 70 68 61 73 65  ialization phase
17090 20 61 6e 64 20 6e 65 76 65 72 0a 09 09 20 2a 20   and never... * 
170a0 65 78 65 63 75 74 65 2c 20 65 76 65 6e 20 74 68  execute, even th
170b0 6f 75 67 68 20 43 72 65 61 74 65 54 68 72 65 61  ough CreateThrea
170c0 64 28 29 20 72 65 70 6f 72 74 73 20 73 75 63 63  d() reports succ
170d0 65 73 73 66 75 6c 0a 09 09 20 2a 20 74 68 72 65  essful... * thre
170e0 61 64 20 63 72 65 61 74 69 6f 6e 2e 20 20 54 68  ad creation.  Th
170f0 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
17100 76 65 72 79 20 77 65 69 72 64 20 70 72 6f 63 65  very weird proce
17110 73 73 2d 77 69 64 65 0a 09 09 20 2a 20 62 65 68  ss-wide... * beh
17120 61 76 69 6f 72 2c 20 77 68 69 63 68 20 69 73 20  avior, which is 
17130 65 78 74 72 65 6d 65 6c 79 20 68 61 72 64 20 74  extremely hard t
17140 6f 20 64 65 62 75 67 2e 0a 09 09 20 2a 0a 09 09  o debug.... *...
17150 20 2a 20 54 48 52 45 41 44 53 20 53 48 4f 55 4c   * THREADS SHOUL
17160 44 20 4e 45 56 45 52 20 42 45 20 54 45 52 4d 49  D NEVER BE TERMI
17170 4e 41 54 45 44 2e 20 50 65 72 69 6f 64 2e 0a 09  NATED. Period...
17180 09 20 2a 0a 09 09 20 2a 20 42 75 74 20 66 6f 72  . *... * But for
17190 20 6e 6f 77 2c 20 63 68 65 63 6b 20 69 66 20 74   now, check if t
171a0 68 72 65 61 64 20 69 73 20 65 78 69 74 69 6e 67  hread is exiting
171b0 2c 20 61 6e 64 20 69 66 20 73 6f 2c 20 6c 65 74  , and if so, let
171c0 20 69 74 0a 09 09 20 2a 20 64 69 65 20 70 65 61   it... * die pea
171d0 63 65 66 75 6c 6c 79 2e 0a 09 09 20 2a 0a 09 09  cefully.... *...
171e0 20 2a 20 41 6c 73 6f 20 64 6f 6e 27 74 20 74 65   * Also don't te
171f0 72 6d 69 6e 61 74 65 20 69 66 20 69 6e 20 65 78  rminate if in ex
17200 69 74 20 28 6f 74 68 65 72 77 69 73 65 20 64 65  it (otherwise de
17210 61 64 6c 6f 63 6b 65 64 20 69 6e 0a 09 09 20 2a  adlocked in... *
17220 20 6e 74 64 6c 6c 2e 64 6c 6c 27 73 29 2e 0a 09   ntdll.dll's)...
17230 09 20 2a 2f 0a 0a 09 09 69 66 20 28 70 69 70 65  . */....if (pipe
17240 54 49 2d 3e 73 74 61 74 65 20 21 3d 20 50 54 49  TI->state != PTI
17250 5f 53 54 41 54 45 5f 44 4f 57 4e 0a 09 09 09 26  _STATE_DOWN....&
17260 26 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  & WaitForSingleO
17270 62 6a 65 63 74 28 68 54 68 72 65 61 64 2c 0a 09  bject(hThread,..
17280 09 09 09 69 6e 45 78 69 74 20 3f 20 35 30 20 3a  ...inExit ? 50 :
17290 20 35 30 30 30 29 20 21 3d 20 57 41 49 54 5f 4f   5000) != WAIT_O
172a0 42 4a 45 43 54 5f 30 29 20 7b 0a 09 09 20 20 20  BJECT_0) {...   
172b0 20 2f 2a 20 42 55 47 3a 20 74 68 69 73 20 6c 65   /* BUG: this le
172c0 61 6b 73 20 6d 65 6d 6f 72 79 20 2a 2f 0a 09 09  aks memory */...
172d0 20 20 20 20 69 66 20 28 69 6e 45 78 69 74 20 7c      if (inExit |
172e0 7c 20 21 54 65 72 6d 69 6e 61 74 65 54 68 72 65  | !TerminateThre
172f0 61 64 28 68 54 68 72 65 61 64 2c 20 30 29 29 20  ad(hThread, 0)) 
17300 7b 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 69 6e  {..../*.... * in
17310 20 65 78 69 74 20 6f 72 20 74 65 72 6d 69 6e 61   exit or termina
17320 74 65 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 67  te fails, just g
17330 69 76 65 20 74 68 72 65 61 64 20 61 0a 09 09 09  ive thread a....
17340 20 2a 20 63 68 61 6e 63 65 20 74 6f 20 65 78 69   * chance to exi
17350 74 0a 09 09 09 20 2a 2f 0a 0a 09 09 09 69 66 20  t.... */.....if 
17360 28 49 6e 74 65 72 6c 6f 63 6b 65 64 45 78 63 68  (InterlockedExch
17370 61 6e 67 65 28 26 70 69 70 65 54 49 2d 3e 73 74  ange(&pipeTI->st
17380 61 74 65 2c 0a 09 09 09 09 50 54 49 5f 53 54 41  ate,.....PTI_STA
17390 54 45 5f 53 54 4f 50 29 20 21 3d 20 50 54 49 5f  TE_STOP) != PTI_
173a0 53 54 41 54 45 5f 44 4f 57 4e 29 20 7b 0a 09 09  STATE_DOWN) {...
173b0 09 20 20 20 20 70 69 70 65 54 49 20 3d 20 4e 55  .    pipeTI = NU
173c0 4c 4c 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d  LL;....}...    }
173d0 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  ...}..    }..}. 
173e0 20 20 20 7d 0a 0a 20 20 20 20 2a 70 69 70 65 54     }..    *pipeT
173f0 49 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  IPtr = NULL;.   
17400 20 69 66 20 28 70 69 70 65 54 49 29 20 7b 0a 09   if (pipeTI) {..
17410 69 66 20 28 70 69 70 65 54 49 2d 3e 65 76 57 61  if (pipeTI->evWa
17420 6b 65 55 70 29 20 7b 0a 09 20 20 20 20 53 65 74  keUp) {..    Set
17430 45 76 65 6e 74 28 70 69 70 65 54 49 2d 3e 65 76  Event(pipeTI->ev
17440 57 61 6b 65 55 70 29 3b 0a 09 7d 0a 09 43 6c 6f  WakeUp);..}..Clo
17450 73 65 48 61 6e 64 6c 65 28 70 69 70 65 54 49 2d  seHandle(pipeTI-
17460 3e 65 76 43 6f 6e 74 72 6f 6c 29 3b 0a 23 69 66  >evControl);.#if
17470 6e 64 65 66 20 5f 50 54 49 5f 55 53 45 5f 43 4b  ndef _PTI_USE_CK
17480 41 4c 4c 4f 43 0a 09 66 72 65 65 28 70 69 70 65  ALLOC..free(pipe
17490 54 49 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  TI);.#else..Tcl_
174a0 46 72 65 65 28 70 69 70 65 54 49 29 3b 0a 23 65  Free(pipeTI);.#e
174b0 6e 64 69 66 20 2f 2a 20 21 5f 50 54 49 5f 55 53  ndif /* !_PTI_US
174c0 45 5f 43 4b 41 4c 4c 4f 43 20 2a 2f 0a 20 20 20  E_CKALLOC */.   
174d0 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   }.}.../*. *----
174e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
174f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17520 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 50 69 70 65  --. *. * TclPipe
17530 54 68 72 65 61 64 45 78 69 74 20 2d 2d 0a 20 2a  ThreadExit --. *
17540 0a 20 2a 09 43 6c 65 61 6e 2d 75 70 20 66 6f 72  . *.Clean-up for
17550 20 74 68 65 20 70 69 70 65 20 74 68 72 65 61 64   the pipe thread
17560 20 28 72 65 6d 6f 76 65 73 20 6f 77 6e 65 64 20   (removes owned 
17570 54 49 2d 73 74 72 75 63 74 75 72 65 20 69 6e 20  TI-structure in 
17580 77 6f 72 6b 65 72 29 2e 0a 20 2a 0a 20 2a 09 53  worker).. *. *.S
17590 68 6f 75 6c 64 20 62 65 20 65 78 65 63 75 74 65  hould be execute
175a0 64 20 6f 6e 20 77 6f 72 6b 65 72 20 65 78 69 74  d on worker exit
175b0 2c 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20  , to inform the 
175c0 6d 61 69 6e 20 74 68 72 65 61 64 20 6f 72 0a 20  main thread or. 
175d0 2a 09 66 72 65 65 20 54 49 2d 73 74 72 75 63 74  *.free TI-struct
175e0 75 72 65 20 28 69 66 20 6f 77 6e 65 64 29 2e 0a  ure (if owned)..
175f0 20 2a 0a 20 2a 09 41 66 74 65 72 20 63 61 6c 6c   *. *.After call
17600 69 6e 67 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ing of this func
17610 74 69 6f 6e 2c 20 54 49 2d 73 74 72 75 63 74 75  tion, TI-structu
17620 72 65 20 70 6f 69 6e 74 65 72 20 67 69 76 65 6e  re pointer given
17630 20 76 69 61 20 70 69 70 65 54 49 50 74 72 0a 20   via pipeTIPtr. 
17640 2a 09 69 73 20 6e 6f 74 20 61 63 63 65 73 73 69  *.is not accessi
17650 62 6c 65 20 28 6f 77 6e 65 64 20 62 79 20 6d 61  ble (owned by ma
17660 69 6e 20 74 68 72 65 61 64 20 6f 72 20 72 65 6c  in thread or rel
17670 65 61 73 65 64 20 68 65 72 65 29 2e 0a 20 2a 0a  eased here).. *.
17680 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
17690 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
176a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176e0 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63 6c 50 69  . */..void.TclPi
176f0 70 65 54 68 72 65 61 64 45 78 69 74 28 0a 20 20  peThreadExit(.  
17700 20 20 54 63 6c 50 69 70 65 54 68 72 65 61 64 49    TclPipeThreadI
17710 6e 66 6f 20 2a 2a 70 69 70 65 54 49 50 74 72 29  nfo **pipeTIPtr)
17720 0a 7b 0a 20 20 20 20 4c 4f 4e 47 20 73 74 61 74  .{.    LONG stat
17730 65 3b 0a 20 20 20 20 54 63 6c 50 69 70 65 54 68  e;.    TclPipeTh
17740 72 65 61 64 49 6e 66 6f 20 2a 70 69 70 65 54 49  readInfo *pipeTI
17750 20 3d 20 2a 70 69 70 65 54 49 50 74 72 3b 0a 0a   = *pipeTIPtr;..
17760 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66      /*.     * If
17770 20 73 74 61 74 65 20 6f 66 20 74 68 72 65 61 64   state of thread
17780 20 77 61 73 20 73 65 74 20 74 6f 20 73 74 6f 70   was set to stop
17790 20 28 65 78 61 63 74 6c 79 29 2c 20 77 65 20 63   (exactly), we c
177a0 61 6e 20 73 61 6e 65 20 66 72 65 65 20 69 74 73  an sane free its
177b0 20 69 6e 66 6f 0a 20 20 20 20 20 2a 20 73 74 72   info.     * str
177c0 75 63 74 75 72 65 2c 20 6f 74 68 65 72 77 69 73  ucture, otherwis
177d0 65 20 69 74 20 69 73 20 73 68 61 72 65 64 20 77  e it is shared w
177e0 69 74 68 20 6d 61 69 6e 20 74 68 72 65 61 64 2c  ith main thread,
177f0 20 73 6f 20 6d 61 69 6e 20 74 68 72 65 61 64 20   so main thread 
17800 77 69 6c 6c 0a 20 20 20 20 20 2a 20 6f 77 6e 20  will.     * own 
17810 69 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  it..     */..   
17820 20 69 66 20 28 21 70 69 70 65 54 49 29 20 7b 0a   if (!pipeTI) {.
17830 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20  .return;.    }. 
17840 20 20 20 2a 70 69 70 65 54 49 50 74 72 20 3d 20     *pipeTIPtr = 
17850 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 65 20  NULL;.    state 
17860 3d 20 49 6e 74 65 72 6c 6f 63 6b 65 64 45 78 63  = InterlockedExc
17870 68 61 6e 67 65 28 26 70 69 70 65 54 49 2d 3e 73  hange(&pipeTI->s
17880 74 61 74 65 2c 20 50 54 49 5f 53 54 41 54 45 5f  tate, PTI_STATE_
17890 44 4f 57 4e 29 3b 0a 20 20 20 20 69 66 20 28 73  DOWN);.    if (s
178a0 74 61 74 65 20 3d 3d 20 50 54 49 5f 53 54 41 54  tate == PTI_STAT
178b0 45 5f 53 54 4f 50 29 20 7b 0a 09 43 6c 6f 73 65  E_STOP) {..Close
178c0 48 61 6e 64 6c 65 28 70 69 70 65 54 49 2d 3e 65  Handle(pipeTI->e
178d0 76 43 6f 6e 74 72 6f 6c 29 3b 0a 09 69 66 20 28  vControl);..if (
178e0 70 69 70 65 54 49 2d 3e 65 76 57 61 6b 65 55 70  pipeTI->evWakeUp
178f0 29 20 7b 0a 09 20 20 20 20 53 65 74 45 76 65 6e  ) {..    SetEven
17900 74 28 70 69 70 65 54 49 2d 3e 65 76 57 61 6b 65  t(pipeTI->evWake
17910 55 70 29 3b 0a 09 7d 0a 23 69 66 6e 64 65 66 20  Up);..}.#ifndef 
17920 5f 50 54 49 5f 55 53 45 5f 43 4b 41 4c 4c 4f 43  _PTI_USE_CKALLOC
17930 0a 09 66 72 65 65 28 70 69 70 65 54 49 29 3b 0a  ..free(pipeTI);.
17940 23 65 6c 73 65 0a 09 54 63 6c 5f 46 72 65 65 28  #else..Tcl_Free(
17950 70 69 70 65 54 49 29 3b 0a 09 2f 2a 20 62 65 20  pipeTI);../* be 
17960 73 75 72 65 20 61 6c 6c 20 73 75 62 73 79 73 74  sure all subsyst
17970 65 6d 73 20 75 73 65 64 20 61 72 65 20 66 69 6e  ems used are fin
17980 61 6c 69 7a 65 64 20 2a 2f 0a 09 54 63 6c 5f 46  alized */..Tcl_F
17990 69 6e 61 6c 69 7a 65 54 68 72 65 61 64 28 29 3b  inalizeThread();
179a0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 5f 50 54 49  .#endif /* !_PTI
179b0 5f 55 53 45 5f 43 4b 41 4c 4c 4f 43 20 2a 2f 0a  _USE_CKALLOC */.
179c0 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20      }.}.../*. * 
179d0 4c 6f 63 61 6c 20 56 61 72 69 61 62 6c 65 73 3a  Local Variables:
179e0 0a 20 2a 20 6d 6f 64 65 3a 20 63 0a 20 2a 20 63  . * mode: c. * c
179f0 2d 62 61 73 69 63 2d 6f 66 66 73 65 74 3a 20 34  -basic-offset: 4
17a00 0a 20 2a 20 66 69 6c 6c 2d 63 6f 6c 75 6d 6e 3a  . * fill-column:
17a10 20 37 38 0a 20 2a 20 45 6e 64 3a 0a 20 2a 2f 0a   78. * End:. */.