E.g.
% sg_map
/dev/sg0 /dev/sda
/dev/sg1 /dev/sr0
What the helper gets for /dev/sg0 is /dev/sda, it will be used by
later patch.
---
src/libvirt_private.syms | 1 +
src/util/virscsi.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
src/util/virscsi.h | 4 ++++
3 files changed, 52 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index fa59c14..8a7105c 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1692,6 +1692,7 @@ virSCSIDeviceFileIterate;
virSCSIDeviceFree;
virSCSIDeviceGetAdapter;
virSCSIDeviceGetBus;
+virSCSIDeviceGetDevName;
virSCSIDeviceGetName;
virSCSIDeviceGetReadonly;
virSCSIDeviceGetSgName;
diff --git a/src/util/virscsi.c b/src/util/virscsi.c
index 7d3d40e..f337c75 100644
--- a/src/util/virscsi.c
+++ b/src/util/virscsi.c
@@ -143,6 +143,53 @@ cleanup:
return sg;
}
+/* Returns device name (e.g. "sdc") on success, or NULL
+ * on failure.
+ */
+char *
+virSCSIDeviceGetDevName(const char *adapter,
+ unsigned int bus,
+ unsigned int target,
+ unsigned int unit)
+{
+ DIR *dir = NULL;
+ struct dirent *entry;
+ char *path = NULL;
+ char *name = NULL;
+ unsigned int adapter_id;
+
+ if (virSCSIDeviceGetAdapterId(adapter, &adapter_id) < 0)
+ return NULL;
+
+ if (virAsprintf(&path,
+ SYSFS_SCSI_DEVICES "/%d:%d:%d:%d/block",
+ adapter_id, bus, target, unit) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+
+ if (!(dir = opendir(path))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to open %s"), path);
+ goto cleanup;
+ }
+
+ while ((entry = readdir(dir))) {
+ if (entry->d_name[0] == '.')
+ continue;
+
+ if (!(name = strdup(entry->d_name))) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ }
+
+cleanup:
+ closedir(dir);
+ VIR_FREE(path);
+ return name;
+}
+
virSCSIDevicePtr
virSCSIDeviceNew(const char *adapter,
unsigned int bus,
diff --git a/src/util/virscsi.h b/src/util/virscsi.h
index 8268cdf..cce5df4 100644
--- a/src/util/virscsi.h
+++ b/src/util/virscsi.h
@@ -37,6 +37,10 @@ char *virSCSIDeviceGetSgName(const char *adapter,
unsigned int bus,
unsigned int target,
unsigned int unit);
+char *virSCSIDeviceGetDevName(const char *adapter,
+ unsigned int bus,
+ unsigned int target,
+ unsigned int unit);
virSCSIDevicePtr virSCSIDeviceNew(const char *adapter,
unsigned int bus,
--
1.8.1.4