提交 f3282d1f 编写于 作者: P Peter Krempa

util: file: Add helper to determine whether a path is a CDROM

Add detection mechanism which will allow to check whether a path to a
block device is a physical CDROM drive. This will be useful once we will
need to pass it to hypervisors.

The linux implementation uses an ioctl to do the detection, while the
fallback uses a simple string prefix match.
Signed-off-by: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NJohn Ferlan <jferlan@redhat.com>
上级 a33a3b10
...@@ -1781,6 +1781,7 @@ virFileGetMountSubtree; ...@@ -1781,6 +1781,7 @@ virFileGetMountSubtree;
virFileHasSuffix; virFileHasSuffix;
virFileInData; virFileInData;
virFileIsAbsPath; virFileIsAbsPath;
virFileIsCDROM;
virFileIsDir; virFileIsDir;
virFileIsExecutable; virFileIsExecutable;
virFileIsLink; virFileIsLink;
......
...@@ -59,8 +59,9 @@ ...@@ -59,8 +59,9 @@
# include <sys/statfs.h> # include <sys/statfs.h>
# if HAVE_DECL_LO_FLAGS_AUTOCLEAR # if HAVE_DECL_LO_FLAGS_AUTOCLEAR
# include <linux/loop.h> # include <linux/loop.h>
# include <sys/ioctl.h>
# endif # endif
# include <sys/ioctl.h>
# include <linux/cdrom.h>
#endif #endif
#include "configmake.h" #include "configmake.h"
...@@ -1938,6 +1939,59 @@ int virFileIsMountPoint(const char *file) ...@@ -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 #if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R
static int static int
virFileGetMountSubtreeImpl(const char *mtabpath, virFileGetMountSubtreeImpl(const char *mtabpath,
......
...@@ -207,6 +207,8 @@ enum { ...@@ -207,6 +207,8 @@ enum {
int virFileIsSharedFSType(const char *path, int fstypes) ATTRIBUTE_NONNULL(1); int virFileIsSharedFSType(const char *path, int fstypes) ATTRIBUTE_NONNULL(1);
int virFileIsSharedFS(const char *path) ATTRIBUTE_NONNULL(1); int virFileIsSharedFS(const char *path) ATTRIBUTE_NONNULL(1);
int virFileIsMountPoint(const char *file) 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, int virFileGetMountSubtree(const char *mtabpath,
const char *prefix, const char *prefix,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册