mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-21 22:53:37 +00:00
New API: btrfs-filesystem-show (RHBZ#1164765)
Add a new API to list all the devices where a btrfs filesystem is spanned.
This commit is contained in:
@@ -2203,6 +2203,84 @@ do_btrfs_replace (const char *srcdev, const char *targetdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
char **
|
||||
do_btrfs_filesystem_show (const char *device)
|
||||
{
|
||||
CLEANUP_FREE_STRINGSBUF DECLARE_STRINGSBUF (ret);
|
||||
const size_t MAX_ARGS = 16;
|
||||
const char *argv[MAX_ARGS];
|
||||
size_t i = 0;
|
||||
CLEANUP_FREE char *out = NULL;
|
||||
CLEANUP_FREE char *err = NULL;
|
||||
CLEANUP_FREE_STRING_LIST char **lines = NULL;
|
||||
int r;
|
||||
|
||||
ADD_ARG (argv, i, str_btrfs);
|
||||
ADD_ARG (argv, i, "filesystem");
|
||||
ADD_ARG (argv, i, "show");
|
||||
ADD_ARG (argv, i, device);
|
||||
ADD_ARG (argv, i, NULL);
|
||||
|
||||
r = commandv (&out, &err, argv);
|
||||
if (r == -1) {
|
||||
reply_with_error ("%s: %s", device, err);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
lines = split_lines (out);
|
||||
if (!lines)
|
||||
return NULL;
|
||||
|
||||
if (count_strings (lines) < 3) {
|
||||
reply_with_error ("truncated output from 'btrfs filesystem show' command");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Output of `btrfs filesystem show' is like:
|
||||
*
|
||||
* Label: none uuid: 99a1b6ba-de46-4a93-8f91-7d7685970a6c
|
||||
* Total devices 3 FS bytes used 1.12MiB
|
||||
* devid 1 size 10.00GiB used 2.00GiB path /dev/sda
|
||||
* [...]
|
||||
*
|
||||
* or:
|
||||
*
|
||||
* Label: none uuid: 99a1b6ba-de46-4a93-8f91-7d7685970a6c
|
||||
* Total devices 3 FS bytes used 1.12MiB
|
||||
* devid 1 size 10.00GiB used 2.00GiB path /dev/sda
|
||||
* [...]
|
||||
* *** Some devices missing
|
||||
*/
|
||||
for (i = 1; lines[i] != NULL; ++i) {
|
||||
if (lines[i][0] == 0)
|
||||
continue;
|
||||
if (STRPREFIX (lines[i], "Label: "))
|
||||
continue;
|
||||
else if (STRPREFIX (lines[i], "\tTotal devices "))
|
||||
continue;
|
||||
else if (STRPREFIX (lines[i], "\tdevid ")) {
|
||||
const char *p = strstr (lines[i], " path ");
|
||||
const char *end;
|
||||
if (!p)
|
||||
continue;
|
||||
|
||||
p += strlen (" path ");
|
||||
end = strchrnul (p, ' ');
|
||||
add_sprintf (&ret, "%.*s", (int) (end - p), p);
|
||||
} else if (STRPREFIX (lines[i], "\t*** Some devices missing")) {
|
||||
reply_with_error_errno (ENODEV, "%s: missing devices", device);
|
||||
return NULL;
|
||||
} else {
|
||||
reply_with_error ("unrecognized line in output from 'btrfs filesystem show': %s", lines[i]);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
end_stringsbuf (&ret);
|
||||
|
||||
return take_stringsbuf (&ret);
|
||||
}
|
||||
|
||||
/* btrfs command add a new command
|
||||
* inspect-internal min-dev-size <path>
|
||||
* since v4.2
|
||||
|
||||
@@ -12958,6 +12958,33 @@ and save it as F<filename> on the local machine.
|
||||
|
||||
This allows to download deleted or inaccessible files." };
|
||||
|
||||
{ defaults with
|
||||
name = "btrfs_filesystem_show"; added = (1, 33, 29);
|
||||
style = RStringList "devices", [Device "device"], [];
|
||||
proc_nr = Some 465;
|
||||
optional = Some "btrfs"; camel_name = "BTRFSFilesystemsShow";
|
||||
tests = [
|
||||
InitScratchFS, Always, TestLastFail (
|
||||
[["btrfs_filesystem_show"; "/dev/sdb"]]), [];
|
||||
InitPartition, Always, TestResult (
|
||||
[["mkfs_btrfs"; "/dev/sda1"; ""; ""; "NOARG"; ""; "NOARG"; "NOARG"; ""; ""];
|
||||
["btrfs_filesystem_show"; "/dev/sda1"]],
|
||||
"is_string_list (ret, 1, \"/dev/sda1\")"), [];
|
||||
InitEmpty, Always, TestResult (
|
||||
[["part_init"; "/dev/sda"; "mbr"];
|
||||
["part_add"; "/dev/sda"; "p"; "64"; "2047999"];
|
||||
["part_add"; "/dev/sda"; "p"; "2048000"; "4095999"];
|
||||
["mkfs_btrfs"; "/dev/sda1 /dev/sda2"; ""; ""; "NOARG"; ""; "NOARG"; "NOARG"; ""; ""];
|
||||
["btrfs_filesystem_show"; "/dev/sda1"]],
|
||||
"is_string_list (ret, 2, \"/dev/sda1\", \"/dev/sda2\")"), [];
|
||||
];
|
||||
shortdesc = "list devices for btrfs filesystem";
|
||||
longdesc = "\
|
||||
Show all the devices where the filesystems in C<device> is spanned over.
|
||||
|
||||
If not all the devices for the filesystems are present, then this function
|
||||
fails and the C<errno> is set to C<ENODEV>." };
|
||||
|
||||
]
|
||||
|
||||
(* Non-API meta-commands available only in guestfish.
|
||||
|
||||
@@ -1 +1 @@
|
||||
464
|
||||
465
|
||||
|
||||
Reference in New Issue
Block a user