IDE-CDɥ饤Ф˴ؤʸ
ܤ scott snyder <snyder@fnald0.fnal.gov>ˤΤǤ(1996ǯ519)
ѤΤ: Erik Andersen <andersee@debian.org> Ǥ
ƥʤ (1998ǯ1019): Jens Axboe <axboe@image.dk> Ǥ

1. Ϥ
---------------

ide-cd ɥ饤ФϡIDE 󥿥ե³줿 ATAPI ver1.2 ATAPI2.6
˽򤹤 CDROM ɥ饤֤ФƵǽޤĤ CDROM ٥( Mitsumi
SonyCreativeAztechGoldstar)ATAPI Υɥ饤ФȼΥɥ饤Фξ
äƤ뤳ȤդƤʤΥɥ饤֤äȼΥ
եѤΤʤ顢Υɥ饤ФưʤǤ礦(ۤ
CDROMɥ饤ФΤΤҤȤĤư⤷ޤ)  Υɥ饤Фϥѥ
ݡȤ³ `ATAPI'ɥ饤֤ǤưʤǤ礦  IDE ݡȤ³
ΤATAPIǤϤʤɥ饤֤ʤȤ1Ĥޤ(CyCDROM CR520ie)
ݤΥɥ饤ФϤΤ褦ʥɥ饤֤ФƤưʤǤ礦(Ǥ the 
aztcd driver 򸫤Ƥ)

Υɥ饤ФϼΤ褦ʵǽ󶡤ޤ:

- ǡȥåɤ߹ߤ ISO9660ե륷ƥΥޥ

- ǥȥåαաȤƤ CDROM ץ쥤䡼ץबư
  礦 ݻϤĤ Workman ȤäƤޤ

- ޥå󥵥ݡ

- ݡȤƤɥ饤־ǤΥǥ륪ǥǡľɤ߹ߡ
  ץ cdda2wav ϤΤ˻ȤޤǤºݤˤϤĤΥɥ饤
  ֤ݡȤƤȤȤդƤ

- ATAPI2.6˽򤷤Ƥ CDROM 󥸥ФƸߥݡȤޤ
  ɲõǽϡɤΥåȤ򤵤Ƥ륹åȤʤΤ䤦ե
  󥳡ɤΥåȤ CD äƤΤ䤦ե󥯥󥳡
  ޤǤޤ  εǽ¾ڤ뤿ΥץץϤΥե
  ǸˤĤƤޤ Sanyo 3-disk 󥸥(ɸ˽򤷤Ƥޤ)⺣
  ݡȤƤޤ
  ɥ饤Фǽ CD 򥹥å#0ȹͤ뤳ȤդƤƤ


2 .󥹥ȡ
---------------

0. ide-cd ϡide ǥɥ饤Ф˰¸Ƥޤ ide ɥ饤Ф˴ؤǿ
   Ǥ Documentation/ide.txt ɤǤ

1. ide  ide-cd ɥ饤ФʤλѤƤ륫ͥԽƤ뤫ɤ
   ǧƤ ͥ򤷤ƤȤ "Floppy, IDE, and other 
   block devices" ȤȥΤĤǡΥץ `Y'(ݡȤ
   ľܥͥȹߤޤ)  `M'(ɤꥢɤꤹ뤳ȤΤǤ
   ⥸塼ȤƥݡȤȹߤޤ)Τɤ餫򤷤ޤ:

       Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
       Include IDE/ATAPI CDROM support

   

       Use old disk-only driver on primary interface

    `no' ˤƤƤ

   ʤɤʥפ IDE 󥿥եäƤ뤫ˤäơɲäι
   ץꤹɬפ뤫ΤޤDocumentation/ide.txt ɤ
   

2. iso9660 ե륷ƥबͥȹޤƤ롢⤷ϥɲǽ
   ⥸塼ȤƻѤǤ褦ˤʤäƤ뤫ǧޤ礦
   cat /proc/filesystems ǡե륷ƥबͥǧƤ뤫Ĵ
   ٤뤳ȤǤޤ

3. CDROM ɥ饤֤ IDE 󥿥եΥۥȤ³Ǥ礦ƥ
   γƥ󥿥եϡI/O ݡȥɥ쥹 IRQ ֹˤäƤ
   ץ饤ޥꥤ󥿥ե 0x17014ꥤ󥿥ե 0x1f015
   ɸǳƤƤޤ ƥ󥿥եϡǹ2ĤΥǥХ
   ޤ2Ĥϡϡɥǥɥ饤֡CDROM ɥ饤֡եåԡɥ饤
   ֡ơץɥ饤֤Τɤ줫Ǥ礦 󥿥ե2ĤΥǥХϡ
   `ޥ'`쥤'ȸƤФ졢̾ɥ饤־ΥѤ̤򤹤뤳
   Ǥޤ

   Linux ϡΤȤˤΥǥХ̾Ťޤץ饤ޥ IDE 
   եΥޥȥ쥤֥ǥХϡ줾 `hda' `hdb'ȸƤФޤ
   ꥤ󥿡եΥɥ饤֤ϡ`hdc'`hdd'ȸƤФޤ(¾ξ
   Υ󥿥եϡ3ܤΩ¾ʸˤʤޤ Dodumentation/ide.txt
   ɤǤ)

   CDROM ɥ饤֤ɥ饤ФˤäƼưŪǧΤʤ顢IDE 
   եץ饤ޥȥΤɤΥɥ쥹ȤäƤΤǧ
   ޤ礦 ˡIDE󥿥եΥǥХ CDROM ɥ饤֤ʤ顢
   Ѥ`ޥ'ˤƤޤ礦  (ɤ櫓ˡǥƥ
   ꤬ǤʤȤƤ⡢餯ޤɥ饤ФȤȤǤǤ礦
   Ǥⵯư;ʬʹ򥫡ͥϤʤФʤʤ⤷ޤ
   ä¿ξ뤿 Documentation/ide.txt ɤǤ)

4. ƥεưޤ礦 ɥ饤֤ǧ줿顢ʤϤΤ褦ʥå
   򸫤Ǥ礦

       hdb: NEC CD-ROM DRIVE:260, ATAPI CDROM drive:

   ǧǤʤ褦ʤ顢Υ5򸫤Ƥ

5. ʤϡ¤ΥǥХ򼨤ܥå /dev/cdrom ꤿ
   ޤ ϥޥɤǤǤޤ

       ln -s /dev/hdX /dev/cdrom

   XϡʤΥɥ饤֤ɤ˥󥹥ȡ뤵줿򼨤ʸ֤
   

6. `dmesg'ޥɤǥɥ饤ФΤ륨顼å򸫤뤳ȤǤ
   礦


3. Ūʻˡ
-----------------

ISO9660 CDROM ϡǥɥ饤֤ˤ (root)ʲΤ褦˥פ
ȤǥޥȤޤ

  mount -t iso9660 /dev/cdrom /mnt/cdrom

/dev/cdrom ºݤΥǥХ˥󥯤Ƥ(Υƥå5ǽҤ٤ޤ
)ʤĶǤȲꤷޤ ʤϡߡ/mnt/cdrom ǥ쥯ȥ겼
 CDROM Ƥ򸫤뤳ȤǤǤ礦 CDROM Фʤ顢ǽ˼
Τ褦ʥޥɤǥǥޥȤʤФޤ

  umount /mnt/cdrom

ǥ CD ϥޥȤǤʤȤդƤ

ĤΥǥȥӥ塼ϡCDROM ե륷ƥ򥷥ƥ൯ư˾
˥ޥȤ褦 /etc/fstab ȹǤޤ ˡʤ CDROM Υޥ
Ȥ׵ᤵ뤳ȤϤޤ󤬡CDROM 򤿤ӤӼؤΤʤ顢Ǥ
⤷ޤ/etc/fstab  cdrom ιԤäư CDROM ޥȤ
褦ˤмͳˤʤޤ⤷ä꤬ʤ˹äƤФǤ

ޥåȥե CD Υǥä˲⤷ʤƤưǤ礦
hpcdtoppm ѥå (ftp.gwdg.de:/pub/linux/hpcdtoppm/) ϡե CD ɤ
ΩĤΤޤ

ǥ CD դ뤿ˤϡǽ˥ǡ CDROM 򥢥ޥȤƼ
ʤФʤޤ CDROM ץ쥤ץϤɤǤưǤ礦
(workman, workbone, cdplayer ʤ) ʤä顢Documentation/cdrom/sbpcd
Τʤ cdtester ץबȤǤ礦 

ĤΥɥ饤֤Ǥϡcdda2wav Τ褦ʥץȤäƥǥ륪ǥ
ɤळȤǤޤ 䤬ʹȤΤ롢򥵥ݡȤɥ饤֤ϥˡ
ǤΥɥ饤֤Ǥ ݡȤƤʤɥ饤֤ǤεǽȤȤ
Х顼ˤʤǤ礦

ݡȤ줿󥸥Ǥϡ󥸥㥹åȴ֤ڤؤˡ`cdchange'
ץ(ΥեκǸˤĤƤޤ)ȤȤǤޤ 
˥ɥ饤֤򥢥ޥȤʤФʤʤȤդƤ Υץ
ϡ2ĤΰȤޤ: CDROM ǥХѹåֹǤ
åֹ椬 -1ʤ顢Υɥ饤֤ϥɤޤ


4. ѥ륪ץ
----------------------

ɥ饤Ф򥳥ѥ뤹ȤǤ23ɲåץ󤬤ޤ 
ۤȤɤοͤϤΤɤˤ虜虜ؤɬפϤޤ ݴ
뤿ˤǴñ˥ꥹȤƤޤ ѥ륪ץ 
`define <option> 1'Ȥǡide-cd.c κǽ˽­ȻȤ褦
ʤޤ Υץ󤹤٤ƤϡǥեȤǤ̵ˤʤäƤޤ

VERBOSE_IDE_CD_ERRORS
  ꤹȡATAPI 顼ɤϸʸΤޤޤεҤѴǤ礦
  ˡ顼ޥɤǥפޤ (Ĺ)顼
  ҤΥơ֥ˤäƥ꤬ȤΤɤ˥ǥեȤǤϥդ
  ʤäƤޤ

STANDARD_ATAPI
  ꤹȡATAPI ͤ򤭤ȼƤʤɥ饤֤򰷤ɬ
  ʥɤ̵ˤǤ礦 ʤΥɥ饤֤ ATAPI 򤭤ȼ
  뤳ȤΤäƤʤ顢ʥͥˤ뤿˥ˤ뤳Ȥ
  Ǥޤ

NO_DOOR_LOCKING
  ꤹȡɥ饤ФФ˥ɥ饤֤Υɥå褦ȤʤǤ
  

CDROM_NBLOCKS_BUFFER
  ϡCDROMREADAUDIO ioctl Τ˻ѤХåեΥꤷޤ
  ǥեȤ 8Ǥ

TEST
  ϡǤդΥѥåȥޥɤ¹Բǽˤ桼⡼ɥץ
  ǽˤɲ ioctl Ѳǽˤޤ ܺ٤ϥ򸫤Ƥ
  ʬǲ򤷤ƤΤ򤷤Ƥʤ¤ꡢäƤ٤Ǥ礦


5. Ū
------------------

Ǥϡɥ饤ФȤȤƤȤŪȲˤĤ
ޤ ʤˤ֤ĤäƤʤ顢ŪIDEݡȥɤˤĤ
Ƥθߤξ뤿 Documentation/ide.txt θľ⤷Ǥ
ιܤΤΤĤϡɥ饤ФνСˤŬѤޤ
뤿ˤ˽񤤤Ƥޤ

ۤȤɤξ硢ɥ饤ФΤ륨顼Τ`dmesg'å
Ǥ礦

a. ư˥ɥ饤֤Фޤ

   - configration instructions aboveDocumentation/ide.txt ľ
     ϡɥɤΤ褦˹Ƥ뤫Ĵ٤ޤ礦

   - ɥ饤֤ IDE 󥿥եͣΥǥХǡ⤷ǽʤ顢
     ϥޥˤ٤Ǥ礦

   - IDE 󥿥ե 0x170  0x1f0 ɸΥɥ쥹Ǥʤʤ顢lilo 
     Ȥäơɥ饤ФŪΤ餻ƤɬפǤ礦 
     Documentation/ide.txt ɤǤ (ħϡͥС
     1.3.30ǲäޤ)

   - ɥ饤֤ưǧʤä顢`hdX=cdrom'Ȥ lilo ץ
     λѤˤäơɥ饤֤¸ߤɥ饤Ф˶뤳ȤǤޤ X ϥ
     饤֤Υ󥹥ȡ뤵Ƥɥ饤֤ʸȰפޤ ɥ饤֤¸
     ɥ饤Ф˶ơ֡ȥå˼Τ褦ʤΤФդƲ
     

       hdX: ATAPI cdrom (?)

     ϥɥ饤Фɥ饤֤褯ФȤ̣ΤǤ*ޤ*
      ɤɥ饤Фɥ饤֤򸡽ФʤäΤˡɥ饤֤
     ɥ饤Ф˶ˡɥ饤֤ȿ¬Ƥ뤳Ȥ̣
     ޤ ʤºݤˡºߤʤбƤʤ I/O ɥ쥹ɥ饤
     褦ȤƤΤʤ顢餯 0xff Υ顼ФǤ礦

   - Ĥ IDE ץϡȵǽɸŪǤʤ
     ׵ᤷޤ (줬ξʤ顢餯Υȥˤä
     ̤ MS-DOS ɥ饤ФǤ礦) ɥɾ IDE 󥿥ե
     ϡ褯Υƥʬवޤ 

     ̤ʽɬפʤĤΥ󥿥եؤΥݡȤϡͥ1.3.x
     ʹߤ󶡤Ƥޤ ư˥ͥ˥ץɲä
     Ƥɬפ뤫⤷ޤ Documentation/ide.txtɤǤ

     󥿥եФƥݡȤȤʤȤƤ⡢μ³ư褦
     Ǥ뤫⤷ޤ ǽ MS-DOS ưŬڤʥɥ饤Фɤ
      줫顢linux 򥦥֡Ȥޤ(ĤޤŸȤ)
     ưʤ顢MS-DOS  autoexec  loadlin ¹Ԥ뤳ȤǼư
     ޤ

b. ॢ/IRQ 顼

   - Ĥ⥿ॢȥ顼ˤʤΤʤ顢ۥȤФɥ饤֤γ
     ߤǤƤޤ

   - IRQǤ֡Ȥ `IRQ probe failed (<n>)'Ȥåɽ
     뤫Τޤ <n>ʤ顢ƥब(¹ԲǽIRQ
     )ߤͽꤷƤΤˡߤ򸫤ĤʤäȤ̣
      <n>οʤ顢ƥब CDROM ɥ饤֤1Ĥγߤͽꤷ
     ƤΤˡʣ IRQ 饤ǳߤ򸫤ĤȤ̣ޤ

   - IDE 󥿥ե IRQ ֹ椬ɥ饤ФͽꤷƤΤȰפƤ뤫
     ǧ뤿ˡϡɥƤ (̾γϡ14
     ϥץ饤ޥ(0x170)󥿥ե줫15(0x1f0)
     եȤʤäƤޤ) ƱˡȤȤƤ IRQ Ⱦͤۤ
     ϡɥʤǧƤ ƥ BIOS åȥåפĴ
     ƤߤƤ ݤĤΥåȥåפϸġIRQ٥̵ˤ뤳Ȥ
     ǤޤǥեȤ IRQ15̵ˤƽв٤줿ƥ𤬤
     ޤ

   - ߤΥåȥåפ˴ؤϡɥ꤬äȤƤ⡢¿
     MS-DOS CDROM ɥ饤ФޤưȤդƤ ݤϡ餫
     ߤȤޤ

   - Pioneer DR-A24X äƤʤ顢ư "irq timeout: status=0x50 { 
     DriveReady SeekComplete }"Ȥ褦Բʥ顼åФ*Ǥ
     *Pioneer DR-A24X CDROM ɥ饤֤ϡǶᤫʤݥԥ顼Ǥ Թˤ      Υɥ饤֤ϡɸ
 Linux ATA ǥɥ饤֤θФԤȤˡ
     ˺𤹤褦Ǥ ʤΥɥ饤֤1ĤäƤʤ顢
     lilo.conf  `append="hdX=noprobe hdX=cdrom"'Ƚ񤭲älilo ư
     ˤäơCDROM ɥ饤֤𤵤ATAθФ򤹤뤳ȤǤޤ
     (Ǥ X ϥɥ饤֤Υ󥹥ȡ뤵ƤȤʸ˰פޤ)

c. ƥΥϥ󥰥å

   - CDROM ˥褦ȤȤ˥ƥबåƤޤȤȡǤ
     ꤦ븶ϡ¿ť󥿥եǤƱȥ󥶥Ŭڤ˰
     ʤХ IDE ץλѤǤ礦 ǤⰭ̾⤤Τ CMD640B å
     Ǥ ϥ֡Ȼ `serialize'ץꤷƤ뤳Ȥˤ
     ȯޤ ǶΥͥϡۤȤɤξ硢ưŪˤɬ
     ФǤǤ礦Ф뤳ȤƴñȤ櫓ǤϤޤ
      `serialize'ץ CMD640B ˤĤƤΤä¿ξ뤿
      Documentation/ide.txt ɤǤ

   - ¿ MS-DOS  CDROM ɥ饤ФϤΤ褦ʥХʥϡɥư
     դƤʤʤ餽ϤۤΥǥư CDROM 
     ʣƤߤ褦ȤʤǤ

d. CDROM ޥȤ뤳ȤǤޤ

   - ޥȤ褦Ȥƥ顼Ǥ顢`dmesg'åΤȡɥ饤Ф
     ե륷ƥफŪʥ顼ǤƤ뤫ɤ򸫤뤳Ȥˤ
     뤫⤷ޤ

   - ɥ饤֤ CDROM äƤ뤳ȤȤ CDROM  ISO9660 ǥǤ
     뤳ȤǧƤ ǥ CD ޥȤ뤳ȤϤǤޤ

   - ɥ饤֤äƤ CDROM ФƥޥȤʴǻƤߤ
     

       cat /dev/cdrom | od | more

     פ򸫤뤳ȤǤ顢ɥ饤֤ȥɥ饤ФϤ֤ưƤ
      ϥե륷ƥ٥Ǥ(ĤޤꡢCDROM  ISO9660 ʤ
     ե륷ƥ๽¤˥顼ޤ)

   - `not a block device'顼Ǥ顢ǥХ̤ʥե
     åƤ ΤȤǤ٤Ǥ :

       brw-rw---- 1 root disk  3,  0 Nov 11 18:48 /dev/hda 
       brw-rw---- 1 root disk  3, 64 Nov 11 18:48 /dev/hdb 
       brw-rw---- 1 root disk 22,  0 Nov 11 18:48 /dev/hdc 
       brw-rw---- 1 root disk 22, 64 Nov 11 18:48 /dev/hdd

      Slackware ν꡼ΤĤϡְäƤޤ
     ⤷ְäƤ顢ץȤ scripts/MAKEDEV.ide ¹Ԥ뤳ȤǺ
     ľȤǤޤ (ǽ chmod ǡΥץȤ¹Բǽˤʤ
     ФʤʤΤޤ)

     /dev/cdrom Υܥå󥯤ȤäƤΤʤ顢줬ǥХ
     եؤƤ뤫ɤåƤ 줫 ǥХ
     `hd1a'`hd1b'ˤĤäƤΤʹȤ顢ϸ hdc  
     hdd ȸƤФƤΤΤ̾Ǥ ̾ϻ٤Ǥ礦

   - ޥȤ iso9660 ե륷ƥѤǤʤʿäƤơ
     ⤽ΤäƤ(/proc/filesustems åƤ)Τʤ顢
     餯ޥȤοСɬפǤ СϡḤ̂
     륨顼åФȤϸ¤ޤ


e. ǥ쥯ȥꥹƥ󥰤ͽ𤵤줺ڤΤƤ졢`dmesg'ɥ饤Ф
   å `buffer botch'˽Фޤ

   - ͥ1.2.xΥɥ饤ФΥСˤȻפХ
     ޤ  1.3.0ǽޤ ⤷åץ졼ɤǤʤʤ顢
     ޥȤΤȤ2048Υ֥åꤹ뤳Ȥǡ餯
     뤳ȤǤޤ (ξ硢CDROM Хʥľܼ¹Ԥ뤳ȤǤ
     ʤȤդƤ)

     ⤷򥫡ͥ1.3.0ʹߤǸ顢ХȤ𤷤Ƥ


f. ǡ»

   - Ǥʥǡ»Hitachi CDR-7730 CDROM ǤȤ긫ޤ
     ⤷ǡ»֤ĤäƤʤ顢"hdx=slow"򥳥ޥɥ饤ѥ᡼
     ȤƻȤȤǡƥѥեޥ󥹤㲼ѤˡǤ
     뤫Τޤ


6. cdchange.c
-------------

/*
 * cdchange.c [-v] <device> [<slot>]
 *
 * ϥ󥸥λꤵ줿åȤ CDROM ɤ߹ߡ󥸥ξ
 * ˴ؤɽޤ ΥץȤ˥ɥ饤֤򥢥ޥ
 * Ǥ礦
 *
 * 󥸥ξ -v ե饰ꤹ뤫åȤꤷʤǤɽ
 * ޤ
 *
 * Gerhard  Zuber <zuber@berlin.snafu.de>Υꥸʥ륳ɤˤʤäƤޤ
 * 󥸥ξ־ȿѰ CDROM ɥ饤Х󥿥եΤ
 * 񤭴 Erik Andersen <andersee@debian.org>Ǥ
 */

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/cdrom.h>


int
main (int argc, char **argv)
{
	char *program;
	char *device;
	int fd;           /* file descriptor for CD-ROM device */
	int status;       /* return status for system calls */
	int verbose = 0;
	int slot=-1, x_slot;
	int total_slots_available;

	program = argv[0];

	++argv;
	--argc;

	if (argc < 1 || argc > 3) {
		fprintf (stderr, "usage: %s [-v] <device> [<slot>]\n",
			 program);
		fprintf (stderr, "       Slots are numbered 1 -- n.\n");
		exit (1);
	}
 
       if (strcmp (argv[0], "-v") == 0) {
                verbose = 1;
                ++argv;
                --argc;
        }
 
	device = argv[0];
 
	if (argc == 2)
		slot = atoi (argv[1]) - 1;

	/* open device */ 
	fd = open(device, O_RDONLY | O_NONBLOCK);
	if (fd < 0) {
		fprintf (stderr, "%s: open failed for `%s': %s\n",
			 program, device, strerror (errno));
		exit (1);
	}

	/* Check CD player status */ 
	total_slots_available = ioctl (fd, CDROM_CHANGER_NSLOTS);
	if (total_slots_available <= 1 ) {
		fprintf (stderr, "%s: Device `%s' is not an ATAPI "
			"compliant CD changer.\n", program, device);
		exit (1);
	}

	if (slot >= 0) {
		if (slot >= total_slots_available) {
			fprintf (stderr, "Bad slot number.  "
				 "Should be 1 -- %d.\n",
				 total_slots_available);
			exit (1);
		}

		/* load */ 
		slot=ioctl (fd, CDROM_SELECT_DISC, slot);
		if (slot<0) {
			fflush(stdout);
				perror ("CDROM_SELECT_DISC ");
			exit(1);
		}
	}

	if (slot < 0 || verbose) {

		status=ioctl (fd, CDROM_SELECT_DISC, CDSL_CURRENT);
		if (status<0) {
			fflush(stdout);
			perror (" CDROM_SELECT_DISC");
			exit(1);
		}
		slot=status;

		printf ("Current slot: %d\n", slot+1);
		printf ("Total slots available: %d\n",
			total_slots_available);

		printf ("Drive status: ");
                status = ioctl (fd, CDROM_DRIVE_STATUS, CDSL_CURRENT);
                if (status<0) {
                  perror(" CDROM_DRIVE_STATUS");
                } else switch(status) {
		case CDS_DISC_OK:
			printf ("Ready.\n");
			break;
		case CDS_TRAY_OPEN:
			printf ("Tray Open.\n");
			break;
		case CDS_DRIVE_NOT_READY:
			printf ("Drive Not Ready.\n");
			break;
		default:
			printf ("This Should not happen!\n");
			break;
		}

		for (x_slot=0; x_slot<total_slots_available; x_slot++) {
			printf ("Slot %2d: ", x_slot+1);
             		status = ioctl (fd, CDROM_DRIVE_STATUS, x_slot);
             		if (status<0) {
             		     perror(" CDROM_DRIVE_STATUS");
             		} else switch(status) {
			case CDS_DISC_OK:
				printf ("Disc present.");
				break;
			case CDS_NO_DISC: 
				printf ("Empty slot.");
				break;
			case CDS_TRAY_OPEN:
				printf ("CD-ROM tray open.\n");
				break;
			case CDS_DRIVE_NOT_READY:
				printf ("CD-ROM drive not ready.\n");
				break;
			case CDS_NO_INFO:
				printf ("No Information available.");
				break;
			default:
				printf ("This Should not happen!\n");
				break;
			}
		  if (slot == x_slot) {
                  status = ioctl (fd, CDROM_DISC_STATUS);
                  if (status<0) {
			perror(" CDROM_DISC_STATUS");
                  }
		  switch (status) {
			case CDS_AUDIO:
				printf ("\tAudio disc.\t");
				break;
			case CDS_DATA_1:
			case CDS_DATA_2:
				printf ("\tData disc type %d.\t", status-CDS_DATA_1+1);
				break;
			case CDS_XA_2_1:
			case CDS_XA_2_2:
				printf ("\tXA data disc type %d.\t", status-CDS_XA_2_1+1);
				break;
			default:
				printf ("\tUnknown disc type 0x%x!\t", status);
				break;
			}
			}
                  	status = ioctl (fd, CDROM_MEDIA_CHANGED, x_slot);
                  	if (status<0) {
				perror(" CDROM_MEDIA_CHANGED");
                  	}
		  	switch (status) {
			case 1:
				printf ("Changed.\n");
				break;
			default:
				printf ("\n");
				break;
			}
		}
	}

	/* close device */
	status = close (fd);
	if (status != 0) {
		fprintf (stderr, "%s: close failed for `%s': %s\n",
			 program, device, strerror (errno));
		exit (1);
	}
 
	exit (0);
}
