api: add mountable_device and mountable_subvolume

These two functions allow the user to split the mountable strings
into a device and a subvolume if any. See this thread on the mailing
list for the rationale:

https://www.redhat.com/archives/libguestfs/2016-February/msg00247.html
This commit is contained in:
Cédric Bosdonnat
2016-03-08 16:04:21 +01:00
committed by Pino Toscano
parent 43dd545e46
commit f5a9cdff2a
4 changed files with 80 additions and 0 deletions

View File

@@ -1289,6 +1289,32 @@ for a filesystem to be shared between operating systems.
Please read L<guestfs(3)/INSPECTION> for more details.
See also C<guestfs_inspect_get_mountpoints>." };
{ defaults with
name = "mountable_device"; added = (1, 33, 15);
style = RString "device", [Mountable "mountable"], [];
shortdesc = "extract the device part of a mountable";
longdesc = "\
Returns the device name of a mountable. In quite a lot of
cases, the mountable is the device name.
However this doesn't apply for btrfs subvolumes, where the
mountable is a combination of both the device name and the
subvolume path (see also C<guestfs_mountable_subvolume> to
extract the subvolume path of the mountable if any)." };
{ defaults with
name = "mountable_subvolume"; added = (1, 33, 15);
style = RString "subvolume", [Mountable "mountable"], [];
shortdesc = "extract the subvolume part of a mountable";
longdesc = "\
Returns the subvolume path of a mountable. Btrfs subvolumes
mountables are a combination of both the device name and the
subvolume path (see also C<guestfs_mountable_device> to extract
the device of the mountable).
If the mountable does not represent a btrfs subvolume, then
this function fails and the C<errno> is set to C<EINVAL>." };
{ defaults with
name = "set_network"; added = (1, 5, 4);
style = RErr, [Bool "network"], [];

View File

@@ -346,6 +346,7 @@ src/libvirt-is-version.c
src/listfs.c
src/lpj.c
src/match.c
src/mountable.c
src/osinfo.c
src/private-data.c
src/proto.c

View File

@@ -121,6 +121,7 @@ libguestfs_la_SOURCES = \
listfs.c \
lpj.c \
match.c \
mountable.c \
osinfo.c \
private-data.c \
proto.c \

52
src/mountable.c Normal file
View File

@@ -0,0 +1,52 @@
/* libguestfs
* Copyright (C) 2016 SUSE LLC
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <config.h>
#include <string.h>
#include <errno.h>
#include "guestfs.h"
#include "guestfs-internal.h"
#include "guestfs-internal-actions.h"
char *
guestfs_impl_mountable_device (guestfs_h *g, const char *mountable)
{
CLEANUP_FREE_INTERNAL_MOUNTABLE struct guestfs_internal_mountable *mnt = NULL;
mnt = guestfs_internal_parse_mountable (g, mountable);
if (mnt == NULL)
return NULL;
return safe_strdup (g, mnt->im_device);
}
char *
guestfs_impl_mountable_subvolume (guestfs_h *g, const char *mountable)
{
CLEANUP_FREE_INTERNAL_MOUNTABLE struct guestfs_internal_mountable *mnt = NULL;
mnt = guestfs_internal_parse_mountable (g, mountable);
if (mnt == NULL || STREQ (mnt->im_volume, "")) {
guestfs_int_error_errno (g, EINVAL, "not a btrfs subvolume identifier");
return NULL;
}
return safe_strdup (g, mnt->im_volume);
}