summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--platform-intel.c61
-rw-r--r--platform-intel.h3
2 files changed, 64 insertions, 0 deletions
diff --git a/platform-intel.c b/platform-intel.c
index 6cd5830..03e4ba7 100644
--- a/platform-intel.c
+++ b/platform-intel.c
@@ -176,3 +176,64 @@ const struct imsm_orom *find_imsm_orom(void)
return &imsm_orom;
return NULL;
}
+
+char *devt_to_devpath(dev_t dev)
+{
+ char device[40];
+
+ sprintf(device, "/sys/dev/block/%d:%d/device", major(dev), minor(dev));
+ return canonicalize_file_name(device);
+}
+
+static char *diskfd_to_devpath(int fd)
+{
+ /* return the device path for a disk, return NULL on error or fd
+ * refers to a partition
+ */
+ struct stat st;
+
+ if (fstat(fd, &st) != 0)
+ return NULL;
+ if (!S_ISBLK(st.st_mode))
+ return NULL;
+
+ return devt_to_devpath(st.st_rdev);
+}
+
+int path_attached_to_hba(const char *disk_path, const char *hba_path)
+{
+ int rc;
+
+ if (!disk_path || !hba_path)
+ return 0;
+
+ if (strncmp(disk_path, hba_path, strlen(hba_path)) == 0)
+ rc = 1;
+ else
+ rc = 0;
+
+ return rc;
+}
+
+int devt_attached_to_hba(dev_t dev, const char *hba_path)
+{
+ char *disk_path = devt_to_devpath(dev);
+ int rc = path_attached_to_hba(disk_path, hba_path);
+
+ if (disk_path)
+ free(disk_path);
+
+ return rc;
+}
+
+int disk_attached_to_hba(int fd, const char *hba_path)
+{
+ char *disk_path = diskfd_to_devpath(fd);
+ int rc = path_attached_to_hba(disk_path, hba_path);
+
+ if (disk_path)
+ free(disk_path);
+
+ return rc;
+}
+
diff --git a/platform-intel.h b/platform-intel.h
index 9252002..c126482 100644
--- a/platform-intel.h
+++ b/platform-intel.h
@@ -87,3 +87,6 @@ struct sys_dev *find_driver_devices(const char *bus, const char *driver);
__u16 devpath_to_vendor(const char *dev_path);
void free_sys_dev(struct sys_dev **list);
const struct imsm_orom *find_imsm_orom(void);
+int disk_attached_to_hba(int fd, const char *hba_path);
+char *devt_to_devpath(dev_t dev);
+int path_attached_to_hba(const char *disk_path, const char *hba_path);