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..