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:
JoeLametta
2020-09-23 19:52:50 +02:00
committed by GitHub
2 changed files with 30 additions and 0 deletions

View File

@@ -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)

View File

@@ -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