New API: list-dm-devices (RHBZ#688062).

List device mapper devices.
This commit is contained in:
Richard W.M. Jones
2011-07-12 13:26:25 +01:00
parent 68af98e570
commit ce5a8978b5
5 changed files with 209 additions and 3 deletions

View File

@@ -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 <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <dirent.h>
#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;
}

View File

@@ -5574,7 +5574,10 @@ encrypted to the underlying C<device> respectively.
If this block device contains LVM volume groups, then
calling C<guestfs_vgscan> followed by C<guestfs_vg_activate_all>
will make them visible.");
will make them visible.
Use C<guestfs_list_dm_devices> 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<trans=virtio> will be automatically added to the options.
Any other options required can be passed in the optional C<options>
parameter.");
("list_dm_devices", (RStringList "devices", [], []), 287, [],
[],
"list device mapper devices",
"\
List all device mapper devices.
The returned list contains C</dev/mapper/*> devices, eg. ones created
by a previous call to C<guestfs_luks_open>.
Device mapper devices which correspond to logical volumes are I<not>
returned in this list. Call C<guestfs_lvs> if you want to list logical
volumes.");
]
let all_functions = non_daemon_functions @ daemon_functions

View File

@@ -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 \

111
regressions/test-luks-list.sh Executable file
View File

@@ -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

View File

@@ -1 +1 @@
286
287