Merge pull request #507 from whipper-team/bugfix/issue-385-missing-cd-warning
Provide better error message when there's no CD in the drive
This commit is contained in:
@@ -94,6 +94,9 @@ class _CD(BaseCommand):
|
||||
|
||||
utils.load_device(self.device)
|
||||
utils.unmount_device(self.device)
|
||||
# Exit and inform the user if there's no CD in the disk drive
|
||||
if drive.get_cdrom_drive_status(self.device): # rc == 1 means no disc
|
||||
raise OSError("no CD detected, please insert one and retry")
|
||||
|
||||
# first, read the normal TOC, which is fast
|
||||
self.ittoc = self.program.getFastToc(self.runner, self.device)
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
# along with whipper. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
from fcntl import ioctl
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -69,3 +70,29 @@ def getDeviceInfo(path):
|
||||
_, vendor, model, release = device.get_hwinfo()
|
||||
|
||||
return vendor, model, release
|
||||
|
||||
|
||||
def get_cdrom_drive_status(drive_path):
|
||||
"""
|
||||
Get the status of the disc drive.
|
||||
|
||||
Drive status possibilities returned by CDROM_DRIVE_STATUS ioctl:
|
||||
- CDS_NO_INFO = 0 (if not implemented)
|
||||
- CDS_NO_DISC = 1
|
||||
- CDS_TRAY_OPEN = 2
|
||||
- CDS_DRIVE_NOT_READY = 3
|
||||
- CDS_DISC_OK = 4
|
||||
|
||||
Documentation here:
|
||||
- https://www.kernel.org/doc/Documentation/ioctl/cdrom.txt
|
||||
- https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/cdrom.h # noqa: E501
|
||||
|
||||
:param drive_path: path to the disc drive
|
||||
:type device: str
|
||||
:returns: return code of the 'CDROM_DRIVE_STATUS' ioctl
|
||||
:rtype: int
|
||||
"""
|
||||
fd = os.open(drive_path, os.O_RDONLY | os.O_NONBLOCK)
|
||||
rc = ioctl(fd, 0x5326) # AKA 'CDROM_DRIVE_STATUS'
|
||||
os.close(fd)
|
||||
return rc
|
||||
|
||||
Reference in New Issue
Block a user