Attempt at raw drive access for linux / osx, test please :)

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2410 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
LPFaint99 2009-02-24 07:30:10 +00:00
parent 772e37be9a
commit 5dfbb9438e
6 changed files with 67 additions and 32 deletions

View file

@ -30,6 +30,9 @@
#include <dirent.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/cdrom.h>
#endif
#include <fstream>
@ -72,11 +75,33 @@ bool Exists(const char *filename)
bool IsDisk(const char *filename)
{
#ifdef _WIN32
std::string copy = filename;
if (copy.size() < 4 && copy.c_str()[1] == ':')
if (GetDriveType(filename) == DRIVE_CDROM) // CD_ROM also applies to DVD. Noone has a plain CDROM without DVD anymore so we should be fine.
return true;
#else
// TODO: add linux \ osx
struct stat statInfo;
if((stat(filename, &statInfo) > -1) && (S_ISCHR(statInfo.st_mode) || S_ISBLK(statInfo.st_mode)))
{
int fileHandle;
// try to open the device
fileHandle = open(filename, O_RDONLY | O_NONBLOCK, 0);
if (fileHandle >= 0)
{
cdrom_subchnl cdChannelInfo;
cdChannelInfo.cdsc_format = CDROM_MSF;
if ((ioctl(fileHandle, CDROMSUBCHNL, &cdChannelInfo) == 0) ||
(errno == EIO) || (errno == ENOENT) ||
(errno == EINVAL)
#ifdef __GNUC__
|| (errno == ENOMEDIUM)
#endif
)
{
return true;
}
close(fileHandle);
}
}
#endif
return false;
}