On Thu, Mar 28, 2019 at 05:59:30PM +0100, Pino Toscano wrote: > Allow to specify a file descriptor for the machine readable output. > > Use the same assumption as done in v2v, i.e. that Unix.file_descr is > simply the int file descriptor. > --- > common/mltools/test-machine-readable.sh | 7 +++++++ > common/mltools/tools_utils.ml | 11 ++++++++++- > lib/guestfs.pod | 5 +++++ > 3 files changed, 22 insertions(+), 1 deletion(-) > > diff --git a/common/mltools/test-machine-readable.sh > b/common/mltools/test-machine-readable.sh > index 1162c58e9..824460e6d 100755 > --- a/common/mltools/test-machine-readable.sh > +++ b/common/mltools/test-machine-readable.sh > @@ -65,3 +65,10 @@ test $($t --machine-readable=stream:stdout |& wc -l) -eq 3 > # Output "stream:stderr". > $t --machine-readable=stream:stderr 2>&1 >/dev/null | grep 'machine-readable' > test $($t --machine-readable=stream:stderr 2>&1 >/dev/null | wc -l) -eq 2 > + > +# Output "fd:". > +fn="$tmpdir/fdfile" > +exec 4>"$fn" > +$t --machine-readable=fd:4 > +exec 4>&- > +test $(cat "$fn" | wc -l) -eq 1 > diff --git a/common/mltools/tools_utils.ml b/common/mltools/tools_utils.ml > index ade4cb37f..35478f39e 100644 > --- a/common/mltools/tools_utils.ml > +++ b/common/mltools/tools_utils.ml > @@ -41,6 +41,7 @@ type machine_readable_output_type = > | NoOutput > | Channel of out_channel > | File of string > + | Fd of int > let machine_readable_output = ref NoOutput > let machine_readable_channel = ref None > let machine_readable () = > @@ -50,7 +51,10 @@ let machine_readable () = > match !machine_readable_output with > | NoOutput -> None > | Channel chan -> Some chan > - | File f -> Some (open_out f) in > + | File f -> Some (open_out f) > + | Fd fd -> > + (* Note that Unix.file_descr is really just an int. *) > + Some (Unix.out_channel_of_descr (Obj.magic fd)) in > machine_readable_channel := chan > ); > !machine_readable_channel > @@ -296,6 +300,11 @@ let create_standard_options argspec ?anon_fun ?(key_opts > = false) ?(machine_read > | n -> > error (f_"invalid output stream for --machine-readable: %s") fmt > in > machine_readable_output := Channel chan > + | "fd" -> > + (try > + machine_readable_output := Fd (int_of_string outname) > + with Failure _ -> > + error (f_"invalid output fd for --machine-readable: %s") fmt) > | n -> > error (f_"invalid output for --machine-readable: %s") fmt > ) > diff --git a/lib/guestfs.pod b/lib/guestfs.pod > index 53cece2da..f11028466 100644 > --- a/lib/guestfs.pod > +++ b/lib/guestfs.pod > @@ -3287,6 +3287,11 @@ The possible values are: > > =over 4 > > +=item B<fd:>I<fd> > + > +The output goes to the specified I<fd>, which is a file descriptor > +already opened for writing. > + > =item B<file:>F<filename> > > The output goes to the specified F<filename>.
Much simpler :-) ACK Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 100 libraries supported. http://fedoraproject.org/wiki/MinGW _______________________________________________ Libguestfs mailing list [email protected] https://www.redhat.com/mailman/listinfo/libguestfs
