From 2a5ae89c4e4c6574518b806cb6e6586823450c5d Mon Sep 17 00:00:00 2001 From: andreas_kupries Date: Wed, 5 Oct 2005 22:09:03 +0000 Subject: * generic/tclPipe.c (TclCreatePipeline): Fixed [SF Tcl Bug 1109294]. Applied the patch provided by David Gravereaux. --- ChangeLog | 3 +++ generic/tclPipe.c | 18 +++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 35f1924..b9b6e91 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2005-10-05 Andreas Kupries + * generic/tclPipe.c (TclCreatePipeline): Fixed [SF Tcl Bug + 1109294]. Applied the patch provided by David Gravereaux. + * doc/CrtChannel.3: Fixed [SF Tcl Bug 1104682], by application of David Welton's patch for it, and added a note about wideSeekProc. diff --git a/generic/tclPipe.c b/generic/tclPipe.c index f7bc038..082fcda 100644 --- a/generic/tclPipe.c +++ b/generic/tclPipe.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclPipe.c,v 1.12 2005/07/28 10:55:36 dkf Exp $ + * RCS: @(#) $Id: tclPipe.c,v 1.13 2005/10/05 22:09:04 andreas_kupries Exp $ */ #include "tclInt.h" @@ -496,6 +496,7 @@ TclCreatePipeline(interp, argc, argv, pidArrayPtr, inPipePtr, * closed when cleaning up. */ int errorRelease = 0; CONST char *p; + CONST char *nextArg; int skip, lastBar, lastArg, i, j, atOK, flags, errorToOutput = 0; Tcl_DString execBuffer; TclFile pipeIn; @@ -568,7 +569,7 @@ TclCreatePipeline(interp, argc, argv, pidArrayPtr, inPipePtr, inputLiteral = p + 1; skip = 1; if (*inputLiteral == '\0') { - inputLiteral = argv[i + 1]; + inputLiteral = ((i + 1) == argc) ? NULL : argv[i + 1]; if (inputLiteral == NULL) { Tcl_AppendResult(interp, "can't specify \"", argv[i], "\" as last word in command", (char *) NULL); @@ -577,8 +578,9 @@ TclCreatePipeline(interp, argc, argv, pidArrayPtr, inPipePtr, skip = 2; } } else { + nextArg = ((i + 1) == argc) ? NULL : argv[i + 1]; inputLiteral = NULL; - inputFile = FileForRedirect(interp, p, 1, argv[i], argv[i+1], + inputFile = FileForRedirect(interp, p, 1, argv[i], nextArg, O_RDONLY, &skip, &inputClose, &inputRelease); if (inputFile == NULL) { goto error; @@ -630,7 +632,8 @@ TclCreatePipeline(interp, argc, argv, pidArrayPtr, inPipePtr, TclpReleaseFile(outputFile); } } - outputFile = FileForRedirect(interp, p, atOK, argv[i], argv[i+1], + nextArg = ((i + 1) == argc) ? NULL : argv[i + 1]; + outputFile = FileForRedirect(interp, p, atOK, argv[i], nextArg, flags, &skip, &outputClose, &outputRelease); if (outputFile == NULL) { goto error; @@ -684,8 +687,9 @@ TclCreatePipeline(interp, argc, argv, pidArrayPtr, inPipePtr, errorToOutput = 2; skip = 1; } else { + nextArg = ((i + 1) == argc) ? NULL : argv[i + 1]; errorFile = FileForRedirect(interp, p, atOK, argv[i], - argv[i+1], flags, &skip, &errorClose, &errorRelease); + nextArg, flags, &skip, &errorClose, &errorRelease); if (errorFile == NULL) { goto error; } @@ -854,7 +858,6 @@ TclCreatePipeline(interp, argc, argv, pidArrayPtr, inPipePtr, } } } - argv[lastArg] = NULL; /* * If this is the last segment, use the specified outputFile. @@ -862,9 +865,10 @@ TclCreatePipeline(interp, argc, argv, pidArrayPtr, inPipePtr, * curInFile for the next segment of the pipe. */ - if (lastArg == argc) { + if (lastArg == argc) { curOutFile = outputFile; } else { + argv[lastArg] = NULL; if (TclpCreatePipe(&pipeIn, &curOutFile) == 0) { Tcl_AppendResult(interp, "couldn't create pipe: ", Tcl_PosixError(interp), (char *) NULL); -- cgit v0.12