This API already existed (as guestfs___add_libvirt_dom), and was used
by a few tools.
This commit changes it to a public API.
Note that for reasons outlined in the previous commit message, it is
impossible to call this from guestfish or from non-C language
bindings.
---
align/scan.c | 8 ++++----
df/df.c | 10 ++++++----
df/domains.h | 2 ++
generator/actions.ml | 7 ++-----
generator/c.ml | 3 ---
gobject/Makefile.inc | 2 ++
perl/typemap | 4 ++++
po/POTFILES | 1 +
src/guestfs-internal-frontend.h | 33 ---------------------------------
src/libvirt-domain.c | 37 +++++++++++++++++++------------------
tests/c-api/Makefile.am | 22 +++++++++++-----------
tests/c-api/test-add-libvirt-dom.c | 2 +-
12 files changed, 52 insertions(+), 79 deletions(-)
diff --git a/align/scan.c b/align/scan.c
index 7da468f..651d805 100644
--- a/align/scan.c
+++ b/align/scan.c
@@ -353,15 +353,15 @@ scan (guestfs_h *g, const char *prefix, FILE *fp)
static int
scan_work (guestfs_h *g, size_t i, FILE *fp)
{
- struct guestfs___add_libvirt_dom_argv optargs;
+ struct guestfs_add_libvirt_dom_argv optargs;
optargs.bitmask =
- GUESTFS___ADD_LIBVIRT_DOM_READONLY_BITMASK |
- GUESTFS___ADD_LIBVIRT_DOM_READONLYDISK_BITMASK;
+ GUESTFS_ADD_LIBVIRT_DOM_READONLY_BITMASK |
+ GUESTFS_ADD_LIBVIRT_DOM_READONLYDISK_BITMASK;
optargs.readonly = 1;
optargs.readonlydisk = "read";
- if (guestfs___add_libvirt_dom (g, domains[i].dom, &optargs) == -1)
+ if (guestfs_add_libvirt_dom_argv (g, domains[i].dom, &optargs) == -1)
return -1;
if (guestfs_launch (g) == -1)
diff --git a/df/df.c b/df/df.c
index 0dcf1c9..a13cc59 100644
--- a/df/df.c
+++ b/df/df.c
@@ -85,6 +85,8 @@ df_on_handle (guestfs_h *g, const char *name, const char *uuid, FILE
*fp)
#if defined(HAVE_LIBVIRT)
+#include <libvirt/libvirt.h>
+
/* The multi-threaded version. This callback is called from the code
* in "parallel.c".
*/
@@ -92,16 +94,16 @@ df_on_handle (guestfs_h *g, const char *name, const char *uuid, FILE
*fp)
int
df_work (guestfs_h *g, size_t i, FILE *fp)
{
- struct guestfs___add_libvirt_dom_argv optargs;
+ struct guestfs_add_libvirt_dom_argv optargs;
optargs.bitmask =
- GUESTFS___ADD_LIBVIRT_DOM_READONLY_BITMASK |
- GUESTFS___ADD_LIBVIRT_DOM_READONLYDISK_BITMASK;
+ GUESTFS_ADD_LIBVIRT_DOM_READONLY_BITMASK |
+ GUESTFS_ADD_LIBVIRT_DOM_READONLYDISK_BITMASK;
optargs.readonly = 1;
optargs.readonlydisk = "read";
/* Traditionally we have ignored errors from adding disks in virt-df. */
- if (guestfs___add_libvirt_dom (g, domains[i].dom, &optargs) == -1)
+ if (guestfs_add_libvirt_dom_argv (g, domains[i].dom, &optargs) == -1)
return 0;
if (guestfs_launch (g) == -1)
diff --git a/df/domains.h b/df/domains.h
index 50e8762..ecf791b 100644
--- a/df/domains.h
+++ b/df/domains.h
@@ -21,6 +21,8 @@
#if defined(HAVE_LIBVIRT)
+#include <libvirt/libvirt.h>
+
/* The list of domains that we build up in get_all_libvirt_guests. */
struct domain {
virDomainPtr dom;
diff --git a/generator/actions.ml b/generator/actions.ml
index 93e3d0d..4bd0788 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -1705,12 +1705,10 @@ Disks with the E<lt>readonly/E<gt> flag are skipped.
The other optional parameters are passed directly through to
C<guestfs_add_drive_opts>." };
-(*
-This interface is not quite baked yet. -- RWMJ 2010-11-11
{ defaults with
name = "add_libvirt_dom";
- style = RInt "nrdisks", [Pointer ("virDomainPtr",
"dom")], [Bool "readonly"; String "iface"; Bool
"live"; String "readonlydisk"; OString "cachemode"; OString
"discard"; OBool "copyonread"];
- in_fish = false;
+ style = RInt "nrdisks", [Pointer ("virDomainPtr",
"dom")], [OBool "readonly"; OString "iface"; OBool
"live"; OString "readonlydisk"; OString "cachemode"; OString
"discard"; OBool "copyonread"];
+ config_only = true;
shortdesc = "add the disk(s) from a libvirt domain";
longdesc = "\
This function adds the disk(s) attached to the libvirt domain C<dom>.
@@ -1745,7 +1743,6 @@ See C<guestfs_add_domain> for possible values.
The other optional parameters are passed directly through to
C<guestfs_add_drive_opts>." };
-*)
{ defaults with
name = "inspect_get_package_format";
diff --git a/generator/c.ml b/generator/c.ml
index 541c843..10dea84 100644
--- a/generator/c.ml
+++ b/generator/c.ml
@@ -2182,9 +2182,6 @@ and generate_linker_script () =
"guestfs___safe_malloc";
"guestfs___safe_strdup";
"guestfs___safe_memdup";
-
- (* Used only by virt-df and virt-alignment-scan. *)
- "guestfs___add_libvirt_dom";
] in
let functions =
List.flatten (
diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc
index 56a2fc3..218eef7 100644
--- a/gobject/Makefile.inc
+++ b/gobject/Makefile.inc
@@ -47,6 +47,7 @@ guestfs_gobject_headers= \
include/guestfs-gobject/optargs-add_domain.h \
include/guestfs-gobject/optargs-add_drive.h \
include/guestfs-gobject/optargs-add_drive_scratch.h \
+ include/guestfs-gobject/optargs-add_libvirt_dom.h \
include/guestfs-gobject/optargs-btrfs_filesystem_resize.h \
include/guestfs-gobject/optargs-btrfs_fsck.h \
include/guestfs-gobject/optargs-btrfs_subvolume_create.h \
@@ -127,6 +128,7 @@ guestfs_gobject_sources= \
src/optargs-add_domain.c \
src/optargs-add_drive.c \
src/optargs-add_drive_scratch.c \
+ src/optargs-add_libvirt_dom.c \
src/optargs-btrfs_filesystem_resize.c \
src/optargs-btrfs_fsck.c \
src/optargs-btrfs_subvolume_create.c \
diff --git a/perl/typemap b/perl/typemap
index 43e7948..e6f95d2 100644
--- a/perl/typemap
+++ b/perl/typemap
@@ -3,6 +3,7 @@ char * T_PV
const char * T_PV
guestfs_h * O_OBJECT_guestfs_h
int64_t O_OBJECT_int64
+void * /* virDomainPtr */ O_OBJECT_virDomainPtr
INPUT
O_OBJECT_guestfs_h
@@ -21,6 +22,9 @@ O_OBJECT_guestfs_h
O_OBJECT_int64
$var = my_SvIV64 ($arg);
+O_OBJECT_virDomainPtr
+ $var = POINTER_NOT_IMPLEMENTED (\"virDomainPtr\");
+
OUTPUT
O_OBJECT_guestfs_h
sv_setiv ($arg, PTR2IV ($var));
diff --git a/po/POTFILES b/po/POTFILES
index 36f61b2..a8e211f 100644
--- a/po/POTFILES
+++ b/po/POTFILES
@@ -173,6 +173,7 @@ fuse/test-guestunmount-fd.c
gobject/src/optargs-add_domain.c
gobject/src/optargs-add_drive.c
gobject/src/optargs-add_drive_scratch.c
+gobject/src/optargs-add_libvirt_dom.c
gobject/src/optargs-btrfs_filesystem_resize.c
gobject/src/optargs-btrfs_fsck.c
gobject/src/optargs-btrfs_subvolume_create.c
diff --git a/src/guestfs-internal-frontend.h b/src/guestfs-internal-frontend.h
index acb7014..cddf719 100644
--- a/src/guestfs-internal-frontend.h
+++ b/src/guestfs-internal-frontend.h
@@ -127,39 +127,6 @@ extern void guestfs___cleanup_pclose (void *ptr);
*/
#include "guestfs-internal-frontend-cleanups.h"
-#if defined(HAVE_LIBVIRT)
-
-#include <libvirt/libvirt.h>
-
-/* This was proposed as an external API, but there's a problem: the
- * generator is unable to bind a virDomainPtr in any language other
- * than C. For now this API is only used by virt-df and
- * virt-alignment-scan (both C tools) and it's only exported
- * internally within the libguestfs code, not to external users.
- */
-
-struct guestfs___add_libvirt_dom_argv {
- uint64_t bitmask;
-#define GUESTFS___ADD_LIBVIRT_DOM_READONLY_BITMASK (UINT64_C(1)<<0)
- int readonly;
-#define GUESTFS___ADD_LIBVIRT_DOM_IFACE_BITMASK (UINT64_C(1)<<1)
- const char *iface;
-#define GUESTFS___ADD_LIBVIRT_DOM_LIVE_BITMASK (UINT64_C(1)<<2)
- int live;
-#define GUESTFS___ADD_LIBVIRT_DOM_READONLYDISK_BITMASK (UINT64_C(1)<<3)
- const char *readonlydisk;
-#define GUESTFS___ADD_LIBVIRT_DOM_CACHEMODE_BITMASK (UINT64_C(1)<<4)
- const char *cachemode;
-#define GUESTFS___ADD_LIBVIRT_DOM_DISCARD_BITMASK (UINT64_C(1)<<5)
- const char *discard;
-#define GUESTFS___ADD_LIBVIRT_DOM_COPYONREAD_BITMASK (UINT64_C(1)<<6)
- int copyonread;
-};
-
-extern GUESTFS_DLL_PUBLIC int guestfs___add_libvirt_dom (guestfs_h *g, virDomainPtr dom,
const struct guestfs___add_libvirt_dom_argv *optargs);
-
-#endif /* HAVE_LIBVIRT */
-
/* Current program name. Note <errno.h> must be included in all files
* that want to use 'program_name'.
*/
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index 59bb4bc..78503e5 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -67,7 +67,7 @@ guestfs__add_domain (guestfs_h *g, const char *domain_name,
const char *cachemode;
const char *discard;
bool copyonread;
- struct guestfs___add_libvirt_dom_argv optargs2 = { .bitmask = 0 };
+ struct guestfs_add_libvirt_dom_argv optargs2 = { .bitmask = 0 };
libvirturi = optargs->bitmask & GUESTFS_ADD_DOMAIN_LIBVIRTURI_BITMASK
? optargs->libvirturi : NULL;
@@ -124,35 +124,35 @@ guestfs__add_domain (guestfs_h *g, const char *domain_name,
}
if (readonly) {
- optargs2.bitmask |= GUESTFS___ADD_LIBVIRT_DOM_READONLY_BITMASK;
+ optargs2.bitmask |= GUESTFS_ADD_LIBVIRT_DOM_READONLY_BITMASK;
optargs2.readonly = readonly;
}
if (iface) {
- optargs2.bitmask |= GUESTFS___ADD_LIBVIRT_DOM_IFACE_BITMASK;
+ optargs2.bitmask |= GUESTFS_ADD_LIBVIRT_DOM_IFACE_BITMASK;
optargs2.iface = iface;
}
if (live) {
- optargs2.bitmask |= GUESTFS___ADD_LIBVIRT_DOM_LIVE_BITMASK;
+ optargs2.bitmask |= GUESTFS_ADD_LIBVIRT_DOM_LIVE_BITMASK;
optargs2.live = live;
}
if (readonlydisk) {
- optargs2.bitmask |= GUESTFS___ADD_LIBVIRT_DOM_READONLYDISK_BITMASK;
+ optargs2.bitmask |= GUESTFS_ADD_LIBVIRT_DOM_READONLYDISK_BITMASK;
optargs2.readonlydisk = readonlydisk;
}
if (cachemode) {
- optargs2.bitmask |= GUESTFS___ADD_LIBVIRT_DOM_CACHEMODE_BITMASK;
+ optargs2.bitmask |= GUESTFS_ADD_LIBVIRT_DOM_CACHEMODE_BITMASK;
optargs2.cachemode = cachemode;
}
if (discard) {
- optargs2.bitmask |= GUESTFS___ADD_LIBVIRT_DOM_DISCARD_BITMASK;
+ optargs2.bitmask |= GUESTFS_ADD_LIBVIRT_DOM_DISCARD_BITMASK;
optargs2.discard = discard;
}
if (copyonread) {
- optargs2.bitmask |= GUESTFS___ADD_LIBVIRT_DOM_COPYONREAD_BITMASK;
+ optargs2.bitmask |= GUESTFS_ADD_LIBVIRT_DOM_COPYONREAD_BITMASK;
optargs2.copyonread = copyonread;
}
- r = guestfs___add_libvirt_dom (g, dom, &optargs2);
+ r = guestfs_add_libvirt_dom_argv (g, dom, &optargs2);
cleanup:
if (dom) virDomainFree (dom);
@@ -179,9 +179,10 @@ struct add_disk_data {
};
GUESTFS_DLL_PUBLIC int
-guestfs___add_libvirt_dom (guestfs_h *g, virDomainPtr dom,
- const struct guestfs___add_libvirt_dom_argv *optargs)
+guestfs__add_libvirt_dom (guestfs_h *g, void *domvp,
+ const struct guestfs_add_libvirt_dom_argv *optargs)
{
+ virDomainPtr dom = domvp;
ssize_t r;
int readonly;
const char *iface;
@@ -197,16 +198,16 @@ guestfs___add_libvirt_dom (guestfs_h *g, virDomainPtr dom,
CLEANUP_FREE char *label = NULL, *imagelabel = NULL;
readonly =
- optargs->bitmask & GUESTFS___ADD_LIBVIRT_DOM_READONLY_BITMASK
+ optargs->bitmask & GUESTFS_ADD_LIBVIRT_DOM_READONLY_BITMASK
? optargs->readonly : 0;
iface =
- optargs->bitmask & GUESTFS___ADD_LIBVIRT_DOM_IFACE_BITMASK
+ optargs->bitmask & GUESTFS_ADD_LIBVIRT_DOM_IFACE_BITMASK
? optargs->iface : NULL;
live =
- optargs->bitmask & GUESTFS___ADD_LIBVIRT_DOM_LIVE_BITMASK
+ optargs->bitmask & GUESTFS_ADD_LIBVIRT_DOM_LIVE_BITMASK
? optargs->live : 0;
- if ((optargs->bitmask & GUESTFS___ADD_LIBVIRT_DOM_READONLYDISK_BITMASK)) {
+ if ((optargs->bitmask & GUESTFS_ADD_LIBVIRT_DOM_READONLYDISK_BITMASK)) {
if (STREQ (optargs->readonlydisk, "error"))
readonlydisk = readonlydisk_error;
else if (STREQ (optargs->readonlydisk, "read"))
@@ -222,15 +223,15 @@ guestfs___add_libvirt_dom (guestfs_h *g, virDomainPtr dom,
}
cachemode =
- optargs->bitmask & GUESTFS___ADD_LIBVIRT_DOM_CACHEMODE_BITMASK
+ optargs->bitmask & GUESTFS_ADD_LIBVIRT_DOM_CACHEMODE_BITMASK
? optargs->cachemode : NULL;
discard =
- optargs->bitmask & GUESTFS___ADD_LIBVIRT_DOM_DISCARD_BITMASK
+ optargs->bitmask & GUESTFS_ADD_LIBVIRT_DOM_DISCARD_BITMASK
? optargs->discard : NULL;
copyonread =
- optargs->bitmask & GUESTFS___ADD_LIBVIRT_DOM_COPYONREAD_BITMASK
+ optargs->bitmask & GUESTFS_ADD_LIBVIRT_DOM_COPYONREAD_BITMASK
? optargs->copyonread : false;
if (live && readonly) {
diff --git a/tests/c-api/Makefile.am b/tests/c-api/Makefile.am
index 94cdd0a..57f75fe 100644
--- a/tests/c-api/Makefile.am
+++ b/tests/c-api/Makefile.am
@@ -240,17 +240,17 @@ test_event_string_LDADD = \
$(LTLIBINTL) \
$(top_builddir)/gnulib/lib/libgnu.la
-#if HAVE_LIBVIRT
-#test_add_libvirt_dom_SOURCES = test-add-libvirt-dom.c
-#test_add_libvirt_dom_CPPFLAGS = \
-# -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_srcdir)/gnulib/lib
-#test_add_libvirt_dom_CFLAGS = \
-# $(LIBVIRT_CFLAGS) \
-# $(WARN_CFLAGS) $(WERROR_CFLAGS)
-#test_add_libvirt_dom_LDADD = \
-# $(top_builddir)/src/libguestfs.la $(LIBVIRT_LIBS) \
-# $(LTLIBTHREAD) $(top_builddir)/gnulib/lib/libgnu.la
-#endif
+if HAVE_LIBVIRT
+test_add_libvirt_dom_SOURCES = test-add-libvirt-dom.c
+test_add_libvirt_dom_CPPFLAGS = \
+ -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_srcdir)/gnulib/lib
+test_add_libvirt_dom_CFLAGS = \
+ $(LIBVIRT_CFLAGS) \
+ $(WARN_CFLAGS) $(WERROR_CFLAGS)
+test_add_libvirt_dom_LDADD = \
+ $(top_builddir)/src/libguestfs.la $(LIBVIRT_LIBS) \
+ $(LTLIBTHREAD) $(top_builddir)/gnulib/lib/libgnu.la
+endif
check-valgrind:
$(MAKE) VG="$(top_builddir)/run @VG@" check
diff --git a/tests/c-api/test-add-libvirt-dom.c b/tests/c-api/test-add-libvirt-dom.c
index 4768f8e..952b9a8 100644
--- a/tests/c-api/test-add-libvirt-dom.c
+++ b/tests/c-api/test-add-libvirt-dom.c
@@ -1,5 +1,5 @@
/* libguestfs
- * Copyright (C) 2010 Red Hat Inc.
+ * Copyright (C) 2010-2014 Red Hat Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
--
2.1.0