Eu encontrei um erro decorrente da falta de permissões ao usar a biblioteca CDIO para emitir um comando de ejeção para minha unidade de CD-ROM USB. Sempre recebo uma mensagem de erro como esta:
INFO: ioctl CDROM_SEND_PACKET for command PREVENT ALLOW MEDIUM REMOVAL (0x1e) failed: Operation not permitted
A ioctl
chamada faz parte do cdda-player
aplicativo que chamo da seguinte forma:
cdda-player -ev /dev/sr0
Depois de dar uma olhada no código- fonte de libcdio
, descobri que esta linha de código causa problemas:
int i_rc = ioctl (p_env->gen.fd, CDROM_SEND_PACKET, &cgc);
Quando executo o código como root (usando sudo
), tudo funciona bem. Aqui estão as permissões para minha unidade de CD-ROM:
pi@autoradio:/import/valen/autoradio/libcdio-master $ ls -al /dev/sr0
brw-rw----+ 1 root cdrom 11, 0 Jul 5 22:42 /dev/sr0
pi@autoradio:/import/valen/autoradio/libcdio-master $ ls -al /dev/sg0
crw-rw----+ 1 root cdrom 21, 0 Jul 5 22:38 /dev/sg0
pi@autoradio:~ $ getfacl /dev/sr0
getfacl: Removing leading '/' from absolute path names
# file: dev/sr0
# owner: root
# group: cdrom
user::rw-
user:pi:rw-
group::rw-
mask::rw-
other::---
O usuário pi
faz parte do cdrom
grupo. O eject
utilitário padrão funciona, no entanto.
Agora: Quais permissões devo definir para que a operação de ejeção funcione como um usuário comum? Obrigada.
ATUALIZAÇÃO: Aqui está a minha versão do kernel:
pi@autoradio:/import/valen/autoradio/libcdio-master $ uname -a
Linux autoradio 4.9.35-v7+ #1014 SMP Fri Jun 30 14:47:43 BST 2017 armv7l GNU/Linux
OK, depois de uma dica de um dos mantenedores do
libcdio
, descobri que a versão que instalei estava desatualizada e continha um bug baseado no uso indevido doO_RDWR
vs.O_RDONLY
. Após a atualização, de repente tudo funciona bem. Mesmo assim obrigado pelas dicas!