chiark / gitweb /
cdrom_id: suppress ID_CDROM_MEDIA_STATE=blank for plain non-writable CDROM media
authorKay Sievers <kay.sievers@vrfy.org>
Mon, 25 May 2009 22:50:45 +0000 (00:50 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Mon, 25 May 2009 22:50:45 +0000 (00:50 +0200)
Some broken fake cdrom drives return ID_CDROM_MEDIA_STATE=blank.

  $ /lib/udev/cdrom_id -d /dev/sr1
  main: probing: '/dev/sr1'
  cd_inquiry: INQUIRY: [Nokia   ][S60             ][1.0 ]
  cd_profiles: GET CONFIGURATION: number of profiles 76
  cd_profiles: current profile 0x08
  cd_media_toc: READ TOC: len: 12
  cd_media_toc: last track 1 starts at block 0
  cd_media_info: disk type 00
  ID_CDROM=1
  ID_CDROM_MRW=1
  ID_CDROM_MRW_W=1
  ID_CDROM_MEDIA=1
  ID_CDROM_MEDIA_CD=1
  ID_CDROM_MEDIA_STATE=blank

Others work fine, but ID_CDROM_MEDIA_STATE is not needed for non-writable CDROM media:

  $ /lib/udev/cdrom_id -d /dev/sr1
  main: probing: '/dev/sr1'
  cd_inquiry: INQUIRY: [SanDisk ][U3 Cruzer Micro ][8.02]
  cd_profiles: GET CONFIGURATION: number of profiles 72
  cd_profiles: current profile 0x08
  cd_media_toc: READ TOC: len: 20
  cd_media_toc: track=1 info=0x4(data) start_block=0
  cd_media_toc: last track 1 starts at block 0
  cd_media_info: disk type 00
  ID_CDROM=1
  ID_CDROM_MRW=1
  ID_CDROM_MRW_W=1
  ID_CDROM_MEDIA=1
  ID_CDROM_MEDIA_CD=1
  ID_CDROM_MEDIA_STATE=complete
  ID_CDROM_MEDIA_SESSION_COUNT=1
  ID_CDROM_MEDIA_TRACK_COUNT=1
  ID_CDROM_MEDIA_TRACK_COUNT_DATA=1

extras/cdrom_id/cdrom_id.c

index 0d873ae8e5f847eaba7df3d0bc6cc846e948a75d..921e5346c920f2d10d168c9e97c58d4e196af3be 100644 (file)
@@ -426,8 +426,10 @@ static int cd_media_info(struct udev *udev, int fd)
 
        info(udev, "disk type %02x\n", header[8]);
 
 
        info(udev, "disk type %02x\n", header[8]);
 
-       if ((header[2] & 3) < 4)
+       /* exclude plain CDROM, some fake cdroms return 0 for "blank" media here */
+       if (!cd_media_cd_rom && (header[2] & 3) < 4)
                cd_media_state = media_status[header[2] & 3];
                cd_media_state = media_status[header[2] & 3];
+
        if ((header[2] & 3) != 2)
                cd_media_session_next = header[10] << 8 | header[5];
        cd_media_session_count = header[9] << 8 | header[4];
        if ((header[2] & 3) != 2)
                cd_media_session_next = header[10] << 8 | header[5];
        cd_media_session_count = header[9] << 8 | header[4];