From: Richard W.M. Jones Date: Tue, 12 Jul 2011 12:26:25 +0000 (+0100) Subject: New API: list-dm-devices (RHBZ#688062). X-Git-Tag: 1.11.15~6 X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=commitdiff_plain;h=ce5a8978b54f409de4347f16f7065b063cb47cf1 New API: list-dm-devices (RHBZ#688062). List device mapper devices. --- diff --git a/daemon/lvm.c b/daemon/lvm.c index dbca20b..eaa6bce 100644 --- a/daemon/lvm.c +++ b/daemon/lvm.c @@ -1,5 +1,5 @@ /* libguestfs - the guestfsd daemon - * Copyright (C) 2009 Red Hat Inc. + * Copyright (C) 2009-2011 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 @@ -24,6 +24,7 @@ #include #include #include +#include #include "daemon.h" #include "c-ctype.h" @@ -763,3 +764,80 @@ do_lvm_canonical_lv_name (const char *device) return canonical; /* caller frees */ } + +/* List everything in /dev/mapper which *isn't* an LV (RHBZ#688062). */ +char ** +do_list_dm_devices (void) +{ + char **ret = NULL; + int size = 0, alloc = 0; + struct dirent *d; + DIR *dir; + int r; + + dir = opendir ("/dev/mapper"); + if (!dir) { + reply_with_perror ("opendir: /dev/mapper"); + return NULL; + } + + while (1) { + errno = 0; + d = readdir (dir); + if (d == NULL) break; + + /* Ignore . and .. */ + if (STREQ (d->d_name, ".") || STREQ (d->d_name, "..")) + continue; + + /* Ignore /dev/mapper/control which is used internally by dm. */ + if (STREQ (d->d_name, "control")) + continue; + + size_t len = strlen (d->d_name); + char devname[len+64]; + + snprintf (devname, len+64, "/dev/mapper/%s", d->d_name); + + /* Ignore dm devices which are LVs. */ + r = lv_canonical (devname, NULL); + if (r == -1) { + free_stringslen (ret, size); + closedir (dir); + return NULL; + } + if (r) + continue; + + /* Not an LV, so add it. */ + if (add_string (&ret, &size, &alloc, devname) == -1) { + closedir (dir); + return NULL; + } + } + + /* Did readdir fail? */ + if (errno != 0) { + reply_with_perror ("readdir: /dev/mapper"); + free_stringslen (ret, size); + closedir (dir); + return NULL; + } + + /* Close the directory handle. */ + if (closedir (dir) == -1) { + reply_with_perror ("closedir: /dev/mapper"); + free_stringslen (ret, size); + return NULL; + } + + /* Sort the output (may be empty). */ + if (ret != NULL) + sort_strings (ret, size); + + /* NULL-terminate the list. */ + if (add_string (&ret, &size, &alloc, NULL) == -1) + return NULL; + + return ret; +} diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index 54cdd15..aedbeda 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -5574,7 +5574,10 @@ encrypted to the underlying C respectively. If this block device contains LVM volume groups, then calling C followed by C -will make them visible."); +will make them visible. + +Use C to list all device mapper +devices."); ("luks_open_ro", (RErr, [Device "device"; Key "key"; String "mapname"], []), 258, [Optional "luks"], [], @@ -5986,6 +5989,19 @@ If required, C will be automatically added to the options. Any other options required can be passed in the optional C parameter."); + ("list_dm_devices", (RStringList "devices", [], []), 287, [], + [], + "list device mapper devices", + "\ +List all device mapper devices. + +The returned list contains C devices, eg. ones created +by a previous call to C. + +Device mapper devices which correspond to logical volumes are I +returned in this list. Call C if you want to list logical +volumes."); + ] let all_functions = non_daemon_functions @ daemon_functions diff --git a/regressions/Makefile.am b/regressions/Makefile.am index 9c181bd..fada841 100644 --- a/regressions/Makefile.am +++ b/regressions/Makefile.am @@ -45,6 +45,7 @@ TESTS = \ test-inspect-fstab.sh \ test-launch-race.pl \ test-luks.sh \ + test-luks-list.sh \ test-lvm-filtering.sh \ test-lvm-mapping.pl \ test-noexec-stack.pl \ diff --git a/regressions/test-luks-list.sh b/regressions/test-luks-list.sh new file mode 100755 index 0000000..9c51464 --- /dev/null +++ b/regressions/test-luks-list.sh @@ -0,0 +1,111 @@ +#!/bin/bash - +# libguestfs +# Copyright (C) 2011 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +# Test LUKS devices appear in the output of list-dm-devices. + +set -e + +[ -n "$SKIP_TEST_LUKS_SH" ] && { + echo "test-luks-list.sh skipped (environment variable set)" + exit 0 +} + +rm -f test1.img test.output + +../fish/guestfish --keys-from-stdin > test.output <<'EOF' +sparse test1.img 1G +run +part-init /dev/sda mbr +part-add /dev/sda p 64 1048575 +part-add /dev/sda p 1048576 -64 + +# Create LUKS device with key "key0" in slot 0. +luks-format /dev/sda1 0 +key0 + +# Create some unrelated LVs. +pvcreate /dev/sda2 +vgcreate VG /dev/sda2 +lvcreate LV1 /dev/VG 100 +lvcreate LV2 /dev/VG 200 +lvcreate LV3 /dev/VG 100 + +# Open the device as 'lukstest'. +luks-open /dev/sda1 lukstest +key0 + +# List devices, '/dev/mapper/lukstest' should appear. +echo test 1 +list-dm-devices + +# Close the device. +luks-close /dev/mapper/lukstest + +# List devices, '/dev/mapper/lukstest' should not appear. +echo test 2 +list-dm-devices + +# Open the device again. +luks-open /dev/sda1 lukstest +key0 + +# Check no LVs appear in list-dm-devices output. +echo test 3 +list-dm-devices + +# Check LUKS device doesn't appear in any of the other lists. +echo test 4 +list-devices | sed 's,^/dev/[hv]d,/dev/sd,' +echo test 5 +list-partitions | sed 's,^/dev/[hv]d,/dev/sd,' +echo test 6 +lvs +echo test 7 +vgs +echo test 8 +pvs | sed 's,^/dev/[hv]d,/dev/sd,' + +EOF + +# Expected vs actual output. +if [ "$(cat test.output)" != "\ +test 1 +/dev/mapper/lukstest +test 2 +test 3 +/dev/mapper/lukstest +test 4 +/dev/sda +test 5 +/dev/sda1 +/dev/sda2 +test 6 +/dev/VG/LV1 +/dev/VG/LV2 +/dev/VG/LV3 +test 7 +VG +test 8 +/dev/sda2" ]; then + echo "test-luks-list.sh: Unexpected output from test:" + cat test.output + echo "[end of output]" + exit 1 +fi + +rm -f test1.img test.output diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR index c20f657..209ac45 100644 --- a/src/MAX_PROC_NR +++ b/src/MAX_PROC_NR @@ -1 +1 @@ -286 +287