[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Чудеса с DVD-приводом



On Thu, Jan 08, 2009 at 11:05:05AM +0500, Sentinel wrote:
>  Коллеги, подскажите куда копнуть в такой ситуации. Стандартный etch на
> десктопе, Gnome, год - полёт нормальный, но возникла нужда заменить DVD-привод.
> Купил привод той же фирмы, той же серии, только модель посвежее. Старый
> вытащил, новый на его место поставил. После чего пропало автоматическое
> монтирование диска. Приходится открывать консоль, идти в /media и делать mount
> cdrom.
> 
>  Если быть точным, симптомы следующие. Вставляю любой диск в привод, на рабочем
> столе появляется иконка ЧИСТОГО диска и Гном сообщает - мол, вставлен чистый
> диск, что вы хотите сделать.. В меню, выпадающем по правому клику на иконке,
> есть пункты "Открыть" и "Просмотреть папку", но их выбор ничего не даёт - для
> Гнома диск виден как "чистый CD-RW".
> 
>  Порылся в графических настройках Гнома - не помогло. Собственно мне не лень
> открыть консольку и дать команду вручную, но за машиной работает ещё один
> человек, которому крайне желательно, чтобы диск открывался автоматически, без
> "магических" пассов.. Потому прошу совета: где искать причину? Заранее спасибо.

Проблема или в кривом приводе или в HAL. Среди ioctl для CD привода есть
CDROM_DISC_STATUS, который возвращает тип диска. Поскольку я немного
этой тематикой занимался, вот простая тестовая программа. Что она в
твоем случае выдает?

============================ 8< ============================
/* cdtest.c: determines a type of disc in a CD-drive.
 * Written by Stanislav Maslovski.
 * This software is in public domain. Use freely.
 */

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/cdrom.h>

#define die(msg) (perror(msg), exit(1))

int main(int argc, char **argv)
{
   int fd, ret;
   
   if (argc < 2)
     {
	printf("Usage: %s <path_to_device_file>\n", argv[0]);
	exit(1);
     }
   
   fd = open(argv[1], O_NONBLOCK);
   if (fd == -1) die("Error opening device");

   ret = ioctl(fd, CDROM_DRIVE_STATUS, 0);
   if (ret == -1) die("Error in ioctl");

   switch (ret)
     {
      case CDS_NO_INFO:
	die("Drive does not support status queries");
      case CDS_NO_DISC:
	die("No disc in the drive");
      case CDS_TRAY_OPEN:
	die("Tray open");
      case CDS_DRIVE_NOT_READY:
	die("Drive not ready");
      case CDS_DISC_OK:
	ret = ioctl(fd, CDROM_DISC_STATUS, 0);
	if (ret == -1) die("Error in ioctl");
	switch (ret)
	  {
	   case CDS_NO_INFO:
	     die("Empty CD or unknown");
	   case CDS_AUDIO:
	     die("Audio CD");
	   case CDS_MIXED:
	   case CDS_XA_2_2:
	   case CDS_XA_2_1:
	     die("Mixed audio/data CD");
	   case CDS_DATA_1:
	     die("Data CD");
	   default:
	     printf("Unknown disk type %d\n", ret);
	     exit(1);
	  }
      default:
	printf("Unknown drive status %d\n", ret);
	exit(1);
     }
   exit(0);
}
============================ 8< ============================

-- 
Stanislav


Reply to: