LINUX.ORG.RU

Автомонтирование внешнего USB-DVD - как?


0

1

Хочу чтобы на HTPC у меня внешний блюрей привод усбшный монтировался в /mnt/cdrom после запихивания диска, и, соответственно, отмонтировался потом.

Про udev слышал, курил, но проблема в том, что по какой-то причине драйв в какой-то момент перестает генерировать событие «change», и удев становится бесполезным. После перезагрузки события опять идут до какого-то момента.

Хотелось бы узнать, можно ли как-то попроще проверить, есть ли в драйве диск, тогда я напишу прогу которая, скажем, каждые 10 сек будет проверять есть ли диск и монтировать его. И наоборот.

>драйв в какой-то момент перестает генерировать событие «change», и удев становится бесполезным

Баг зарепортили, надеюсь?

anon_666
()
Ответ на: комментарий от anon_666

Куды? Это непойми какой блурейный привод, вытащеный из какого-то ноута, и посаженый в ноунейм усб коробку :) Может ему так и надо работать)

blind_oracle ★★★★★
() автор топика

Может, стоит смотреть в сторону hal? Слышал, кто-то из аргументов против хала говорил, что он опрашивает оборудование с какой-то периодичностью.

ramon13666 ★★★
()
Ответ на: комментарий от ramon13666

Да не хотелось бы хал изза этой фигни городить, может есть просто какой-то системный вызов простой, позволяющий проверить наличие диска в дисководе, либо откуда-нибудь из /sys /proc прочитать есть ли он там...

blind_oracle ★★★★★
() автор топика

Хм... У меня HAL и всё автомонтируется замечательно. Другое дело что сначала не монтировались FAT и NTFS.

Zenitar
()
Ответ на: комментарий от Zenitar

С флешками и сд-картами у меня и удев отлично справляется, а вот внешний дисковой гад события отправляет не всегда.

В общем решение я нашел - http://www.mjmwired.net/kernel/Documentation/ioctl/cdrom.txt

там есть нужный вызов, кому интересно - мелкая утилита, которая делает жизнь счастливее:

# cat cdmount.c

#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/cdrom.h>

int shutdown = 0;

static void sig_handler(int signum) {
    shutdown = 1;
}

int main(void) {
    int fd = 0;
    int drive_status = 0;
    int mounted = 0;
    int ret = 0;

    // Signal handling
    struct sigaction new_action;
    new_action.sa_handler = sig_handler;
    new_action.sa_flags = 0;
    sigaction(SIGTERM, &new_action, NULL);
    sigaction(SIGINT,  &new_action, NULL);

    if((fd = open("/dev/sr0", O_RDONLY | O_NONBLOCK)) < 0) {
        perror("open");
        return -1;
    }

    while(!shutdown) {
        if ((drive_status = ioctl(fd, CDROM_DRIVE_STATUS, 0)) < 0) {
            perror("ioctl");
            return -1;
        } else {
            if(drive_status == CDS_DISC_OK && !mounted) {
                printf("Disc detected, trying to mount\n");
                ret = system("/bin/mount /dev/sr0 /mnt/cdrom");

                if(ret == 0) {
                    mounted = 1;
                    printf("Mount successful\n");
                } else {
                    printf("Unable to mount disc, will try again later\n");
                }
            } else if(drive_status != CDS_DISC_OK && mounted) {
                printf("Disc lost, trying to umount\n");
                ret = system("/bin/umount /dev/sr0");

                if(ret == 0) {
                    mounted = 0;
                    printf("Umount successful\n");
                } else {
                    printf("Unable to umount disc, will try again later\n");
                }
            }
        }

        sleep(5);
    }

    printf("Shutting down...\n");

    close(fd);
}

blind_oracle ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.