Add enum type of cdrom statuses. Add argument cd_status in
virFileCheckCDROM to store cdrom status.
Now virFileCheckCDROM could be used to check the cdrom drive status such
as no info, no disc, trey open, drive not ready or ok.

Signed-off-by: Han Han <h...@redhat.com>
---
 src/libvirt_private.syms |  2 +-
 src/qemu/qemu_domain.c   |  4 ++--
 src/util/virfile.c       | 44 ++++++++++++++++++++++++++++++++++------
 src/util/virfile.h       | 11 +++++++++-
 4 files changed, 51 insertions(+), 10 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index e688981c3e..b03e1f15a7 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1811,7 +1811,7 @@ virFileGetMountSubtree;
 virFileHasSuffix;
 virFileInData;
 virFileIsAbsPath;
-virFileIsCDROM;
+virFileCheckCDROM;
 virFileIsDir;
 virFileIsExecutable;
 virFileIsLink;
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index ed76495309..f443eb4d8f 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -7487,7 +7487,7 @@ void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver,
 
     if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM &&
         virStorageSourceGetActualType(disk->src) == VIR_STORAGE_TYPE_BLOCK &&
-        disk->src->path && virFileIsCDROM(disk->src->path) == 1)
+        disk->src->path && virFileCheckCDROM(disk->src->path, NULL) == 1)
         qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_CDROM_PASSTHROUGH,
                            logCtxt);
 
@@ -8394,7 +8394,7 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
         if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM &&
             src->format == VIR_STORAGE_FILE_RAW &&
             virStorageSourceIsBlockLocal(src) &&
-            virFileIsCDROM(src->path) == 1)
+            virFileCheckCDROM(src->path, NULL) == 1)
             src->hostcdrom = true;
 
         ret = 0;
diff --git a/src/util/virfile.c b/src/util/virfile.c
index 378d03ecf0..a2199e6a97 100644
--- a/src/util/virfile.c
+++ b/src/util/virfile.c
@@ -1990,19 +1990,21 @@ int virFileIsMountPoint(const char *file)
 
 #if defined(__linux__)
 /**
- * virFileIsCDROM:
+ * virFileCheckCDROM:
  * @path: File to check
+ * @cd_status: Ptr to store CDROM status; Not to store status if NULL
  *
  * Returns 1 if @path is a cdrom device 0 if it is not a cdrom and -1 on
  * error. 'errno' of the failure is preserved and no libvirt errors are
  * reported.
  */
 int
-virFileIsCDROM(const char *path)
+virFileCheckCDROM(const char *path, int *cd_status)
 {
     struct stat st;
     int fd;
     int ret = -1;
+    int *status;
 
     if ((fd = open(path, O_RDONLY | O_NONBLOCK)) < 0)
         goto cleanup;
@@ -2016,10 +2018,40 @@ virFileIsCDROM(const char *path)
     }
 
     /* Attempt to detect via a CDROM specific ioctl */
-    if (ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT) >= 0)
-        ret = 1;
-    else
+    *status = ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT);
+
+    if (cd_status == NULL) {
+        if (*status >= 0)
+            ret = 1;
+        else
+            ret = 0;
+        goto cleanup;
+    }
+
+    if (*status < 0) {
         ret = 0;
+        goto cleanup;
+    }
+
+    switch (*status) {
+        case CDS_NO_INFO:
+            *cd_status = VIR_FILE_CDROM_NO_INFO;
+            break;
+        case CDS_NO_DISC:
+            *cd_status = VIR_FILE_CDROM_NO_DISC;
+            break;
+        case CDS_TRAY_OPEN:
+            *cd_status = VIR_FILE_CDROM_TREY_OPEN;
+            break;
+        case CDS_DRIVE_NOT_READY:
+            *cd_status = VIR_FILE_CDROM_DRIVE_NOT_READY;
+            break;
+        case CDS_DISC_OK:
+            *cd_status = VIR_FILE_CDROM_DISC_OK;
+            break;
+    }
+
+    ret = 1;
 
  cleanup:
     VIR_FORCE_CLOSE(fd);
@@ -2029,7 +2061,7 @@ virFileIsCDROM(const char *path)
 #else
 
 int
-virFileIsCDROM(const char *path)
+virFileCheckCDROM(const char *path, int *cd_status)
 {
     if (STRPREFIX(path, "/dev/cd") ||
         STRPREFIX(path, "/dev/acd"))
diff --git a/src/util/virfile.h b/src/util/virfile.h
index 6f1e802fde..e06ccd8f9f 100644
--- a/src/util/virfile.h
+++ b/src/util/virfile.h
@@ -210,7 +210,16 @@ enum {
 int virFileIsSharedFSType(const char *path, int fstypes) ATTRIBUTE_NONNULL(1);
 int virFileIsSharedFS(const char *path) ATTRIBUTE_NONNULL(1);
 int virFileIsMountPoint(const char *file) ATTRIBUTE_NONNULL(1);
-int virFileIsCDROM(const char *path)
+
+enum {
+    VIR_FILE_CDROM_DISC_OK = 1,
+    VIR_FILE_CDROM_NO_INFO,
+    VIR_FILE_CDROM_NO_DISC,
+    VIR_FILE_CDROM_TREY_OPEN,
+    VIR_FILE_CDROM_DRIVE_NOT_READY,
+};
+
+int virFileCheckCDROM(const char *path)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
 
 int virFileGetMountSubtree(const char *mtabpath,
-- 
2.17.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to