daemon: Reimplement ‘device_index’ API in OCaml.

This commit is contained in:
Richard W.M. Jones
2017-06-15 16:42:52 +01:00
parent 3027a33110
commit 70b6f33566
4 changed files with 14 additions and 25 deletions

View File

@@ -33,27 +33,6 @@
#include "daemon.h"
#include "actions.h"
int
do_device_index (const char *device)
{
size_t i;
int ret = -1;
CLEANUP_FREE_STRING_LIST char **devices = do_list_devices ();
if (devices == NULL)
return -1;
for (i = 0; devices[i] != NULL; ++i) {
if (STREQ (device, devices[i]))
ret = (int) i;
}
if (ret == -1)
reply_with_error ("device not found");
return ret;
}
#define GUESTFSDIR "/dev/disk/guestfs"
char **

View File

@@ -113,3 +113,14 @@ let is_whole_device device =
try ignore (stat devpath); true
with Unix_error ((ENOENT|ENOTDIR), _, _) -> false
let device_index device =
(* This is the algorithm which was used by the C version. Why
* can't we use drive_index from C_utils? XXX
*)
let rec loop i = function
| [] -> failwithf "%s: device not found" device
| dev :: devices when dev = device -> i
| _ :: devices -> loop (i+1) devices
in
loop 0 (list_devices ())

View File

@@ -18,10 +18,8 @@
val list_devices : unit -> string list
val list_partitions : unit -> string list
val nr_devices : unit -> int
val part_to_dev : string -> string
val part_to_partnum : string -> int
val is_whole_device : string -> bool
val nr_devices : unit -> int
val device_index : string -> int

View File

@@ -7419,6 +7419,7 @@ instead of, or after calling C<guestfs_zero_free_space>." };
{ defaults with
name = "device_index"; added = (1, 19, 7);
style = RInt "index", [String (Device, "device")], [];
impl = OCaml "Devsparts.device_index";
tests = [
InitEmpty, Always, TestResult (
[["device_index"; "/dev/sda"]], "ret == 0"), []