Richard W.M. Jones
2022-Apr-29 11:04 UTC
[Libguestfs] [PATCH v3] New API: guestfs_device_name returning the drive name
For each drive added, return the name. For example calling this with index 0 will return the string "/dev/sda". I called it guestfs_device_name (not drive_name) for consistency with the existing guestfs_device_index function. You don't really need to call this function. You can follow the advice here: https://libguestfs.org/guestfs.3.html#block-device-naming and assume that drives are added with predictable names like "/dev/sda", "/dev/sdb", etc. However it's useful to expose the internal guestfs_int_drive_name function since especially handling names beyond index 26 is tricky (https://rwmj.wordpress.com/2011/01/09/how-are-linux-drives-named-beyond-drive-26-devsdz/) Fixes: https://github.com/libguestfs/libguestfs/issues/80 --- generator/actions_core.ml | 24 +++++++++++++++++++++++- lib/drives.c | 15 +++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/generator/actions_core.ml b/generator/actions_core.ml index ce9ee39cca..dc12fdc33e 100644 --- a/generator/actions_core.ml +++ b/generator/actions_core.ml @@ -737,7 +737,29 @@ returns the index of the device in the list of devices. Index numbers start from 0. The named device must exist, for example as a string returned from C<guestfs_list_devices>. -See also C<guestfs_list_devices>, C<guestfs_part_to_dev>." }; +See also C<guestfs_list_devices>, C<guestfs_part_to_dev>, +C<guestfs_device_name>." }; + + { defaults with + name = "device_name"; added = (1, 49, 1); + style = RString (RPlainString, "name"), [Int "index"], []; + tests = [ + InitEmpty, Always, TestResult ( + [["device_name"; "0"]], "STREQ (ret, \"/dev/sda\")"), []; + InitEmpty, Always, TestResult ( + [["device_name"; "1"]], "STREQ (ret, \"/dev/sdb\")"), []; + InitEmpty, Always, TestLastFail ( + [["device_name"; "99"]]), [] + ]; + shortdesc = "convert device index to name"; + longdesc = "\ +This function takes a device index and returns the device +name. For example index C<0> will return the string C</dev/sda>. + +The drive index must have been added to the handle. + +See also C<guestfs_list_devices>, C<guestfs_part_to_dev>, +C<guestfs_device_index>." }; { defaults with name = "shutdown"; added = (1, 19, 16); diff --git a/lib/drives.c b/lib/drives.c index fd95308d2d..a6179fc367 100644 --- a/lib/drives.c +++ b/lib/drives.c @@ -31,6 +31,7 @@ #include <netdb.h> #include <arpa/inet.h> #include <assert.h> +#include <errno.h> #include <libintl.h> #include "c-ctype.h" @@ -1084,3 +1085,17 @@ guestfs_impl_device_index (guestfs_h *g, const char *device) error (g, _("%s: device not found"), device); return r; } + +char * +guestfs_impl_device_name (guestfs_h *g, int index) +{ + char drive_name[64]; + + if (index < 0 || index >= g->nr_drives) { + guestfs_int_error_errno (g, EINVAL, _("drive index out of range")); + return NULL; + } + + guestfs_int_drive_name (index, drive_name); + return safe_asprintf (g, "/dev/sd%s", drive_name); +} -- 2.35.1
Laszlo Ersek
2022-May-02 07:20 UTC
[Libguestfs] [PATCH v3] New API: guestfs_device_name returning the drive name
On 04/29/22 13:04, Richard W.M. Jones wrote:> For each drive added, return the name. For example calling this with > index 0 will return the string "/dev/sda". I called it > guestfs_device_name (not drive_name) for consistency with the existing > guestfs_device_index function. > > You don't really need to call this function. You can follow the > advice here: > https://libguestfs.org/guestfs.3.html#block-device-naming > and assume that drives are added with predictable names like > "/dev/sda", "/dev/sdb", etc. > > However it's useful to expose the internal guestfs_int_drive_name > function since especially handling names beyond index 26 is tricky > (https://rwmj.wordpress.com/2011/01/09/how-are-linux-drives-named-beyond-drive-26-devsdz/) > > Fixes: https://github.com/libguestfs/libguestfs/issues/80 > --- > generator/actions_core.ml | 24 +++++++++++++++++++++++- > lib/drives.c | 15 +++++++++++++++ > 2 files changed, 38 insertions(+), 1 deletion(-) > > diff --git a/generator/actions_core.ml b/generator/actions_core.ml > index ce9ee39cca..dc12fdc33e 100644 > --- a/generator/actions_core.ml > +++ b/generator/actions_core.ml > @@ -737,7 +737,29 @@ returns the index of the device in the list of devices. > Index numbers start from 0. The named device must exist, > for example as a string returned from C<guestfs_list_devices>. > > -See also C<guestfs_list_devices>, C<guestfs_part_to_dev>." }; > +See also C<guestfs_list_devices>, C<guestfs_part_to_dev>, > +C<guestfs_device_name>." }; > + > + { defaults with > + name = "device_name"; added = (1, 49, 1); > + style = RString (RPlainString, "name"), [Int "index"], []; > + tests = [ > + InitEmpty, Always, TestResult ( > + [["device_name"; "0"]], "STREQ (ret, \"/dev/sda\")"), []; > + InitEmpty, Always, TestResult ( > + [["device_name"; "1"]], "STREQ (ret, \"/dev/sdb\")"), []; > + InitEmpty, Always, TestLastFail ( > + [["device_name"; "99"]]), [] > + ]; > + shortdesc = "convert device index to name"; > + longdesc = "\ > +This function takes a device index and returns the device > +name. For example index C<0> will return the string C</dev/sda>. > + > +The drive index must have been added to the handle. > + > +See also C<guestfs_list_devices>, C<guestfs_part_to_dev>, > +C<guestfs_device_index>." }; > > { defaults with > name = "shutdown"; added = (1, 19, 16); > diff --git a/lib/drives.c b/lib/drives.c > index fd95308d2d..a6179fc367 100644 > --- a/lib/drives.c > +++ b/lib/drives.c > @@ -31,6 +31,7 @@ > #include <netdb.h> > #include <arpa/inet.h> > #include <assert.h> > +#include <errno.h> > #include <libintl.h> > > #include "c-ctype.h" > @@ -1084,3 +1085,17 @@ guestfs_impl_device_index (guestfs_h *g, const char *device) > error (g, _("%s: device not found"), device); > return r; > } > + > +char * > +guestfs_impl_device_name (guestfs_h *g, int index) > +{ > + char drive_name[64]; > + > + if (index < 0 || index >= g->nr_drives) { > + guestfs_int_error_errno (g, EINVAL, _("drive index out of range")); > + return NULL; > + } > + > + guestfs_int_drive_name (index, drive_name); > + return safe_asprintf (g, "/dev/sd%s", drive_name); > +} >Reviewed-by: Laszlo Ersek <lersek at redhat.com>