mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 11:31:16 +00:00
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: Peter Krempa <pkrempa@redhat.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
a33a3b1006
commit
f3282d1f9b
@ -1781,6 +1781,7 @@ virFileGetMountSubtree;
|
|||||||
virFileHasSuffix;
|
virFileHasSuffix;
|
||||||
virFileInData;
|
virFileInData;
|
||||||
virFileIsAbsPath;
|
virFileIsAbsPath;
|
||||||
|
virFileIsCDROM;
|
||||||
virFileIsDir;
|
virFileIsDir;
|
||||||
virFileIsExecutable;
|
virFileIsExecutable;
|
||||||
virFileIsLink;
|
virFileIsLink;
|
||||||
|
@ -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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#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 {
|
|||||||
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,
|
||||||
|
Loading…
Reference in New Issue
Block a user