Hi,
I'm using the ubuntu version of Linux and C++. I'm trying to use ioctl to detect the status of the cdrom drive. according to the documentation
http://www.mjmwired.net/kernel/Documentation/ioctl/cdrom.txt (line 682) CDROM_DRIVE_STATUS should return one of 5 states:
CDS_NO_INFO
CDS_NO_DISC
CDS_TRAY_OPEN
CDS_DRIVE_NOT_READY
CDS_DISC_OK
I have only been able to detect two states: CDS_DISC_OK and CDS_TRAY_OPEN. I'm getting CDS_TRAY_OPEN when there is no disc in the drive, even when the tray is closed. I need to know if the tray is closed but there is no disc in the drive. Is there something I'm doing wrong (my code is below)?
Thanks,
Nick
#include <sys/ioctl.h>
#include <iostream>
#include <fstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/cdrom.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
using std::cout;
using std::endl;
int main(char** argv)
{
int fd;
int ret,d;
while(1)
{
if ((fd = open("/dev/cdrom",O_RDONLY
| O_NONBLOCK)) < 0) {
perror("open");
exit(1);
}
ret = ioctl(fd,CDROM_DRIVE_STATU
S,0);
cout<<ret<<endl;
switch(ret) {
case CDS_NO_INFO:
cout<<"CDS_NO_INFO"<<endl;
break;
case CDS_NO_DISC:
cout<<"CDS_NO_DISC"<<endl;
break;
case CDS_TRAY_OPEN:
cout<<"CDS_TRAY_OPEN"<<end
l;
d = ioctl(fd,CDROM_DISC_STATUS
,0);
cout<<d<<endl;
break;
case CDS_DRIVE_NOT_READY:
cout<<"CDS_DRIVE_NOT_READY
"<<endl;
break;
case CDS_DISC_OK:
cout<<"CDS_DISC_OK"<<endl;
d = ioctl(fd,CDROM_DISC_STATUS
,0);
cout<<d<<endl;
switch(d){
case CDS_NO_INFO:
cout<<"CDS_NO_INFO"<<endl;
break;
case CDS_AUDIO:
cout<<"CDS_AUDIO"<<endl;
break;
case CDS_XA_2_2:
cout<<"CDS_XA_2_2"<<endl;
break;
case CDS_XA_2_1:
cout<<"CDS_XA_2_1"<<endl;
break;
case CDS_DATA_1:
cout<<"CDS_DATA_1"<<endl;
break;
case CDS_MIXED:
cout<<"CDS_MIXED"<<endl;
break;
default:
cout<<"SUPER ERROR 2"<<endl;
}
break;
case -1:
cout<<"ERROR"<<endl;
cout<<errno<<endl;
switch(errno) {
case ENOSYS:
cout<<"ENOSYS"<<endl;
break;
case EINVAL:
cout<<"EINVAL"<<endl;
break;
case ENOMEM:
cout<<"ENOMEM"<<endl;
break;
default:
cout<<"ERRNO ERROR"<<endl;
}
break;
default:
cout<<"SUPER ERROR"<<endl;
}
usleep(100);
}
return 0;
}
Start Free Trial