The truth is rarely pure and never simple

Linux: Lade eines Laufwerks lässt sich nicht öffnen

Derzeit hat mich ein doch recht nerviger Fehler gut auf Trab gehalten: die Lade meines CD/DVD-Laufwerks lässt sich nach einem Brennvorgang nur genau einmal öffnen – danach ist sie zu und reagiert auf nichts. Kein Kopfdruck oder eject bewirkt eine erneute Arbeitsbereitschaft des Laufwerks. Woran der Fehler liegt, muss ich noch herausfinden. Anscheinend wird die Kontrolle über das Laufwerk nicht wieder korrekt an den Benutzer übergeben. Aber nur für den Fall, dass jemand mal auch vor diesem Problem steht, hier ohne jegliche Garantie mein Workaround, der zumindest auf meinem System (Ubuntu 8.10, x86_64) funktioniert.
[c]#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/cdrom.h>
#include <linux/fd.h>
#include <sys/ioctl.h>
int main(int argc, char ** argv) {
int fd, result;
if (argc != 2) {
printf("Usage: %s DEVICE\n", argv[0]);
return -1;
}
fd = open(argv[1], O_RDONLY|O_NONBLOCK);
if (!fd) {
printf("Could not open %s\n", argv[1]); return -2;
}
printf("unlocking %s\n", argv[1]);
result = ioctl(fd, CDROM_LOCKDOOR, 0);
if (result == EDRIVE_CANT_DO_THIS) {
printf("(Un-)locking not supported by %s\n", argv[1]);
} else if (result == EBUSY) {
printf("Device %s busy\n", argv[1]);
} else if (result == EACCES) {
printf("Access denied. Try root.\n");
}
return result;
} [/c]
Einfach mit gcc übersetzen und laufen lassen:

gcc -Wall -pedantic -o foo ej.c && ./foo /dev/scd0

Der Haken daran – der Aufruf wird jedes Mal fällig, wenn die Lade blockiert ist.