Here's a quick stab at it. There's some cargo-cult programming in there, and I have to go over the error cases again to make sure there's no FD leaks, but it'll probably look something like the patch included. Usage is: (call-process "echo" nil '(:file "/tmp/hello") nil "thing") or (call-process "echo" nil '((:file "/tmp/hello") "/tmp/error") nil "thing") So with this, `call-process' can do all the combinations of STDERR/STDOUT to file/buffers, except that you can't put STDERR in one buffer and STDOUT in a different buffer. But you can get STDERR in a buffer by itself, and STDOUT in a file, so it's progress of a kind...