Tcl Source Code

Hex Artifact Content
Login

Artifact 1286d1beab2af1a08cea7a0718234eedadb7b926:

Attachment "open-pipeerr3.patch" to ticket [957132ffff] added by hobbs 2004-05-28 03:32:24.
0000: 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f 74  Index: generic/t
0010: 63 6c 50 69 70 65 2e 63 0a 3d 3d 3d 3d 3d 3d 3d  clPipe.c.=======
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53  ============.RCS
0060: 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f   file: /cvsroot/
0070: 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 72 69 63 2f  tcl/tcl/generic/
0080: 74 63 6c 50 69 70 65 2e 63 2c 76 0a 72 65 74 72  tclPipe.c,v.retr
0090: 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f 6e 20  ieving revision 
00a0: 31 2e 37 0a 64 69 66 66 20 2d 75 20 2d 72 31 2e  1.7.diff -u -r1.
00b0: 37 20 74 63 6c 50 69 70 65 2e 63 0a 2d 2d 2d 20  7 tclPipe.c.--- 
00c0: 67 65 6e 65 72 69 63 2f 74 63 6c 50 69 70 65 2e  generic/tclPipe.
00d0: 63 09 31 37 20 44 65 63 20 32 30 30 32 20 30 32  c.17 Dec 2002 02
00e0: 3a 34 37 3a 33 39 20 2d 30 30 30 30 09 31 2e 37  :47:39 -0000.1.7
00f0: 0a 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c  .+++ generic/tcl
0100: 50 69 70 65 2e 63 09 32 37 20 4d 61 79 20 32 30  Pipe.c.27 May 20
0110: 30 34 20 32 30 3a 33 31 3a 32 32 20 2d 30 30 30  04 20:31:22 -000
0120: 30 0a 40 40 20 2d 36 38 2c 31 33 20 2b 36 38 2c  0.@@ -68,13 +68,
0130: 31 33 20 40 40 0a 20 46 69 6c 65 46 6f 72 52 65  13 @@. FileForRe
0140: 64 69 72 65 63 74 28 69 6e 74 65 72 70 2c 20 73  direct(interp, s
0150: 70 65 63 2c 20 61 74 4f 4b 2c 20 61 72 67 2c 20  pec, atOK, arg, 
0160: 6e 65 78 74 41 72 67 2c 20 66 6c 61 67 73 2c 20  nextArg, flags, 
0170: 73 6b 69 70 50 74 72 2c 20 63 6c 6f 73 65 50 74  skipPtr, closePt
0180: 72 2c 0a 20 09 72 65 6c 65 61 73 65 50 74 72 29  r,. .releasePtr)
0190: 0a 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  .     Tcl_Interp
01a0: 20 2a 69 6e 74 65 72 70 3b 09 09 2f 2a 20 49 6e   *interp;../* In
01b0: 74 65 70 72 65 74 65 72 20 74 6f 20 75 73 65 20  tepreter to use 
01c0: 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74  for error report
01d0: 69 6e 67 2e 20 2a 2f 0a 2d 20 20 20 20 43 4f 4e  ing. */.-    CON
01e0: 53 54 20 63 68 61 72 20 2a 73 70 65 63 3b 09 09  ST char *spec;..
01f0: 09 2f 2a 20 50 6f 69 6e 74 73 20 74 6f 20 63 68  ./* Points to ch
0200: 61 72 61 63 74 65 72 20 6a 75 73 74 20 61 66 74  aracter just aft
0210: 65 72 0a 2b 20 20 20 20 43 4f 4e 53 54 20 63 68  er.+    CONST ch
0220: 61 72 20 2a 73 70 65 63 3b 09 09 2f 2a 20 50 6f  ar *spec;../* Po
0230: 69 6e 74 73 20 74 6f 20 63 68 61 72 61 63 74 65  ints to characte
0240: 72 20 6a 75 73 74 20 61 66 74 65 72 0a 20 09 09  r just after. ..
0250: 09 09 20 2a 20 72 65 64 69 72 65 63 74 69 6f 6e  .. * redirection
0260: 20 63 68 61 72 61 63 74 65 72 2e 20 2a 2f 0a 2d   character. */.-
0270: 20 20 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a      CONST char *
0280: 61 72 67 3b 09 09 2f 2a 20 50 6f 69 6e 74 65 72  arg;../* Pointer
0290: 20 74 6f 20 65 6e 74 69 72 65 20 61 72 67 75 6d   to entire argum
02a0: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a  ent containing .
02b0: 2d 09 09 09 09 20 2a 20 73 70 65 63 3a 20 20 75  -.... * spec:  u
02c0: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 72 65  sed for error re
02d0: 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  porting. */.    
02e0: 20 69 6e 74 20 61 74 4f 4b 3b 09 09 09 2f 2a 20   int atOK;.../* 
02f0: 4e 6f 6e 2d 7a 65 72 6f 20 6d 65 61 6e 73 20 74  Non-zero means t
0300: 68 61 74 20 27 40 27 20 6e 6f 74 61 74 69 6f 6e  hat '@' notation
0310: 20 63 61 6e 20 62 65 20 0a 20 09 09 09 09 20 2a   can be . .... *
0320: 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
0330: 20 61 20 63 68 61 6e 6e 65 6c 2c 20 7a 65 72 6f   a channel, zero
0340: 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 09 09 09   means that. ...
0350: 09 20 2a 20 69 74 20 69 73 6e 27 74 2e 20 2a 2f  . * it isn't. */
0360: 0a 2b 20 20 20 20 43 4f 4e 53 54 20 63 68 61 72  .+    CONST char
0370: 20 2a 61 72 67 3b 09 09 2f 2a 20 50 6f 69 6e 74   *arg;../* Point
0380: 65 72 20 74 6f 20 65 6e 74 69 72 65 20 61 72 67  er to entire arg
0390: 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  ument containing
03a0: 20 0a 2b 09 09 09 09 20 2a 20 73 70 65 63 3a 20   .+.... * spec: 
03b0: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
03c0: 72 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20  reporting. */.  
03d0: 20 20 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 6e     CONST char *n
03e0: 65 78 74 41 72 67 3b 09 2f 2a 20 4e 65 78 74 20  extArg;./* Next 
03f0: 61 72 67 75 6d 65 6e 74 20 69 6e 20 61 72 67 63  argument in argc
0400: 2f 61 72 67 76 20 61 72 72 61 79 2c 20 69 66 20  /argv array, if 
0410: 6e 65 65 64 65 64 20 0a 20 09 09 09 09 20 2a 20  needed . .... * 
0420: 66 6f 72 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72  for file name or
0430: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 2e 20 20   channel name.  
0440: 4d 61 79 20 62 65 20 0a 20 09 09 09 09 20 2a 20  May be . .... * 
0450: 4e 55 4c 4c 2e 20 2a 2f 0a 40 40 20 2d 31 30 37  NULL. */.@@ -107
0460: 2c 39 20 2b 31 30 37 2c 39 20 40 40 0a 20 20 20  ,9 +107,9 @@.   
0470: 20 20 20 20 20 20 7d 0a 20 09 66 69 6c 65 20 3d        }. .file =
0480: 20 54 63 6c 70 4d 61 6b 65 46 69 6c 65 28 63 68   TclpMakeFile(ch
0490: 61 6e 2c 20 77 72 69 74 69 6e 67 20 3f 20 54 43  an, writing ? TC
04a0: 4c 5f 57 52 49 54 41 42 4c 45 20 3a 20 54 43 4c  L_WRITABLE : TCL
04b0: 5f 52 45 41 44 41 42 4c 45 29 3b 0a 20 20 20 20  _READABLE);.    
04c0: 20 20 20 20 20 69 66 20 28 66 69 6c 65 20 3d 3d       if (file ==
04d0: 20 4e 55 4c 4c 29 20 7b 0a 2d 20 20 20 20 20 20   NULL) {.-      
04e0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
04f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
0500: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
0510: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
0520: 63 68 61 6e 29 2c 0a 2d 20 20 20 20 20 20 20 20  chan),.-        
0530: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
0540: 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66 6f  wasn't opened fo
0550: 72 20 22 2c 0a 2d 20 20 20 20 20 20 20 20 20 20  r ",.-          
0560: 20 20 20 20 20 20 20 20 20 20 28 28 77 72 69 74            ((writ
0570: 69 6e 67 29 20 3f 20 22 77 72 69 74 69 6e 67 22  ing) ? "writing"
0580: 20 3a 20 22 72 65 61 64 69 6e 67 22 29 2c 20 28   : "reading"), (
0590: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 2b  char *) NULL);.+
05a0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
05b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
05c0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
05d0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
05e0: 68 61 6e 29 2c 0a 2b 09 09 20 20 20 20 22 5c 22  han),.+..    "\"
05f0: 20 77 61 73 6e 27 74 20 6f 70 65 6e 65 64 20 66   wasn't opened f
0600: 6f 72 20 22 2c 0a 2b 09 09 20 20 20 20 28 28 77  or ",.+..    ((w
0610: 72 69 74 69 6e 67 29 20 3f 20 22 77 72 69 74 69  riting) ? "writi
0620: 6e 67 22 20 3a 20 22 72 65 61 64 69 6e 67 22 29  ng" : "reading")
0630: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
0640: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 72  ;.             r
0650: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
0660: 20 20 20 20 20 7d 0a 20 09 2a 72 65 6c 65 61 73       }. .*releas
0670: 65 50 74 72 20 3d 20 31 3b 0a 40 40 20 2d 35 30  ePtr = 1;.@@ -50
0680: 38 2c 37 20 2b 35 30 38 2c 37 20 40 40 0a 20 20  8,7 +508,7 @@.  
0690: 20 20 20 09 09 09 09 20 2a 20 63 6c 6f 73 65 64     .... * closed
06a0: 20 77 68 65 6e 20 63 6c 65 61 6e 69 6e 67 20 75   when cleaning u
06b0: 70 2e 20 2a 2f 0a 20 20 20 20 20 69 6e 74 20 65  p. */.     int e
06c0: 72 72 6f 72 52 65 6c 65 61 73 65 20 3d 20 30 3b  rrorRelease = 0;
06d0: 0a 20 20 20 20 20 43 4f 4e 53 54 20 63 68 61 72  .     CONST char
06e0: 20 2a 70 3b 0a 2d 20 20 20 20 69 6e 74 20 73 6b   *p;.-    int sk
06f0: 69 70 2c 20 6c 61 73 74 42 61 72 2c 20 6c 61 73  ip, lastBar, las
0700: 74 41 72 67 2c 20 69 2c 20 6a 2c 20 61 74 4f 4b  tArg, i, j, atOK
0710: 2c 20 66 6c 61 67 73 2c 20 65 72 72 6f 72 54 6f  , flags, errorTo
0720: 4f 75 74 70 75 74 3b 0a 2b 20 20 20 20 69 6e 74  Output;.+    int
0730: 20 73 6b 69 70 2c 20 6c 61 73 74 42 61 72 2c 20   skip, lastBar, 
0740: 6c 61 73 74 41 72 67 2c 20 69 2c 20 6a 2c 20 61  lastArg, i, j, a
0750: 74 4f 4b 2c 20 66 6c 61 67 73 2c 20 65 72 72 6f  tOK, flags, erro
0760: 72 54 6f 4f 75 74 70 75 74 20 3d 20 30 3b 0a 20  rToOutput = 0;. 
0770: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
0780: 65 78 65 63 42 75 66 66 65 72 3b 0a 20 20 20 20  execBuffer;.    
0790: 20 54 63 6c 46 69 6c 65 20 70 69 70 65 49 6e 3b   TclFile pipeIn;
07a0: 0a 20 20 20 20 20 54 63 6c 46 69 6c 65 20 63 75  .     TclFile cu
07b0: 72 49 6e 46 69 6c 65 2c 20 63 75 72 4f 75 74 46  rInFile, curOutF
07c0: 69 6c 65 2c 20 63 75 72 45 72 72 46 69 6c 65 3b  ile, curErrFile;
07d0: 0a 40 40 20 2d 35 34 37 2c 37 20 2b 35 34 37 2c  .@@ -547,7 +547,
07e0: 38 20 40 40 0a 20 20 20 20 20 6c 61 73 74 42 61  8 @@.     lastBa
07f0: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 63 6d 64  r = -1;.     cmd
0800: 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  Count = 1;.     
0810: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
0820: 61 72 67 63 3b 20 69 2b 2b 29 20 7b 0a 2d 20 20  argc; i++) {.-  
0830: 20 20 20 20 20 20 73 6b 69 70 20 3d 20 30 3b 0a        skip = 0;.
0840: 2b 09 65 72 72 6f 72 54 6f 4f 75 74 70 75 74 20  +.errorToOutput 
0850: 3d 20 30 3b 0a 2b 09 73 6b 69 70 20 3d 20 30 3b  = 0;.+.skip = 0;
0860: 0a 20 09 70 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  . .p = argv[i];.
0870: 20 09 73 77 69 74 63 68 20 28 2a 70 2b 2b 29 20   .switch (*p++) 
0880: 7b 0a 20 09 63 61 73 65 20 27 7c 27 3a 0a 40 40  {. .case '|':.@@
0890: 20 2d 36 30 31 2c 37 20 2b 36 30 32 2c 36 20 40   -601,7 +602,6 @
08a0: 40 0a 20 09 63 61 73 65 20 27 3e 27 3a 0a 20 09  @. .case '>':. .
08b0: 20 20 20 20 61 74 4f 4b 20 3d 20 31 3b 0a 20 09      atOK = 1;. .
08c0: 20 20 20 20 66 6c 61 67 73 20 3d 20 4f 5f 57 52      flags = O_WR
08d0: 4f 4e 4c 59 20 7c 20 4f 5f 43 52 45 41 54 20 7c  ONLY | O_CREAT |
08e0: 20 4f 5f 54 52 55 4e 43 3b 0a 2d 09 20 20 20 20   O_TRUNC;.-.    
08f0: 65 72 72 6f 72 54 6f 4f 75 74 70 75 74 20 3d 20  errorToOutput = 
0900: 30 3b 0a 20 09 20 20 20 20 69 66 20 28 2a 70 20  0;. .    if (*p 
0910: 3d 3d 20 27 3e 27 29 20 7b 0a 20 09 09 70 2b 2b  == '>') {. ..p++
0920: 3b 0a 20 09 09 61 74 4f 4b 20 3d 20 30 3b 0a 40  ;. ..atOK = 0;.@
0930: 40 20 2d 36 37 35 2c 31 30 20 2b 36 37 35 2c 32  @ -675,10 +675,2
0940: 36 20 40 40 0a 20 09 09 65 72 72 6f 72 52 65 6c  6 @@. ..errorRel
0950: 65 61 73 65 20 3d 20 30 3b 0a 20 09 09 54 63 6c  ease = 0;. ..Tcl
0960: 70 52 65 6c 65 61 73 65 46 69 6c 65 28 65 72 72  pReleaseFile(err
0970: 6f 72 46 69 6c 65 29 3b 0a 20 09 20 20 20 20 7d  orFile);. .    }
0980: 0a 2d 09 20 20 20 20 65 72 72 6f 72 46 69 6c 65  .-.    errorFile
0990: 20 3d 20 46 69 6c 65 46 6f 72 52 65 64 69 72 65   = FileForRedire
09a0: 63 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 61 74  ct(interp, p, at
09b0: 4f 4b 2c 20 61 72 67 76 5b 69 5d 2c 20 0a 2d 09  OK, argv[i], .-.
09c0: 09 20 20 20 20 61 72 67 76 5b 69 20 2b 20 31 5d  .    argv[i + 1]
09d0: 2c 20 66 6c 61 67 73 2c 20 26 73 6b 69 70 2c 20  , flags, &skip, 
09e0: 26 65 72 72 6f 72 43 6c 6f 73 65 2c 20 26 65 72  &errorClose, &er
09f0: 72 6f 72 52 65 6c 65 61 73 65 29 3b 0a 2d 09 20  rorRelease);.-. 
0a00: 20 20 20 69 66 20 28 65 72 72 6f 72 46 69 6c 65     if (errorFile
0a10: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 2d 09 09 67   == NULL) {.-..g
0a20: 6f 74 6f 20 65 72 72 6f 72 3b 0a 2b 09 20 20 20  oto error;.+.   
0a30: 20 69 66 20 28 61 74 4f 4b 20 26 26 20 70 5b 30   if (atOK && p[0
0a40: 5d 20 3d 3d 20 27 40 27 20 26 26 20 70 5b 31 5d  ] == '@' && p[1]
0a50: 20 3d 3d 20 27 31 27 20 26 26 20 70 5b 32 5d 20   == '1' && p[2] 
0a60: 3d 3d 20 27 5c 30 27 29 20 7b 0a 2b 09 09 2f 2a  == '\0') {.+../*
0a70: 0a 2b 09 09 20 2a 20 53 70 65 63 69 61 6c 20 63  .+.. * Special c
0a80: 61 73 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  ase handling of 
0a90: 32 3e 40 31 20 74 6f 20 72 65 64 69 72 65 63 74  2>@1 to redirect
0aa0: 20 73 74 64 65 72 72 20 74 6f 20 74 68 65 0a 2b   stderr to the.+
0ab0: 09 09 20 2a 20 65 78 65 63 2f 6f 70 65 6e 20 6f  .. * exec/open o
0ac0: 75 74 70 75 74 20 70 69 70 65 20 61 73 20 77 65  utput pipe as we
0ad0: 6c 6c 2e 20 20 54 68 69 73 20 69 73 20 6d 65 61  ll.  This is mea
0ae0: 6e 74 20 66 6f 72 20 74 68 65 20 65 6e 64 0a 2b  nt for the end.+
0af0: 09 09 20 2a 20 6f 66 20 74 68 65 20 63 6f 6d 6d  .. * of the comm
0b00: 61 6e 64 20 73 74 72 69 6e 67 2c 20 6f 74 68 65  and string, othe
0b10: 72 77 69 73 65 20 75 73 65 20 7c 26 20 62 65 74  rwise use |& bet
0b20: 77 65 65 6e 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2b  ween commands..+
0b30: 09 09 20 2a 2f 0a 2b 09 09 69 66 20 28 69 20 21  .. */.+..if (i !
0b40: 3d 20 61 72 67 63 20 2d 20 31 29 20 7b 0a 2b 09  = argc - 1) {.+.
0b50: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
0b60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d  esult(interp, "m
0b70: 75 73 74 20 73 70 65 63 69 66 79 20 5c 22 22 2c  ust specify \"",
0b80: 20 61 72 67 76 5b 69 5d 2c 0a 2b 09 09 09 20 20   argv[i],.+...  
0b90: 20 20 22 5c 22 20 61 73 20 6c 61 73 74 20 77 6f    "\" as last wo
0ba0: 72 64 20 69 6e 20 63 6f 6d 6d 61 6e 64 22 2c 20  rd in command", 
0bb0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
0bc0: 2b 09 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  +..    goto erro
0bd0: 72 3b 0a 2b 09 09 7d 0a 2b 09 09 65 72 72 6f 72  r;.+..}.+..error
0be0: 46 69 6c 65 20 3d 20 6f 75 74 70 75 74 46 69 6c  File = outputFil
0bf0: 65 3b 0a 2b 09 09 65 72 72 6f 72 54 6f 4f 75 74  e;.+..errorToOut
0c00: 70 75 74 20 3d 20 32 3b 0a 2b 09 09 73 6b 69 70  put = 2;.+..skip
0c10: 20 3d 20 31 3b 0a 2b 09 20 20 20 20 7d 20 65 6c   = 1;.+.    } el
0c20: 73 65 20 7b 0a 2b 09 09 65 72 72 6f 72 46 69 6c  se {.+..errorFil
0c30: 65 20 3d 20 46 69 6c 65 46 6f 72 52 65 64 69 72  e = FileForRedir
0c40: 65 63 74 28 69 6e 74 65 72 70 2c 20 70 2c 20 61  ect(interp, p, a
0c50: 74 4f 4b 2c 20 61 72 67 76 5b 69 5d 2c 20 0a 2b  tOK, argv[i], .+
0c60: 09 09 09 61 72 67 76 5b 69 20 2b 20 31 5d 2c 20  ...argv[i + 1], 
0c70: 66 6c 61 67 73 2c 20 26 73 6b 69 70 2c 20 26 65  flags, &skip, &e
0c80: 72 72 6f 72 43 6c 6f 73 65 2c 20 26 65 72 72 6f  rrorClose, &erro
0c90: 72 52 65 6c 65 61 73 65 29 3b 0a 2b 09 09 69 66  rRelease);.+..if
0ca0: 20 28 65 72 72 6f 72 46 69 6c 65 20 3d 3d 20 4e   (errorFile == N
0cb0: 55 4c 4c 29 20 7b 0a 2b 09 09 20 20 20 20 67 6f  ULL) {.+..    go
0cc0: 74 6f 20 65 72 72 6f 72 3b 0a 2b 09 09 7d 0a 20  to error;.+..}. 
0cd0: 09 20 20 20 20 7d 0a 20 09 20 20 20 20 62 72 65  .    }. .    bre
0ce0: 61 6b 3b 0a 20 09 7d 0a 40 40 20 2d 37 36 35 2c  ak;. .}.@@ -765,
0cf0: 37 20 2b 37 38 31 2c 31 32 20 40 40 0a 20 20 20  7 +781,12 @@.   
0d00: 20 20 7d 0a 20 0a 20 20 20 20 20 69 66 20 28 65    }. .     if (e
0d10: 72 72 6f 72 46 69 6c 65 20 3d 3d 20 4e 55 4c 4c  rrorFile == NULL
0d20: 29 20 7b 0a 2d 09 69 66 20 28 65 72 72 46 69 6c  ) {.-.if (errFil
0d30: 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ePtr != NULL) {.
0d40: 2b 09 69 66 20 28 65 72 72 6f 72 54 6f 4f 75 74  +.if (errorToOut
0d50: 70 75 74 20 3d 3d 20 32 29 20 7b 0a 2b 09 20 20  put == 2) {.+.  
0d60: 20 20 2f 2a 0a 2b 09 20 20 20 20 20 2a 20 48 61    /*.+.     * Ha
0d70: 6e 64 6c 65 20 32 3e 26 31 20 73 70 65 63 69 61  ndle 2>&1 specia
0d80: 6c 20 63 61 73 65 20 61 74 20 65 6e 64 20 6f 66  l case at end of
0d90: 20 63 6d 64 20 6c 69 6e 65 0a 2b 09 20 20 20 20   cmd line.+.    
0da0: 20 2a 2f 0a 2b 09 20 20 20 20 65 72 72 6f 72 46   */.+.    errorF
0db0: 69 6c 65 20 3d 20 6f 75 74 70 75 74 46 69 6c 65  ile = outputFile
0dc0: 3b 0a 2b 09 7d 20 65 6c 73 65 20 69 66 20 28 65  ;.+.} else if (e
0dd0: 72 72 46 69 6c 65 50 74 72 20 21 3d 20 4e 55 4c  rrFilePtr != NUL
0de0: 4c 29 20 7b 0a 20 09 20 20 20 20 2f 2a 0a 20 09  L) {. .    /*. .
0df0: 20 20 20 20 20 2a 20 53 65 74 20 75 70 20 74 68       * Set up th
0e00: 65 20 73 74 61 6e 64 61 72 64 20 65 72 72 6f 72  e standard error
0e10: 20 6f 75 74 70 75 74 20 73 69 6e 6b 20 66 6f 72   output sink for
0e20: 20 74 68 65 20 70 69 70 65 6c 69 6e 65 2c 20 69   the pipeline, i
0e30: 66 0a 20 09 20 20 20 20 20 2a 20 72 65 71 75 65  f. .     * reque
0e40: 73 74 65 64 2e 20 20 55 73 65 20 61 20 74 65 6d  sted.  Use a tem
0e50: 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 69 63  porary file whic
0e60: 68 20 69 73 20 6f 70 65 6e 65 64 2c 20 74 68 65  h is opened, the
0e70: 6e 20 64 65 6c 65 74 65 64 2e 0a                 n deleted..