diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 92b5e0fa2b..f8883dc50d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1781,6 +1781,7 @@ virFileGetMountSubtree; virFileHasSuffix; virFileInData; virFileIsAbsPath; +virFileIsCDROM; virFileIsDir; virFileIsExecutable; virFileIsLink; diff --git a/src/util/virfile.c b/src/util/virfile.c index d1dd35db1c..ea2a3ea731 100644 --- a/src/util/virfile.c +++ b/src/util/virfile.c @@ -59,8 +59,9 @@ # include # if HAVE_DECL_LO_FLAGS_AUTOCLEAR # include -# include # endif +# include +# include #endif #include "configmake.h" @@ -1938,6 +1939,59 @@ int virFileIsMountPoint(const char *file) } +#if defined(__linux__) +/** + * virFileIsCDROM: + * @path: File to check + * + * 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) +{ + struct stat st; + int fd; + int ret = -1; + + if ((fd = open(path, O_RDONLY | O_NONBLOCK)) < 0) + goto cleanup; + + if (fstat(fd, &st) < 0) + goto cleanup; + + if (!S_ISBLK(st.st_mode)) { + ret = 0; + goto cleanup; + } + + /* Attempt to detect via a CDROM specific ioctl */ + if (ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT) >= 0) + ret = 1; + else + ret = 0; + + cleanup: + VIR_FORCE_CLOSE(fd); + return ret; +} + +#else + +int +virFileIsCDROM(const char *path) +{ + if (STRPREFIX(path, "/dev/cd", NULL) || + STRPREFIX(path, "/dev/acd", NULL)) + return 1; + + return 0; +} + +#endif /* defined(__linux__) */ + + #if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R static int virFileGetMountSubtreeImpl(const char *mtabpath, diff --git a/src/util/virfile.h b/src/util/virfile.h index 341320b3d3..6b0cbad4d1 100644 --- a/src/util/virfile.h +++ b/src/util/virfile.h @@ -207,6 +207,8 @@ 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) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; int virFileGetMountSubtree(const char *mtabpath, const char *prefix,