utils: Add a helper to get the device name that sg device mapped to

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.
This commit is contained in:
Osier Yang 2013-05-04 02:07:36 +08:00
parent 539d0e19fd
commit 28d3ad952f
3 changed files with 52 additions and 0 deletions

View File

@ -1730,6 +1730,7 @@ virSCSIDeviceFileIterate;
virSCSIDeviceFree;
virSCSIDeviceGetAdapter;
virSCSIDeviceGetBus;
virSCSIDeviceGetDevName;
virSCSIDeviceGetName;
virSCSIDeviceGetReadonly;
virSCSIDeviceGetSgName;

View File

@ -142,6 +142,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,

View File

@ -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,