mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-22 07:03:38 +00:00
New API: list-dm-devices (RHBZ#688062).
List device mapper devices.
This commit is contained in:
80
daemon/lvm.c
80
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 <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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
111
regressions/test-luks-list.sh
Executable 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
|
||||
@@ -1 +1 @@
|
||||
286
|
||||
287
|
||||
|
||||
Reference in New Issue
Block a user