diff --git a/ice-9/popen.scm b/ice-9/popen.scm index 2a3bdd605..b1450bbd6 100644 --- a/ice-9/popen.scm +++ b/ice-9/popen.scm @@ -106,23 +106,30 @@ (= pt-fileno error-fdes))) (close-fdes pt-fileno)))))) - ;; copy the three selected descriptors to the standard - ;; descriptors 0, 1, 2. note that it's possible that - ;; output-fdes or input-fdes is equal to error-fdes. + ;; Copy the three selected descriptors to the standard + ;; descriptors 0, 1, 2, if not already there (cond ((not (= input-fdes 0)) (if (= output-fdes 0) (set! output-fdes (dup->fdes 0))) (if (= error-fdes 0) (set! error-fdes (dup->fdes 0))) - (dup2 input-fdes 0))) - + (dup2 input-fdes 0) + ;; it's possible input-fdes is error-fdes + (if (not (= input-fdes error-fdes)) + (close-fdes input-fdes)))) + (cond ((not (= output-fdes 1)) (if (= error-fdes 1) (set! error-fdes (dup->fdes 1))) - (dup2 output-fdes 1))) + (dup2 output-fdes 1) + ;; it's possible output-fdes is error-fdes + (if (not (= output-fdes error-fdes)) + (close-fdes output-fdes)))) - (dup2 error-fdes 2) + (cond ((not (= error-fdes 2)) + (dup2 error-fdes 2) + (close-fdes error-fdes))) (apply execlp prog prog args)))