[libvirt] [PATCHv2 1/2] build: avoid close, system
Matthias Bolte
matthias.bolte at googlemail.com
Sat Jan 29 11:40:44 UTC 2011
2011/1/29 Eric Blake <eblake at redhat.com>:
> * src/fdstream.c (virFDStreamOpenFile, virFDStreamCreateFile):
> Use VIR_FORCE_CLOSE instead of close.
> * tests/commandtest.c (mymain): Likewise.
> * tools/virsh.c (editFile): Use virCommand instead of system.
> * src/util/util.c (__virExec): Special case preservation of std
> file descriptors to child.
> ---
>
> v2: make virCommand behave more like system. So I didn't do
> any signal handling like system, but at least now you can
> actually edit interactively. virCommandRun doesn't like
> interactive sessions, so I have to use virCommandRunAsync
> followed by virCommandWait. I also had to fix virExec.
>
> src/fdstream.c | 6 ++--
> src/util/util.c | 12 +++++----
> tests/commandtest.c | 12 ++++++---
> tools/virsh.c | 65 ++++++++++++++++++++++++++------------------------
> 4 files changed, 52 insertions(+), 43 deletions(-)
> diff --git a/src/util/util.c b/src/util/util.c
> index f412a83..af14b2e 100644
> --- a/src/util/util.c
> +++ b/src/util/util.c
> @@ -593,14 +593,16 @@ __virExec(const char *const*argv,
> goto fork_error;
> }
>
> - VIR_FORCE_CLOSE(infd);
> + if (infd != STDIN_FILENO)
> + VIR_FORCE_CLOSE(infd);
> VIR_FORCE_CLOSE(null);
> - tmpfd = childout; /* preserve childout value */
> - VIR_FORCE_CLOSE(tmpfd);
> - if (childerr > 0 &&
> + if (childout != STDOUT_FILENO) {
> + tmpfd = childout; /* preserve childout value */
> + VIR_FORCE_CLOSE(tmpfd);
Took me a moment to understand this. I think in case you pass parent's
std{in,out,err} to child's std{in,out,err} this works. But when you
exchange stdout and stderr like this: parent std{in,err,out} -> child
std{in,out,err}, then childout != STDOUT_FILENO is wrong and should be
childout > STDERR_FILENO, otherwise you could close the parent's
stderr here.
> + }
> + if (childerr > STDERR_FILENO &&
> childerr != childout) {
> VIR_FORCE_CLOSE(childerr);
> - childout = -1;
Technically it's okay to remove this like as childout isn't accessed
afterwards anymore. But by using the tmpfd variable we tricked
VIR_FORCE_CLOSE and should finish it's job here.
ACK, with that comments addressed.
Mathias
More information about the libvir-list
mailing list