Existuje příkaz, který můžete spustit ve skriptu shellu, který by zjistil, zda je přihrádka na CD otevřená nebo zavřená, a vrátí 1 nebo 0 podle toho, zda to bylo (nebo něco snadno interpretovatelného)?
V současné době provádím příkaz open a načasuji, jak dlouho trvá jeho provedení. Pokud je téměř okamžitá, je otevřená. Pokud to chvíli trvá, byla otevřena a nyní je zavřená.
Chtěl bych metodu, která nezahrnuje změnu aktuálního stavu – pouze jeho detekci.
Přijatá odpověď:
Našel jsem zde pěkné malé řešení. Níže uvedený kód C, minimálně pozměněný z odkazovaného webu, vrátí kód ukončení pokud je zásobník otevřený a
1
pokud tomu tak není.
Uložte tedy tento kód jako něco (např. foo.c
) a zkompilujte jej pomocí tohoto příkazu:
gcc -o trayopen foo.c
Poté zkopírujte zkompilovaný spustitelný soubor trayopen
do /usr/bin
:
sudo cp trayopen /usr/bin
Neměli byste být schopni dělat věci jako
trayopen /dev/sr0 && echo closed
Nebo úplněji:
#!/bin/sh
if trayopen /dev/sr0
then
echo "Tray is open."
else
echo "Tray is closed."
fi
Kód:
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/cdrom.h>
int main(int argc,char **argv) {
int cdrom;
int status=1;
if (! argv[1] ){
printf("Usage : trayopen [device]\n");
printf("Result: Returns a 0 if the tray was open and 1 if it was closed\n");
exit(2);
}
if ((cdrom = open(argv[1],O_RDONLY | O_NONBLOCK)) < 0) {
printf("Unable to open device %s. Provide a device name (/dev/sr0, /dev/cdrom) as a parameter.\n",argv[1]);
exit(2);
}
/* Check CD tray status */
if (ioctl(cdrom,CDROM_DRIVE_STATUS) == CDS_TRAY_OPEN) {
status=0;
}
close(cdrom);
exit(status);
}