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__ */..