Provide better error message when there's no CD in the drive

Fixes #385.

Signed-off-by: JoeLametta <JoeLametta@users.noreply.github.com>
This commit is contained in:
JoeLametta
2020-09-17 19:18:27 +00:00
parent 3acc3ffed6
commit 921e25bf98
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