chiark / gitweb /
rule-generator: net - whitelist NICs that violate MAC local scheme
[elogind.git] / extras / cdrom_id / cdrom_id.c
index 627ae0dee4f7a4897a93abbb3beb41912e4b42f2..0d873ae8e5f847eaba7df3d0bc6cc846e948a75d 100644 (file)
 
 #include "../../udev/udev.h"
 
-#ifndef ARRAY_SIZE
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
-#endif
-
 static int debug;
 
 static void log_fn(struct udev *udev, int priority,
@@ -80,6 +76,7 @@ static unsigned int cd_mrw;
 static unsigned int cd_mrw_w;
 
 /* media info */
+static unsigned int cd_media;
 static unsigned int cd_media_cd_rom;
 static unsigned int cd_media_cd_r;
 static unsigned int cd_media_cd_rw;
@@ -200,6 +197,16 @@ static int cd_capability_compat(struct udev *udev, int fd)
        return 0;
 }
 
+static int cd_media_compat(struct udev *udev, int fd)
+{
+       if (ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT) != CDS_DISC_OK) {
+               info(udev, "CDROM_DRIVE_STATUS != CDS_DISC_OK\n");
+               return -1;
+       }
+       cd_media = 1;
+       return 0;
+}
+
 static int cd_inquiry(struct udev *udev, int fd) {
        struct scsi_cmd sc;
        unsigned char inq[128];
@@ -329,6 +336,8 @@ static int cd_profiles(struct udev *udev, int fd)
                return -1;
        }
 
+       cd_media = 1;
+
        switch (cur_profile) {
        case 0x03:
        case 0x04:
@@ -503,9 +512,9 @@ int main(int argc, char *argv[])
 {
        struct udev *udev;
        static const struct option options[] = {
-               { "export", 0, NULL, 'x' },
-               { "debug", 0, NULL, 'd' },
-               { "help", 0, NULL, 'h' },
+               { "export", no_argument, NULL, 'x' },
+               { "debug", no_argument, NULL, 'd' },
+               { "help", no_argument, NULL, 'h' },
                {}
        };
        const char *node = NULL;
@@ -570,11 +579,13 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
-       /* check drive */
-       if (cd_inquiry(udev, fd) < 0) {
-               rc = 2;
-               goto exit;
-       }
+       /* check for media */
+       if (cd_media_compat(udev, fd) < 0)
+               goto print;
+
+       /* check if drive talks MMC */
+       if (cd_inquiry(udev, fd) < 0)
+               goto print;
 
        /* read drive and possibly current profile */
        if (cd_profiles(udev, fd) < 0)
@@ -631,6 +642,8 @@ print:
        if (cd_mrw_w)
                printf("ID_CDROM_MRW_W=1\n");
 
+       if (cd_media)
+               printf("ID_CDROM_MEDIA=1\n");
        if (cd_media_mo)
                printf("ID_CDROM_MEDIA_MO=1\n");
        if (cd_media_mrw)