Hex Artifact Content
Not logged in

Artifact d2dbbd685c4b68cc142df74c4fb2f73486a642e1:

Attachment "my_popen.h" to ticket [11622724e5] added by anonymous 2010-08-26 09:04:55.
0000: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 49  #if defined(__MI
0010: 4e 47 57 33 32 5f 5f 29 0d 0a 23 69 6e 63 6c 75  NGW32__)..#inclu
0020: 64 65 20 3c 73 79 73 2f 66 63 6e 74 6c 2e 68 3e  de <sys/fcntl.h>
0030: 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 68 61  ..#include <tcha
0040: 72 2e 68 3e 0d 0a 23 69 6e 63 6c 75 64 65 20 3c  r.h>..#include <
0050: 77 69 6e 64 6f 77 73 2e 68 3e 0d 0a 0d 0a 2f 2a  windows.h>..../*
0060: 0d 0a 20 2a 20 44 69 73 70 6c 61 79 20 74 68 65  .. * Display the
0070: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f   error message o
0080: 66 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  f Windows system
0090: 20 63 61 6c 6c 20 0d 0a 20 2a 2f 0d 0a 76 6f 69   call .. */..voi
00a0: 64 20 45 72 72 6f 72 45 78 69 74 28 4c 50 54 53  d ErrorExit(LPTS
00b0: 54 52 20 6c 70 73 7a 46 75 6e 63 74 69 6f 6e 29  TR lpszFunction)
00c0: 20 0d 0a 7b 20 0d 0a 20 20 20 20 2f 2a 20 52 65   ..{ ..    /* Re
00d0: 74 72 69 65 76 65 20 74 68 65 20 73 79 73 74 65  trieve the syste
00e0: 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  m error message 
00f0: 66 6f 72 20 74 68 65 20 6c 61 73 74 2d 65 72 72  for the last-err
0100: 6f 72 20 63 6f 64 65 20 2a 2f 0d 0a 20 20 20 20  or code */..    
0110: 54 43 48 41 52 20 62 75 66 66 5b 31 30 32 34 5d  TCHAR buff[1024]
0120: 20 3d 20 7b 7d 3b 0d 0a 20 20 20 20 44 57 4f 52   = {};..    DWOR
0130: 44 20 64 77 20 3d 20 47 65 74 4c 61 73 74 45 72  D dw = GetLastEr
0140: 72 6f 72 28 29 3b 20 0d 0a 0d 0a 20 20 20 20 46  ror(); ....    F
0150: 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 0d 0a 20  ormatMessage(.. 
0160: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
0170: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
0180: 4d 20 7c 0d 0a 20 20 20 20 20 20 20 20 46 4f 52  M |..        FOR
0190: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
01a0: 52 45 5f 49 4e 53 45 52 54 53 2c 0d 0a 20 20 20  RE_INSERTS,..   
01b0: 20 20 20 20 20 4e 55 4c 4c 2c 0d 0a 20 20 20 20       NULL,..    
01c0: 20 20 20 20 64 77 2c 0d 0a 20 20 20 20 20 20 20      dw,..       
01d0: 20 4d 41 4b 45 4c 41 4e 47 49 44 28 4c 41 4e 47   MAKELANGID(LANG
01e0: 5f 4e 45 55 54 52 41 4c 2c 20 53 55 42 4c 41 4e  _NEUTRAL, SUBLAN
01f0: 47 5f 44 45 46 41 55 4c 54 29 2c 0d 0a 20 20 20  G_DEFAULT),..   
0200: 20 20 20 20 20 26 62 75 66 66 2c 0d 0a 20 20 20       &buff,..   
0210: 20 20 20 20 20 73 69 7a 65 6f 66 28 62 75 66 66       sizeof(buff
0220: 29 2f 73 69 7a 65 6f 66 28 62 75 66 66 5b 30 5d  )/sizeof(buff[0]
0230: 29 2c 20 0d 0a 20 20 20 20 20 20 20 20 4e 55 4c  ), ..        NUL
0240: 4c 20 29 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 20 44  L );....    /* D
0250: 69 73 70 6c 61 79 20 74 68 65 20 65 72 72 6f 72  isplay the error
0260: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78 69   message and exi
0270: 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 2a 2f  t the process */
0280: 0d 0a 20 20 20 20 5f 66 74 70 72 69 6e 74 66 28  ..    _ftprintf(
0290: 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 25 73 5c  stderr, "%s\n%s\
02a0: 6e 22 2c 20 62 75 66 66 2c 20 6c 70 73 7a 46 75  n", buff, lpszFu
02b0: 6e 63 74 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20  nction);....    
02c0: 45 78 69 74 50 72 6f 63 65 73 73 28 64 77 29 3b  ExitProcess(dw);
02d0: 20 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 20 2a 20 43   ..}..../*.. * C
02e0: 6f 6e 76 65 72 74 20 61 20 57 69 6e 64 6f 77 73  onvert a Windows
02f0: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 74 6f 20   file handle to 
0300: 63 72 74 20 74 79 70 65 20 46 49 4c 45 2a 0d 0a  crt type FILE*..
0310: 20 2a 2f 0d 0a 46 49 4c 45 2a 20 66 68 6f 70 65   */..FILE* fhope
0320: 6e 28 48 41 4e 44 4c 45 20 68 46 69 6c 65 2c 20  n(HANDLE hFile, 
0330: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64  const char *zMod
0340: 65 29 7b 0d 0a 20 20 20 20 69 6e 74 20 66 64 20  e){..    int fd 
0350: 3d 20 5f 6f 70 65 6e 5f 6f 73 66 68 61 6e 64 6c  = _open_osfhandl
0360: 65 28 28 69 6e 74 70 74 72 5f 74 29 68 46 69 6c  e((intptr_t)hFil
0370: 65 2c 20 5f 4f 5f 42 49 4e 41 52 59 29 3b 0d 0a  e, _O_BINARY);..
0380: 0d 0a 20 20 20 20 69 66 28 20 66 64 20 21 3d 20  ..    if( fd != 
0390: 2d 31 29 0d 0a 20 20 20 20 20 20 20 20 72 65 74  -1)..        ret
03a0: 75 72 6e 20 5f 66 64 6f 70 65 6e 28 66 64 2c 20  urn _fdopen(fd, 
03b0: 7a 4d 6f 64 65 29 3b 0d 0a 20 20 20 20 65 6c 73  zMode);..    els
03c0: 65 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e..        retur
03d0: 6e 20 4e 55 4c 4c 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a  n NULL;..}......
03e0: 2f 2a 0d 0a 20 2a 20 53 70 61 77 6e 20 63 68 69  /*.. * Spawn chi
03f0: 6c 64 20 70 72 6f 63 65 73 73 20 61 6e 64 20 72  ld process and r
0400: 65 64 69 72 65 63 74 20 69 74 73 20 69 6f 20 74  edirect its io t
0410: 6f 20 6f 75 72 20 68 61 6e 64 6c 65 73 0d 0a 20  o our handles.. 
0420: 2a 2f 0d 0a 73 74 61 74 69 63 20 44 57 4f 52 44  */..static DWORD
0430: 20 53 70 61 77 6e 43 68 69 6c 64 28 4c 50 54 53   SpawnChild(LPTS
0440: 54 52 20 6c 70 43 6d 64 4c 69 6e 65 2c 20 48 41  TR lpCmdLine, HA
0450: 4e 44 4c 45 20 68 49 6e 2c 20 48 41 4e 44 4c 45  NDLE hIn, HANDLE
0460: 20 68 4f 75 74 2c 20 48 41 4e 44 4c 45 20 68 45   hOut, HANDLE hE
0470: 72 72 29 0d 0a 7b 0d 0a 20 20 20 20 53 54 41 52  rr)..{..    STAR
0480: 54 55 50 49 4e 46 4f 20 73 69 3b 0d 0a 20 20 20  TUPINFO si;..   
0490: 20 50 52 4f 43 45 53 53 5f 49 4e 46 4f 52 4d 41   PROCESS_INFORMA
04a0: 54 49 4f 4e 20 70 69 3b 0d 0a 20 20 20 20 42 4f  TION pi;..    BO
04b0: 4f 4c 20 73 75 63 63 65 73 73 3b 0d 0a 0d 0a 20  OL success;.... 
04c0: 20 20 20 6d 65 6d 73 65 74 28 28 76 6f 69 64 20     memset((void 
04d0: 2a 29 26 73 69 2c 20 30 2c 20 73 69 7a 65 6f 66  *)&si, 0, sizeof
04e0: 28 53 54 41 52 54 55 50 49 4e 46 4f 29 29 3b 0d  (STARTUPINFO));.
04f0: 0a 20 20 20 20 73 69 2e 63 62 20 3d 20 73 69 7a  .    si.cb = siz
0500: 65 6f 66 20 28 53 54 41 52 54 55 50 49 4e 46 4f  eof (STARTUPINFO
0510: 29 3b 0d 0a 0d 0a 20 20 20 20 2f 2a 0d 0a 20 20  );....    /*..  
0520: 20 20 20 2a 20 49 6e 64 69 63 61 74 65 20 74 68     * Indicate th
0530: 65 20 68 53 74 64 49 6e 70 75 74 2c 20 68 53 74  e hStdInput, hSt
0540: 64 4f 75 74 70 75 74 2c 20 61 6e 64 20 68 53 74  dOutput, and hSt
0550: 64 45 72 72 6f 72 20 6d 65 6d 62 65 72 73 20 61  dError members a
0560: 72 65 20 76 61 6c 69 64 2e 20 0d 0a 20 20 20 20  re valid. ..    
0570: 20 2a 2f 0d 0a 20 20 20 20 73 69 2e 64 77 46 6c   */..    si.dwFl
0580: 61 67 73 20 3d 20 53 54 41 52 54 46 5f 55 53 45  ags = STARTF_USE
0590: 53 54 44 48 41 4e 44 4c 45 53 3b 0d 0a 0d 0a 20  STDHANDLES;.... 
05a0: 20 20 20 73 69 2e 68 53 74 64 49 6e 70 75 74 20     si.hStdInput 
05b0: 20 3d 20 68 49 6e 3b 0d 0a 20 20 20 20 73 69 2e   = hIn;..    si.
05c0: 68 53 74 64 4f 75 74 70 75 74 20 3d 20 68 4f 75  hStdOutput = hOu
05d0: 74 3b 0d 0a 20 20 20 20 73 69 2e 68 53 74 64 45  t;..    si.hStdE
05e0: 72 72 6f 72 20 20 3d 20 68 45 72 72 3b 0d 0a 0d  rror  = hErr;...
05f0: 0a 20 20 20 20 2f 2a 0d 0a 20 20 20 20 20 2a 20  .    /*..     * 
0600: 45 6e 73 75 72 65 20 73 74 64 69 6f 20 69 6e 68  Ensure stdio inh
0610: 65 72 69 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20  eritable...     
0620: 2a 2f 0d 0a 20 20 20 20 73 75 63 63 65 73 73 20  */..    success 
0630: 3d 20 53 65 74 48 61 6e 64 6c 65 49 6e 66 6f 72  = SetHandleInfor
0640: 6d 61 74 69 6f 6e 28 73 69 2e 68 53 74 64 49 6e  mation(si.hStdIn
0650: 70 75 74 2c 20 48 41 4e 44 4c 45 5f 46 4c 41 47  put, HANDLE_FLAG
0660: 5f 49 4e 48 45 52 49 54 2c 20 54 52 55 45 29 3b  _INHERIT, TRUE);
0670: 0d 0a 20 20 20 20 69 66 28 21 73 75 63 63 65 73  ..    if(!succes
0680: 73 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 45 72  s) {..        Er
0690: 72 6f 72 45 78 69 74 28 22 53 65 74 48 61 6e 64  rorExit("SetHand
06a0: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 61  leInformation fa
06b0: 69 6c 65 64 22 29 3b 0d 0a 20 20 20 20 7d 0d 0a  iled");..    }..
06c0: 0d 0a 20 20 20 20 73 75 63 63 65 73 73 20 3d 20  ..    success = 
06d0: 53 65 74 48 61 6e 64 6c 65 49 6e 66 6f 72 6d 61  SetHandleInforma
06e0: 74 69 6f 6e 28 73 69 2e 68 53 74 64 4f 75 74 70  tion(si.hStdOutp
06f0: 75 74 2c 20 48 41 4e 44 4c 45 5f 46 4c 41 47 5f  ut, HANDLE_FLAG_
0700: 49 4e 48 45 52 49 54 2c 20 54 52 55 45 29 3b 0d  INHERIT, TRUE);.
0710: 0a 20 20 20 20 69 66 28 21 73 75 63 63 65 73 73  .    if(!success
0720: 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 45 72 72  ) {..        Err
0730: 6f 72 45 78 69 74 28 22 53 65 74 48 61 6e 64 6c  orExit("SetHandl
0740: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 61 69  eInformation fai
0750: 6c 65 64 22 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  led");..    }...
0760: 0a 20 20 20 20 73 75 63 63 65 73 73 20 3d 20 53  .    success = S
0770: 65 74 48 61 6e 64 6c 65 49 6e 66 6f 72 6d 61 74  etHandleInformat
0780: 69 6f 6e 28 73 69 2e 68 53 74 64 45 72 72 6f 72  ion(si.hStdError
0790: 2c 20 48 41 4e 44 4c 45 5f 46 4c 41 47 5f 49 4e  , HANDLE_FLAG_IN
07a0: 48 45 52 49 54 2c 20 54 52 55 45 29 3b 0d 0a 20  HERIT, TRUE);.. 
07b0: 20 20 20 69 66 28 21 73 75 63 63 65 73 73 29 20     if(!success) 
07c0: 7b 0d 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  {..        Error
07d0: 45 78 69 74 28 22 53 65 74 48 61 6e 64 6c 65 49  Exit("SetHandleI
07e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 61 69 6c 65  nformation faile
07f0: 64 22 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  d");..    }.... 
0800: 20 20 20 2f 2a 20 0d 0a 20 20 20 20 20 2a 20 43     /* ..     * C
0810: 72 65 61 74 65 20 63 68 69 6c 64 20 70 72 6f 63  reate child proc
0820: 65 73 73 0d 0a 20 20 20 20 20 2a 2f 0d 0a 20 20  ess..     */..  
0830: 20 20 73 75 63 63 65 73 73 20 3d 20 43 72 65 61    success = Crea
0840: 74 65 50 72 6f 63 65 73 73 28 4e 55 4c 4c 2c 09  teProcess(NULL,.
0850: 2f 2a 20 4c 50 43 53 54 52 20 61 64 64 72 65 73  /* LPCSTR addres
0860: 73 20 6f 66 20 6d 6f 64 75 6c 65 20 6e 61 6d 65  s of module name
0870: 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
0880: 20 6c 70 43 6d 64 4c 69 6e 65 2c 20 20 20 20 20   lpCmdLine,     
0890: 20 20 20 20 20 20 2f 2a 20 4c 50 43 53 54 52 20        /* LPCSTR 
08a0: 61 64 64 72 65 73 73 20 6f 66 20 63 6f 6d 6d 61  address of comma
08b0: 6e 64 20 6c 69 6e 65 20 2a 2f 0d 0a 20 20 20 20  nd line */..    
08c0: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 09 09 2f          NULL,../
08d0: 2a 20 50 72 6f 63 65 73 73 20 73 65 63 75 72 69  * Process securi
08e0: 74 79 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f  ty attributes */
08f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e 55  ..            NU
0900: 4c 4c 2c 09 09 2f 2a 20 54 68 72 65 61 64 20 73  LL,../* Thread s
0910: 65 63 75 72 69 74 79 20 61 74 74 72 69 62 75 74  ecurity attribut
0920: 65 73 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20  es */..         
0930: 20 20 20 54 52 55 45 2c 09 09 2f 2a 20 49 6e 68     TRUE,../* Inh
0940: 65 72 69 74 61 62 6c 65 20 48 61 6e 64 65 73 20  eritable Handes 
0950: 69 6e 68 65 72 69 74 65 64 2e 20 2a 2f 0d 0a 20  inherited. */.. 
0960: 20 20 20 20 20 20 20 20 20 20 20 30 2c 09 09 20             0,.. 
0970: 20 20 20 2f 2a 20 44 57 4f 52 44 20 63 72 65 61     /* DWORD crea
0980: 74 69 6f 6e 20 66 6c 61 67 73 20 20 2a 2f 0d 0a  tion flags  */..
0990: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
09a0: 2c 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 70  ,       /* Use p
09b0: 61 72 65 6e 74 20 65 6e 76 69 72 6f 6e 6d 65 6e  arent environmen
09c0: 74 20 62 6c 6f 63 6b 20 2a 2f 0d 0a 20 20 20 20  t block */..    
09d0: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 09 09 2f          NULL,../
09e0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 63 75 72  * Address of cur
09f0: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6e  rent directory n
0a00: 61 6d 65 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  ame */..        
0a10: 20 20 20 20 26 73 69 2c 20 20 20 2f 2a 20 41 64      &si,   /* Ad
0a20: 64 72 65 73 73 20 6f 66 20 53 54 41 52 54 55 50  dress of STARTUP
0a30: 49 4e 46 4f 20 20 2a 2f 0d 0a 20 20 20 20 20 20  INFO  */..      
0a40: 20 20 20 20 20 20 26 70 69 29 3b 09 2f 2a 20 41        &pi);./* A
0a50: 64 64 72 65 73 73 20 6f 66 20 50 52 4f 43 45 53  ddress of PROCES
0a60: 53 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 20 20  S_INFORMATION   
0a70: 2a 2f 0d 0a 0d 0a 20 20 20 20 69 66 28 21 73 75  */....    if(!su
0a80: 63 63 65 73 73 29 7b 0d 0a 20 20 20 20 20 20 20  ccess){..       
0a90: 20 45 72 72 6f 72 45 78 69 74 28 22 43 72 65 61   ErrorExit("Crea
0aa0: 74 65 50 72 6f 63 65 73 73 20 66 61 69 6c 65 64  teProcess failed
0ab0: 22 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ");..    }....  
0ac0: 20 20 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 65    /* Close proce
0ad0: 73 73 20 61 6e 64 20 74 68 72 65 61 64 20 68 61  ss and thread ha
0ae0: 6e 64 6c 65 73 2e 20 2a 2f 0d 0a 20 20 20 20 43  ndles. */..    C
0af0: 6c 6f 73 65 48 61 6e 64 6c 65 28 20 70 69 2e 68  loseHandle( pi.h
0b00: 50 72 6f 63 65 73 73 20 29 3b 0d 0a 20 20 20 20  Process );..    
0b10: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 20 70 69 2e  CloseHandle( pi.
0b20: 68 54 68 72 65 61 64 20 29 3b 0d 0a 0d 0a 20 20  hThread );....  
0b30: 20 20 72 65 74 75 72 6e 20 70 69 2e 64 77 50 72    return pi.dwPr
0b40: 6f 63 65 73 73 49 64 3b 0d 0a 7d 0d 0a 0d 0a 73  ocessId;..}....s
0b50: 74 61 74 69 63 20 44 57 4f 52 44 20 77 69 6e 33  tatic DWORD win3
0b60: 32 5f 63 72 65 61 74 65 5f 63 68 69 6c 64 28 63  2_create_child(c
0b70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 2c  onst char *zCmd,
0b80: 20 48 41 4e 44 4c 45 20 2a 68 49 6e 2c 20 48 41   HANDLE *hIn, HA
0b90: 4e 44 4c 45 20 2a 68 4f 75 74 29 0d 0a 7b 0d 0a  NDLE *hOut)..{..
0ba0: 20 20 20 48 41 4e 44 4c 45 20 68 43 68 69 6c 64     HANDLE hChild
0bb0: 53 74 64 69 6e 52 64 2c 20 68 43 68 69 6c 64 53  StdinRd, hChildS
0bc0: 74 64 69 6e 57 72 2c 20 0d 0a 20 20 20 20 20 20  tdinWr, ..      
0bd0: 20 20 20 20 68 43 68 69 6c 64 53 74 64 6f 75 74      hChildStdout
0be0: 52 64 2c 20 68 43 68 69 6c 64 53 74 64 6f 75 74  Rd, hChildStdout
0bf0: 57 72 3b 0d 0a 20 20 20 48 41 4e 44 4c 45 20 68  Wr;..   HANDLE h
0c00: 53 74 64 65 72 72 3b 0d 0a 20 0d 0a 20 20 20 53  Stderr;.. ..   S
0c10: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
0c20: 45 53 20 73 61 41 74 74 72 3b 20 0d 0a 20 20 20  ES saAttr; ..   
0c30: 42 4f 4f 4c 20 66 53 75 63 63 65 73 73 3b 20 0d  BOOL fSuccess; .
0c40: 0a 20 0d 0a 0d 0a 20 20 20 73 61 41 74 74 72 2e  . ....   saAttr.
0c50: 6e 4c 65 6e 67 74 68 20 3d 20 73 69 7a 65 6f 66  nLength = sizeof
0c60: 28 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  (SECURITY_ATTRIB
0c70: 55 54 45 53 29 3b 20 0d 0a 20 20 20 73 61 41 74  UTES); ..   saAt
0c80: 74 72 2e 62 49 6e 68 65 72 69 74 48 61 6e 64 6c  tr.bInheritHandl
0c90: 65 20 3d 20 54 52 55 45 3b 20 2f 2a 20 53 65 74  e = TRUE; /* Set
0ca0: 20 74 68 65 20 62 49 6e 68 65 72 69 74 48 61 6e   the bInheritHan
0cb0: 64 6c 65 20 66 6c 61 67 20 73 6f 20 70 69 70 65  dle flag so pipe
0cc0: 20 68 61 6e 64 6c 65 73 20 61 72 65 20 69 6e 68   handles are inh
0cd0: 65 72 69 74 65 64 2e 20 2a 2f 0d 0a 20 20 20 73  erited. */..   s
0ce0: 61 41 74 74 72 2e 6c 70 53 65 63 75 72 69 74 79  aAttr.lpSecurity
0cf0: 44 65 73 63 72 69 70 74 6f 72 20 3d 20 4e 55 4c  Descriptor = NUL
0d00: 4c 3b 20 0d 0a 0d 0a 23 69 66 20 64 65 66 69 6e  L; ....#if defin
0d10: 65 64 28 46 4f 53 53 49 4c 5f 43 48 49 4c 44 5f  ed(FOSSIL_CHILD_
0d20: 44 45 42 55 47 29 0d 0a 20 20 20 63 68 61 72 20  DEBUG)..   char 
0d30: 7a 44 65 62 75 67 46 4e 61 6d 65 5b 32 30 30 5d  zDebugFName[200]
0d40: 20 3d 20 7b 30 7d 3b 0d 0a 20 20 20 63 6f 6e 73   = {0};..   cons
0d50: 74 20 63 68 61 72 20 2a 7a 54 65 6d 70 50 72 65  t char *zTempPre
0d60: 66 69 78 20 3d 20 22 73 65 76 65 72 5f 63 68 69  fix = "sever_chi
0d70: 6c 64 5f 64 65 62 75 67 5f 6f 75 74 70 75 74 22  ld_debug_output"
0d80: 3b 0d 0a 0d 0a 20 20 20 73 74 61 74 69 63 20 76  ;....   static v
0d90: 6f 6c 61 74 69 6c 65 20 6c 6f 6e 67 20 69 20 3d  olatile long i =
0da0: 20 30 3b 0d 0a 0d 0a 20 20 20 49 6e 74 65 72 6c   0;....   Interl
0db0: 6f 63 6b 65 64 49 6e 63 72 65 6d 65 6e 74 28 26  ockedIncrement(&
0dc0: 69 29 3b 0d 0a 0d 0a 20 20 20 73 6e 70 72 69 6e  i);....   snprin
0dd0: 74 66 28 7a 44 65 62 75 67 46 4e 61 6d 65 2c 20  tf(zDebugFName, 
0de0: 73 69 7a 65 6f 66 28 7a 44 65 62 75 67 46 4e 61  sizeof(zDebugFNa
0df0: 6d 65 29 2c 20 22 25 73 5f 25 30 35 6c 64 2e 74  me), "%s_%05ld.t
0e00: 78 74 22 2c 20 7a 54 65 6d 70 50 72 65 66 69 78  xt", zTempPrefix
0e10: 2c 20 69 29 3b 0d 0a 0d 0a 20 20 20 68 53 74 64  , i);....   hStd
0e20: 65 72 72 20 3d 20 43 72 65 61 74 65 46 69 6c 65  err = CreateFile
0e30: 28 7a 44 65 62 75 67 46 4e 61 6d 65 2c 20 20 20  (zDebugFName,   
0e40: 20 2f 2f 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   // file to open
0e50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 47 45 4e  ..           GEN
0e60: 45 52 49 43 5f 57 52 49 54 45 2c 20 20 20 20 20  ERIC_WRITE,     
0e70: 20 20 20 20 20 2f 2f 20 6f 70 65 6e 20 66 6f 72       // open for
0e80: 20 72 65 61 64 69 6e 67 0d 0a 20 20 20 20 20 20   reading..      
0e90: 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f       FILE_SHARE_
0ea0: 52 45 41 44 2c 20 20 20 20 20 20 20 2f 2f 20 73  READ,       // s
0eb0: 68 61 72 65 20 66 6f 72 20 72 65 61 64 69 6e 67  hare for reading
0ec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  ..           NUL
0ed0: 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L,              
0ee0: 20 20 20 20 2f 2f 20 64 65 66 61 75 6c 74 20 73      // default s
0ef0: 65 63 75 72 69 74 79 0d 0a 20 20 20 20 20 20 20  ecurity..       
0f00: 20 20 20 20 43 52 45 41 54 45 5f 41 4c 57 41 59      CREATE_ALWAY
0f10: 53 2c 20 20 20 20 20 20 20 20 20 2f 2f 20 65 78  S,         // ex
0f20: 69 73 74 69 6e 67 20 66 69 6c 65 20 6f 6e 6c 79  isting file only
0f30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 46 49 4c  ..           FIL
0f40: 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
0f50: 41 4c 2c 20 2f 2f 20 6e 6f 72 6d 61 6c 20 66 69  AL, // normal fi
0f60: 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 4e  le..           N
0f70: 55 4c 4c 29 3b 20 20 20 20 20 20 20 20 20 20 20  ULL);           
0f80: 20 20 20 20 20 20 2f 2f 20 6e 6f 20 61 74 74 72        // no attr
0f90: 2e 20 74 65 6d 70 6c 61 74 65 0d 0a 0d 0a 20 20  . template....  
0fa0: 20 53 65 74 48 61 6e 64 6c 65 49 6e 66 6f 72 6d   SetHandleInform
0fb0: 61 74 69 6f 6e 28 20 68 53 74 64 65 72 72 2c 20  ation( hStderr, 
0fc0: 48 41 4e 44 4c 45 5f 46 4c 41 47 5f 49 4e 48 45  HANDLE_FLAG_INHE
0fd0: 52 49 54 2c 20 54 52 55 45 29 3b 0d 0a 23 65 6c  RIT, TRUE);..#el
0fe0: 73 65 0d 0a 20 20 20 2f 2a 20 47 65 74 20 74 68  se..   /* Get th
0ff0: 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20  e handle to the 
1000: 63 75 72 72 65 6e 74 20 53 54 44 45 52 52 2e 20  current STDERR. 
1010: 2a 2f 0d 0a 20 20 20 68 53 74 64 65 72 72 20 3d  */..   hStderr =
1020: 20 47 65 74 53 74 64 48 61 6e 64 6c 65 28 53 54   GetStdHandle(ST
1030: 44 5f 45 52 52 4f 52 5f 48 41 4e 44 4c 45 29 3b  D_ERROR_HANDLE);
1040: 0d 0a 23 65 6e 64 69 66 0d 0a 20 0d 0a 20 20 20  ..#endif.. ..   
1050: 2f 2a 20 43 72 65 61 74 65 20 61 20 70 69 70 65  /* Create a pipe
1060: 20 66 6f 72 20 74 68 65 20 63 68 69 6c 64 20 70   for the child p
1070: 72 6f 63 65 73 73 27 73 20 53 54 44 4f 55 54 2e  rocess's STDOUT.
1080: 20 2a 2f 0d 0a 20 20 20 69 66 20 28 21 20 43 72   */..   if (! Cr
1090: 65 61 74 65 50 69 70 65 28 26 68 43 68 69 6c 64  eatePipe(&hChild
10a0: 53 74 64 6f 75 74 52 64 2c 20 26 68 43 68 69 6c  StdoutRd, &hChil
10b0: 64 53 74 64 6f 75 74 57 72 2c 20 26 73 61 41 74  dStdoutWr, &saAt
10c0: 74 72 2c 20 34 30 39 36 29 29 20 0d 0a 20 20 20  tr, 4096)) ..   
10d0: 20 20 20 45 72 72 6f 72 45 78 69 74 28 22 53 74     ErrorExit("St
10e0: 64 6f 75 74 20 70 69 70 65 20 63 72 65 61 74 69  dout pipe creati
10f0: 6f 6e 20 66 61 69 6c 65 64 5c 6e 22 29 3b 20 0d  on failed\n"); .
1100: 0a 0d 0a 20 20 20 2f 2a 20 45 6e 73 75 72 65 20  ...   /* Ensure 
1110: 74 68 65 20 72 65 61 64 20 68 61 6e 64 6c 65 20  the read handle 
1120: 74 6f 20 74 68 65 20 70 69 70 65 20 66 6f 72 20  to the pipe for 
1130: 53 54 44 4f 55 54 20 69 73 20 6e 6f 74 20 69 6e  STDOUT is not in
1140: 68 65 72 69 74 65 64 2e 20 2a 2f 0d 0a 20 20 20  herited. */..   
1150: 53 65 74 48 61 6e 64 6c 65 49 6e 66 6f 72 6d 61  SetHandleInforma
1160: 74 69 6f 6e 28 20 68 43 68 69 6c 64 53 74 64 6f  tion( hChildStdo
1170: 75 74 52 64 2c 20 48 41 4e 44 4c 45 5f 46 4c 41  utRd, HANDLE_FLA
1180: 47 5f 49 4e 48 45 52 49 54 2c 20 46 41 4c 53 45  G_INHERIT, FALSE
1190: 29 3b 0d 0a 0d 0a 20 20 20 2f 2a 20 43 72 65 61  );....   /* Crea
11a0: 74 65 20 61 20 70 69 70 65 20 66 6f 72 20 74 68  te a pipe for th
11b0: 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 27  e child process'
11c0: 73 20 53 54 44 49 4e 2e 20 2a 2f 0d 0a 20 20 20  s STDIN. */..   
11d0: 69 66 20 28 21 20 43 72 65 61 74 65 50 69 70 65  if (! CreatePipe
11e0: 28 26 68 43 68 69 6c 64 53 74 64 69 6e 52 64 2c  (&hChildStdinRd,
11f0: 20 26 68 43 68 69 6c 64 53 74 64 69 6e 57 72 2c   &hChildStdinWr,
1200: 20 26 73 61 41 74 74 72 2c 20 34 30 39 36 29 29   &saAttr, 4096))
1210: 20 0d 0a 20 20 20 20 20 20 45 72 72 6f 72 45 78   ..      ErrorEx
1220: 69 74 28 22 53 74 64 69 6e 20 70 69 70 65 20 63  it("Stdin pipe c
1230: 72 65 61 74 69 6f 6e 20 66 61 69 6c 65 64 5c 6e  reation failed\n
1240: 22 29 3b 20 0d 0a 0d 0a 20 20 20 2f 2a 20 45 6e  "); ....   /* En
1250: 73 75 72 65 20 74 68 65 20 77 72 69 74 65 20 68  sure the write h
1260: 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 70 69 70  andle to the pip
1270: 65 20 66 6f 72 20 53 54 44 49 4e 20 69 73 20 6e  e for STDIN is n
1280: 6f 74 20 69 6e 68 65 72 69 74 65 64 2e 20 2a 2f  ot inherited. */
1290: 0d 0a 20 20 20 53 65 74 48 61 6e 64 6c 65 49 6e  ..   SetHandleIn
12a0: 66 6f 72 6d 61 74 69 6f 6e 28 20 68 43 68 69 6c  formation( hChil
12b0: 64 53 74 64 69 6e 57 72 2c 20 48 41 4e 44 4c 45  dStdinWr, HANDLE
12c0: 5f 46 4c 41 47 5f 49 4e 48 45 52 49 54 2c 20 46  _FLAG_INHERIT, F
12d0: 41 4c 53 45 29 3b 0d 0a 20 20 0d 0a 20 20 20 2f  ALSE);..  ..   /
12e0: 2a 20 53 70 61 77 6e 20 63 68 69 6c 64 20 61 6e  * Spawn child an
12f0: 64 20 72 65 64 69 72 65 63 74 20 69 74 73 20 69  d redirect its i
1300: 6f 20 2a 2f 0d 0a 20 20 44 57 4f 52 44 20 70 72  o */..  DWORD pr
1310: 6f 63 65 73 73 49 64 20 3d 20 53 70 61 77 6e 43  ocessId = SpawnC
1320: 68 69 6c 64 28 7a 43 6d 64 2c 20 68 43 68 69 6c  hild(zCmd, hChil
1330: 64 53 74 64 69 6e 52 64 2c 20 68 43 68 69 6c 64  dStdinRd, hChild
1340: 53 74 64 6f 75 74 57 72 2c 20 68 53 74 64 65 72  StdoutWr, hStder
1350: 72 29 3b 0d 0a 0d 0a 20 20 2f 2a 20 43 6c 6f 73  r);....  /* Clos
1360: 65 20 70 69 70 65 20 68 61 6e 64 6c 65 73 20 74  e pipe handles t
1370: 68 61 74 20 75 73 65 64 20 62 79 20 63 68 69 6c  hat used by chil
1380: 64 20 74 6f 20 72 65 61 64 20 61 6e 64 20 77 72  d to read and wr
1390: 69 74 65 20 2a 2f 0d 0a 20 20 43 6c 6f 73 65 48  ite */..  CloseH
13a0: 61 6e 64 6c 65 28 68 43 68 69 6c 64 53 74 64 69  andle(hChildStdi
13b0: 6e 52 64 29 3b 20 0d 0a 20 20 43 6c 6f 73 65 48  nRd); ..  CloseH
13c0: 61 6e 64 6c 65 28 68 43 68 69 6c 64 53 74 64 6f  andle(hChildStdo
13d0: 75 74 57 72 29 3b 0d 0a 23 69 66 20 64 65 66 69  utWr);..#if defi
13e0: 6e 65 64 28 46 4f 53 53 49 4c 5f 43 48 49 4c 44  ned(FOSSIL_CHILD
13f0: 5f 44 45 42 55 47 29 0d 0a 20 20 43 6c 6f 73 65  _DEBUG)..  Close
1400: 48 61 6e 64 6c 65 28 68 53 74 64 65 72 72 29 3b  Handle(hStderr);
1410: 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 2a 68  ..#endif....  *h
1420: 49 6e 20 3d 20 68 43 68 69 6c 64 53 74 64 6f 75  In = hChildStdou
1430: 74 52 64 3b 0d 0a 20 20 2a 68 4f 75 74 20 3d 20  tRd;..  *hOut = 
1440: 68 43 68 69 6c 64 53 74 64 69 6e 57 72 3b 20 0d  hChildStdinWr; .
1450: 0a 0d 0a 20 20 72 65 74 75 72 6e 20 70 72 6f 63  ...  return proc
1460: 65 73 73 49 64 3b 0d 0a 7d 0d 0a 0d 0a 69 6e 74  essId;..}....int
1470: 20 70 6f 70 65 6e 32 28 63 6f 6e 73 74 20 63 68   popen2(const ch
1480: 61 72 20 2a 7a 43 6d 64 2c 20 46 49 4c 45 20 2a  ar *zCmd, FILE *
1490: 2a 70 70 49 6e 2c 20 46 49 4c 45 20 2a 2a 70 70  *ppIn, FILE **pp
14a0: 4f 75 74 2c 20 69 6e 74 20 2a 70 43 68 69 6c 64  Out, int *pChild
14b0: 50 69 64 29 7b 0d 0a 20 20 48 41 4e 44 4c 45 20  Pid){..  HANDLE 
14c0: 69 6e 2c 20 6f 75 74 3b 0d 0a 20 20 44 57 4f 52  in, out;..  DWOR
14d0: 44 20 63 68 69 6c 64 50 72 6f 63 65 73 73 49 64  D childProcessId
14e0: 20 3d 20 77 69 6e 33 32 5f 63 72 65 61 74 65 5f   = win32_create_
14f0: 63 68 69 6c 64 28 7a 43 6d 64 2c 20 26 69 6e 2c  child(zCmd, &in,
1500: 20 26 6f 75 74 29 3b 0d 0a 0d 0a 20 20 69 66 28   &out);....  if(
1510: 63 68 69 6c 64 50 72 6f 63 65 73 73 49 64 20 3d  childProcessId =
1520: 3d 20 30 29 7b 0d 0a 20 20 20 20 20 20 66 6f 73  = 0){..      fos
1530: 73 69 6c 5f 66 61 74 61 6c 28 22 63 72 65 61 74  sil_fatal("creat
1540: 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20  e child process 
1550: 66 61 69 6c 65 64 22 29 3b 0d 0a 20 20 7d 0d 0a  failed");..  }..
1560: 0d 0a 20 20 2a 70 70 49 6e 20 3d 20 66 68 6f 70  ..  *ppIn = fhop
1570: 65 6e 28 69 6e 2c 20 22 72 62 22 29 3b 0d 0a 20  en(in, "rb");.. 
1580: 20 2a 70 70 4f 75 74 20 3d 20 66 68 6f 70 65 6e   *ppOut = fhopen
1590: 28 6f 75 74 2c 20 22 77 62 22 29 3b 0d 0a 0d 0a  (out, "wb");....
15a0: 20 20 69 66 28 20 28 2a 70 70 49 6e 29 20 3d 3d    if( (*ppIn) ==
15b0: 20 4e 55 4c 4c 20 7c 7c 20 28 2a 70 70 4f 75 74   NULL || (*ppOut
15c0: 29 20 3d 3d 20 4e 55 4c 4c 29 7b 0d 0a 20 20 20  ) == NULL){..   
15d0: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28     fossil_fatal(
15e0: 22 66 68 6f 70 65 6e 20 66 61 69 6c 65 64 21 22  "fhopen failed!"
15f0: 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2a 70 43  );..  }....  *pC
1600: 68 69 6c 64 50 69 64 20 3d 20 63 68 69 6c 64 50  hildPid = childP
1610: 72 6f 63 65 73 73 49 64 3b 0d 0a 7d 0d 0a 23 65  rocessId;..}..#e
1620: 6e 64 69 66 20 2f 2a 20 5f 5f 4d 49 4e 47 57 33  ndif /* __MINGW3
1630: 32 5f 5f 20 2a 2f 0d 0a                          2__ */..