On Mon, Sep 19, 2016 at 07:12:44PM +0200, Pino Toscano wrote: > This way it is easier to use them outside the rest of the code in > guestfish for inspection & mount. > > Just code motion, no behaviour changes. > --- > align/Makefile.am | 1 + > cat/Makefile.am | 1 + > df/Makefile.am | 1 + > diff/Makefile.am | 1 + > edit/Makefile.am | 1 + > fish/Makefile.am | 1 + > fish/decrypt.c | 102 > ++++++++++++++++++++++++++++++++++++++++++++++++++ > fish/inspect.c | 68 --------------------------------- > fish/options.h | 4 +- > format/Makefile.am | 1 + > fuse/Makefile.am | 1 + > inspector/Makefile.am | 1 + > rescue/Makefile.am | 1 + > 13 files changed, 115 insertions(+), 69 deletions(-) > create mode 100644 fish/decrypt.c > > diff --git a/align/Makefile.am b/align/Makefile.am > index 1eccf28..eb44263 100644 > --- a/align/Makefile.am > +++ b/align/Makefile.am > @@ -33,6 +33,7 @@ SHARED_SOURCE_FILES = \ > ../df/parallel.c \ > ../df/parallel.h \ > ../fish/config.c \ > + ../fish/decrypt.c \ > ../fish/display-options.h \ > ../fish/display-options.c \ > ../fish/domain.c \ > diff --git a/cat/Makefile.am b/cat/Makefile.am > index 38faa94..5e55742 100644 > --- a/cat/Makefile.am > +++ b/cat/Makefile.am > @@ -31,6 +31,7 @@ EXTRA_DIST = \ > bin_PROGRAMS = virt-cat virt-filesystems virt-log virt-ls > > SHARED_SOURCE_FILES = \ > + ../fish/decrypt.c \ > ../fish/display-options.h \ > ../fish/display-options.c \ > ../fish/domain.c \ > diff --git a/df/Makefile.am b/df/Makefile.am > index ce1686a..6efc1dc 100644 > --- a/df/Makefile.am > +++ b/df/Makefile.am > @@ -28,6 +28,7 @@ bin_PROGRAMS = virt-df > > SHARED_SOURCE_FILES = \ > ../fish/config.c \ > + ../fish/decrypt.c \ > ../fish/display-options.h \ > ../fish/display-options.c \ > ../fish/domain.c \ > diff --git a/diff/Makefile.am b/diff/Makefile.am > index cdbe05c..7dfe2cd 100644 > --- a/diff/Makefile.am > +++ b/diff/Makefile.am > @@ -27,6 +27,7 @@ bin_PROGRAMS = virt-diff > SHARED_SOURCE_FILES = \ > ../cat/visit.h \ > ../cat/visit.c \ > + ../fish/decrypt.c \ > ../fish/display-options.h \ > ../fish/display-options.c \ > ../fish/domain.c \ > diff --git a/edit/Makefile.am b/edit/Makefile.am > index 4ac4f08..dc9fbb0 100644 > --- a/edit/Makefile.am > +++ b/edit/Makefile.am > @@ -26,6 +26,7 @@ bin_PROGRAMS = virt-edit > > SHARED_SOURCE_FILES = \ > ../fish/config.c \ > + ../fish/decrypt.c \ > ../fish/display-options.h \ > ../fish/display-options.c \ > ../fish/domain.c \ > diff --git a/fish/Makefile.am b/fish/Makefile.am > index e1bc210..8fdcd27 100644 > --- a/fish/Makefile.am > +++ b/fish/Makefile.am > @@ -73,6 +73,7 @@ EXTRA_DIST = \ > # files must not include other guestfish files. > SHARED_SOURCE_FILES = \ > config.c \ > + decrypt.c \ > display-options.h \ > display-options.c \ > domain.c \ > diff --git a/fish/decrypt.c b/fish/decrypt.c > new file mode 100644 > index 0000000..d6e041d > --- /dev/null > +++ b/fish/decrypt.c > @@ -0,0 +1,102 @@ > +/* libguestfs - shared disk decryption > + * Copyright (C) 2010 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 > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA. > + */ > + > +/** > + * This file implements the decryption of disk images, usually done > + * before mounting their partitions. > + */ > + > +#include <config.h> > + > +#include <stdio.h> > +#include <stdlib.h> > +#include <string.h> > + > +#include "c-ctype.h" > + > +#include "guestfs.h" > + > +#include "options.h" > + > +/** > + * Make a LUKS map name from the partition name, > + * eg. C<"/dev/vda2" =E<gt> "luksvda2"> > + */ > +static void > +make_mapname (const char *device, char *mapname, size_t len) > +{ > + size_t i = 0; > + > + if (len < 5) > + abort (); > + strcpy (mapname, "luks"); > + mapname += 4; > + len -= 4; > + > + if (STRPREFIX (device, "/dev/")) > + i = 5; > + > + for (; device[i] != '\0' && len >= 1; ++i) { > + if (c_isalnum (device[i])) { > + *mapname++ = device[i]; > + len--; > + } > + } > + > + *mapname = '\0'; > +} > + > +/** > + * Simple implementation of decryption: look for any C<crypto_LUKS> > + * partitions and decrypt them, then rescan for VGs. This only works > + * for Fedora whole-disk encryption. WIP to make this work for other > + * encryption schemes. > + */ > +void > +inspect_do_decrypt (guestfs_h *g) > +{ > + CLEANUP_FREE_STRING_LIST char **partitions = guestfs_list_partitions (g); > + if (partitions == NULL) > + exit (EXIT_FAILURE); > + > + int need_rescan = 0; > + size_t i; > + for (i = 0; partitions[i] != NULL; ++i) { > + CLEANUP_FREE char *type = guestfs_vfs_type (g, partitions[i]); > + if (type && STREQ (type, "crypto_LUKS")) { > + char mapname[32]; > + make_mapname (partitions[i], mapname, sizeof mapname); > + > + CLEANUP_FREE char *key = read_key (partitions[i]); > + /* XXX Should we call guestfs_luks_open_ro if readonly flag > + * is set? This might break 'mount_ro'. > + */ > + if (guestfs_luks_open (g, partitions[i], key, mapname) == -1) > + exit (EXIT_FAILURE); > + > + need_rescan = 1; > + } > + } > + > + if (need_rescan) { > + if (guestfs_vgscan (g) == -1) > + exit (EXIT_FAILURE); > + if (guestfs_vg_activate_all (g, 1) == -1) > + exit (EXIT_FAILURE); > + } > +} > diff --git a/fish/inspect.c b/fish/inspect.c > index 952d4f7..4a5b3c3 100644 > --- a/fish/inspect.c > +++ b/fish/inspect.c > @@ -202,71 +202,3 @@ print_inspect_prompt (void) > dev ? dev : mountpoints[i+1], mountpoints[i]); > } > } > - > -/** > - * Make a LUKS map name from the partition name, > - * eg. C<"/dev/vda2" =E<gt> "luksvda2"> > - */ > -static void > -make_mapname (const char *device, char *mapname, size_t len) > -{ > - size_t i = 0; > - > - if (len < 5) > - abort (); > - strcpy (mapname, "luks"); > - mapname += 4; > - len -= 4; > - > - if (STRPREFIX (device, "/dev/")) > - i = 5; > - > - for (; device[i] != '\0' && len >= 1; ++i) { > - if (c_isalnum (device[i])) { > - *mapname++ = device[i]; > - len--; > - } > - } > - > - *mapname = '\0'; > -} > - > -/** > - * Simple implementation of decryption: look for any C<crypto_LUKS> > - * partitions and decrypt them, then rescan for VGs. This only works > - * for Fedora whole-disk encryption. WIP to make this work for other > - * encryption schemes. > - */ > -void > -inspect_do_decrypt (guestfs_h *g) > -{ > - CLEANUP_FREE_STRING_LIST char **partitions = guestfs_list_partitions (g); > - if (partitions == NULL) > - exit (EXIT_FAILURE); > - > - int need_rescan = 0; > - size_t i; > - for (i = 0; partitions[i] != NULL; ++i) { > - CLEANUP_FREE char *type = guestfs_vfs_type (g, partitions[i]); > - if (type && STREQ (type, "crypto_LUKS")) { > - char mapname[32]; > - make_mapname (partitions[i], mapname, sizeof mapname); > - > - CLEANUP_FREE char *key = read_key (partitions[i]); > - /* XXX Should we call guestfs_luks_open_ro if readonly flag > - * is set? This might break 'mount_ro'. > - */ > - if (guestfs_luks_open (g, partitions[i], key, mapname) == -1) > - exit (EXIT_FAILURE); > - > - need_rescan = 1; > - } > - } > - > - if (need_rescan) { > - if (guestfs_vgscan (g) == -1) > - exit (EXIT_FAILURE); > - if (guestfs_vg_activate_all (g, 1) == -1) > - exit (EXIT_FAILURE); > - } > -} > diff --git a/fish/options.h b/fish/options.h > index 061b41f..e8a4ebc 100644 > --- a/fish/options.h > +++ b/fish/options.h > @@ -111,6 +111,9 @@ struct mp { > /* in config.c */ > extern void parse_config (void); > > +/* in decrypt.c */ > +extern void inspect_do_decrypt (guestfs_h *g); > + > /* in domain.c */ > extern int add_libvirt_drives (guestfs_h *g, const char *guest); > > @@ -124,7 +127,6 @@ extern void print_inspect_prompt (void); > > #if COMPILING_VIRT_INSPECTOR > /* (low-level inspection functions, used by virt-inspector only) */ > -extern void inspect_do_decrypt (guestfs_h *g); > extern void inspect_mount_root (guestfs_h *g, const char *root); > #endif > > diff --git a/format/Makefile.am b/format/Makefile.am > index d196910..0e881a5 100644 > --- a/format/Makefile.am > +++ b/format/Makefile.am > @@ -26,6 +26,7 @@ bin_PROGRAMS = virt-format > > SHARED_SOURCE_FILES = \ > ../fish/config.c \ > + ../fish/decrypt.c \ > ../fish/display-options.h \ > ../fish/display-options.c \ > ../fish/domain.c \ > diff --git a/fuse/Makefile.am b/fuse/Makefile.am > index d766479..b8f5ad6 100644 > --- a/fuse/Makefile.am > +++ b/fuse/Makefile.am > @@ -34,6 +34,7 @@ bin_PROGRAMS = \ > # between guestfish and guestmount. > SHARED_SOURCE_FILES = \ > ../fish/config.c \ > + ../fish/decrypt.c \ > ../fish/display-options.h \ > ../fish/display-options.c \ > ../fish/domain.c \ > diff --git a/inspector/Makefile.am b/inspector/Makefile.am > index 00ca5d5..760e810 100644 > --- a/inspector/Makefile.am > +++ b/inspector/Makefile.am > @@ -54,6 +54,7 @@ bin_PROGRAMS = virt-inspector > > SHARED_SOURCE_FILES = \ > ../fish/config.c \ > + ../fish/decrypt.c \ > ../fish/display-options.h \ > ../fish/display-options.c \ > ../fish/domain.c \ > diff --git a/rescue/Makefile.am b/rescue/Makefile.am > index c2545bd..f2a3c39 100644 > --- a/rescue/Makefile.am > +++ b/rescue/Makefile.am > @@ -27,6 +27,7 @@ bin_PROGRAMS = virt-rescue > > SHARED_SOURCE_FILES = \ > ../fish/config.c \ > + ../fish/decrypt.c \ > ../fish/display-options.h \ > ../fish/display-options.c \ > ../fish/domain.c \ > -- > 2.7.4
This appears to be straight code motion, so ACK. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-df lists disk usage of guests without needing to install any software inside the virtual machine. Supports Linux and Windows. http://people.redhat.com/~rjones/virt-df/ _______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://www.redhat.com/mailman/listinfo/libguestfs