On Fri, Sep 21, 2012 at 02:24:13PM +0100, Richard W.M. Jones wrote:
So environment variables are the way to go.
Another complication is that guestfs_create doesn't have a rich way to
return errors, and thus if the environment variables cannot be parsed
things start to go wrong. Currently it spits error messages out to
stderr in this case, which is very bad behaviour.
With the benefit of hindsight, splitting handle creation and
environment parsing into two calls would have been better:
g = guestfs_create ();
if (!g) error;
if (guestfs_set_environment (g) == -1) {
/* with the handle created, richer error methods are now available */
}
But we cannot change that now without breaking clients.
I thought of a way to do this which is backwards compatible.
Introduce a new guestfs_create_flags () call which takes a flag
variable. By default, passing flag == 0 is entirely the same as
guestfs_create.
g = guestfs_create_flags (0);
if (!g) error;
However you could also use it like this:
g = guestfs_create_flags (GUESTFS_CREATE_NO_ENVIRONMENT);
if (!g) error;
where no environment variable processing is done (hence no errors are
possible except ENOMEM). Callers can do environment variable
processing later (see guestfs_set_environment above). Or maybe not if
they don't want to be affected by the environment. Errors can be
handled properly in those later calls.
In the language backends, we'd have to map this to more flexible
functions, eg. in Perl:
my $g = Sys::Guestfs->new (environment => 0);
(which is of course backwards compatible with existing code).
I'll post a patch for this tomorrow if I have the time.
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages.
http://libguestfs.org