chiark / gitweb /
Always open the cdrom drive in non-blocking mode in cdrom_id
[elogind.git] / extras / cdrom_id / cdrom_id.c
index 7d97d0b07bd007040028c6f7af26cb9e37f7472a..c561112d3063f72d697e2aa2d8d7415b7a959a50 100644 (file)
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <linux/types.h>
-#include <linux/cdrom.h>
 
 #include "../../logging.h"
 #include "../../udev_utils.h"
 
+/*
+ * Taken from the cdrom.h kernel include file.
+ * Included here as some distros don't have an updated version
+ * with all of the DVD flags.  So we just include our own, aren't
+ * we so nice...
+ */
+#define CDROM_GET_CAPABILITY   0x5331  /* get capabilities */
+
+/* capability flags used with the uniform CD-ROM driver */
+#define CDC_CLOSE_TRAY         0x1     /* caddy systems _can't_ close */
+#define CDC_OPEN_TRAY          0x2     /* but _can_ eject.  */
+#define CDC_LOCK               0x4     /* disable manual eject */
+#define CDC_SELECT_SPEED       0x8     /* programmable speed */
+#define CDC_SELECT_DISC                0x10    /* select disc from juke-box */
+#define CDC_MULTI_SESSION      0x20    /* read sessions>1 */
+#define CDC_MCN                        0x40    /* Medium Catalog Number */
+#define CDC_MEDIA_CHANGED      0x80    /* media changed */
+#define CDC_PLAY_AUDIO         0x100   /* audio functions */
+#define CDC_RESET              0x200   /* hard reset device */
+#define CDC_IOCTLS             0x400   /* driver has non-standard ioctls */
+#define CDC_DRIVE_STATUS       0x800   /* driver implements drive status */
+#define CDC_GENERIC_PACKET     0x1000  /* driver implements generic packets */
+#define CDC_CD_R               0x2000  /* drive is a CD-R */
+#define CDC_CD_RW              0x4000  /* drive is a CD-RW */
+#define CDC_DVD                        0x8000  /* drive is a DVD */
+#define CDC_DVD_R              0x10000 /* drive can write DVD-R */
+#define CDC_DVD_RAM            0x20000 /* drive can write DVD-RAM */
+#define CDC_MO_DRIVE           0x40000 /* drive is an MO device */
+#define CDC_MRW                        0x80000 /* drive can read MRW */
+#define CDC_MRW_W              0x100000 /* drive can write MRW */
+#define CDC_RAM                        0x200000 /* ok to open for WRITE */
+
 #ifdef USE_LOG
 void log_message(int priority, const char *format, ...)
 {
@@ -81,44 +112,41 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
-       fd = open(node, O_RDONLY);
-       if (fd < 0)
-               if (errno == ENOMEDIUM)
-                       fd = open(node, O_RDONLY|O_NONBLOCK);
+       fd = open(node, O_RDONLY|O_NONBLOCK);
        if (fd < 0) {
                err("unable to open '%s'", node);
                rc = 1;
                goto exit;
        }
 
-       result = ioctl(fd, CDROM_GET_CAPABILITY);
+       result = ioctl(fd, CDROM_GET_CAPABILITY, NULL);
        if (result < 0) {
                err("CDROM_GET_CABILITY failed for '%s'", node);
                rc = 3;
                goto close;
        }
 
-       printf("ID_CDC=true\n");
+       printf("ID_CDROM=1\n");
 
        if (result & CDC_CD_R)
-               printf("ID_CDC_CD_R=true\n");
+               printf("ID_CDROM_CD_R=1\n");
        if (result & CDC_CD_RW)
-               printf("ID_CDC_CD_RW=true\n");
+               printf("ID_CDROM_CD_RW=1\n");
 
        if (result & CDC_DVD)
-               printf("ID_CDC_DVD=true\n");
+               printf("ID_CDROM_DVD=1\n");
        if (result & CDC_DVD_R)
-               printf("ID_CDC_DVD_R=true\n");
+               printf("ID_CDROM_DVD_R=1\n");
        if (result & CDC_DVD_RAM)
-               printf("ID_CDC_DVD_RAM=true\n");
+               printf("ID_CDROM_DVD_RAM=1\n");
 
        if (result & CDC_MRW)
-               printf("ID_CDC_MRW=true\n");
+               printf("ID_CDROM_MRW=1\n");
        if (result & CDC_MRW_W)
-               printf("ID_CDC_MRW_W=true\n");
-       
+               printf("ID_CDROM_MRW_W=1\n");
+
        if (result & CDC_RAM)
-               printf("ID_CDC_RAM=true\n");
+               printf("ID_CDROM_RAM=1\n");
        goto close;
 
 close: