Portál AbcLinuxu, 8. května 2025 20:21

Dotaz: Jak najit cestu k cdrom device v C

tomes.io avatar 10.2.2013 16:33 tomes.io | skóre: 12 | blog: tomesh
Jak najit cestu k cdrom device v C
Přečteno: 308×
Odpovědět | Admin
Ahoj,

mam za ukol napsat jednoduchou verzi programu eject(1) tak, aby si byl program schopny zjistit cestu k zarizeni sam na jakemkoliv linuxu. Program nize umi otevrit cdromku jen kdyz se mu primo zada cesta na vstupu, jak to ale udelat automaticky? Jak v C vydolovat path k zarizeni?
int main (int argc, char* argv[])
{
  /* Open a file descriptor to the device specified on the command line.  */
  int fd = open (argv[1], O_RDONLY);
  /* Eject the CD-ROM.  */
  ioctl (fd, CDROMEJECT);
  /* Close the file descriptor.  */
  close (fd);

  return 0;
}

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

tomes.io avatar 10.2.2013 16:55 tomes.io | skóre: 12 | blog: tomesh
Rozbalit Rozbalit vše Re: Jak najit cestu k cdrom device v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Hm tak ono to staci primo napevno zadat /dev/cdrom, ioctl si pak poradi i se symlinkem. Myslel jsem, ze budu muset vystopovat z /dev/cdrom az primo ke skutecnemu zarizeni.
  int fd = open ("/dev/cdrom", O_RDONLY);
10.2.2013 18:01 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: Jak najit cestu k cdrom device v C
Symbolické odkazy vyhodnocuje jádro, takže aplikace se o to starat nemusí.
Jardík avatar 10.2.2013 21:11 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Jak najit cestu k cdrom device v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestli chvílu vydržíš, někde najdu kus BurnApp, co jsem kdysi psal.
Věřím v jednoho Boha.
Řešení 1× (frEon)
Jardík avatar 10.2.2013 21:42 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Jak najit cestu k cdrom device v C
Hmm, tak ty zdrojáky už asi nemám. Každopádně tu máš dokumentaci k api udevu. Postup je něco jako:
struct udev *u = udev_new();
struct udev_enumerate *ue = udev_enumerate_new(u);

udev_enumerate_add_match_subsystem(ue, "block");

// ..
// tady možná přidat další filtry
// ..

udev_enumerate_scan_devices(ue);

struct udev_list_entry* e = udev_enumerate_get_list_entry(ue);
Pak třeba while cyklem projdeš přes jednotlivý vrácený zařízení, koukneš, jestli je tam property určující, že je to cdromka. Název si teď přesně nepamatuju, ale najdeš ho, když spustíš něco jako
udevadm info --query=all --name=/dev/sr0
Ještě koukni na attributy
udevadm info --attribute-walk --name=/dev/sr0
Z toho zjistíš, co má cdromka oproti třeba pevnýmu disku, apod. Možná třeba pak kouknout i na rodičovský zařízení, jestli je to na SCSI subsystému apod. Potom příkaz eject pošleš buď přímo přes ioctl k tomu určený (z hlavy si nepamatuju, možná něco jako CDROM_EJECT, do ví), nebo přes SG_IO ioctl s odpovídajícím CDB pro EJECT.
Věřím v jednoho Boha.
10.2.2013 23:09 Jardík
Rozbalit Rozbalit vše Re: Jak najit cestu k cdrom device v C
BTW pokud ti to má fungovat i na cdromce, kde není cédéčko, použij O_NONBLOCK pro open. Jelikož to chceš vysouvat, mohl bys použít i O_EXCL, kdyby náhodou zrovna něco vypalovalo a "je to hodné" a používá to taky O_EXCL (aneb linux a všechny nutné hacky pro exkluzivní přístup k cdromce, viz mé zápisy a možná diskuse o BurnApp), tak se ti to nepodaří otevřít (což je dobře, nechceš asi případné vypalování pojebat).

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.