Guarantee business interface. stickfish.com
abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz 64bit.eu 64bit.eu abcprace.cz AbcPráce.cz Raydesk Raydesk
Sledujte AbcLinuxu.cz na:
facebook favicon logo  Facebooku twitter favicon logo  Twitteru,   identi.ca favicon logo  Identi.ca
openmagazin logo openMagazin 1/2010 Nový vzhled!
Rozšířené hledání
×
Který mobilní OS je nejlepší?
 (40%)
 (17%)
 (21%)
 (2%)
 (7%)
 (3%)
 (6%)
 (5%)
Celkem 460 hlasů
 Komentářů: 58, poslední dnes 00:25
Doména EU za fantastickou cenu
125 Kč bez DPH
Webhosting LinuxSTART? S doménou EU s 50% slevou. LinuxSTART je včetně e-mailů s antivirovým a antispamovým řešením
Pouze do konce března na www.CZECHIA.com.
včera 18:13 | Zajímavý článek
Společnost Palm na Game Developers Conference tento týden ohlásila port Unreal Engine 3 na platformu webOS. Tento engine pohání například hry Gears of War nebo Unreal Tournament 3 a bude brzy dostupný i dalším vydavatelům herních titulů.
Jan Grmela | Komentářů: 7
včera 16:55 | Nová verze
Phoronix informuje, že Khronos vydal specifikace OpenGL 3.3 a 4.0. OpenGL 4.0 přináší GLSL 4.00, výkonnostní zlepšení, lepší integraci s OpenCL a další novinky. Očekává se, že nVIDIA brzy dodá ovladače s podporou nové specifikace, zatímco AMD to bude asi trvat déle. Open-source podpory se s největší pravděpodobností v dohledné budoucnosti nedočkáme.
David Watzke | Komentářů: 4
včera 16:41 | Nová verze
Vyšlo Qt 4.7.0 Tech Preview (ukázková verze) a Qt Creator 2.0 alpha. Novinkou v Qt je Quick (Qt UI creation kit) umožňující vývoj dynamických uživatelských rozhraní ve skriptovacím jazyce QML. Rozšířena byla podpora multimédií. Nový Creator přináší podporu Quick a umožňuje vyvíjet programy pro Symbian a Maemo.
David Watzke | Komentářů: 4
včera 16:30 | Zajímavý článek
Jane Silber nastoupila jako výkonná ředitelka (CEO) firmy Canonical k prvnímu březnu. CNet přináší rozhovor, ve kterém J. Silber mimo jiné říká, že zatímco se Mark Shuttleworth bude více soustředit na design a strategii, jí připadne role tradičního manažera.
Robert Krátký | Komentářů: 3
včera 14:56 | Zajímavý článek
Ondřej Filip z CZ.NIC kriticky komentuje včerejší vyjádření Roda Beckstroma z ICANN, který na konferenci v Nairobi varoval před ohrožením světového DNS systému právě probíhajícím útokem.
Steppenwolf | Komentářů: 2
včera 11:21 | Nová verze
Nová verze OS českého původu přináší řadu novinek: podporu síťování (experimentální), procesorů UltraSPARC T1 a T2, nové prostředky ladění (výpisy zásobníků, core files) a nové ovladače, servery a aplikace.
Jiří Svoboda | Komentářů: 4
včera 10:06 | Nová verze
Phoronix informuje o rozhodnutí vývojářů Ubuntu zůstat ve vydání Lucid Lynx u ovladače grafických karet xf86-video-intel 2.9, ačkoliv je již na světě verze 2.10 a 2.11 to pravděpodobně do vydání 10.04 také stihne. Důvodem je, že verze 2.10 odstraňuje podporu user-space mode-setting a zůstává tak jen kernel mode-setting, což zatím způsobuje problémy například uživatelům některých starších karet. Vzhledem k tomu, že 10.04 bude LTS, byla vybrána verze 2.9, do které budou backportovány bugfixy a některá vylepšení novějších verzí.
Tomáš Heger (geckon) | Komentářů: 54
včera 09:30 | Nová verze
Mobilový prohlížeč Opera Mini vyšel ve verzi 5 beta s podporou pro Android. Přímo z telefonu s Androidem můžete stahovat buď z Android Market, nebo z adresy m.opera.com/next.
Robert Krátký | Komentářů: 4
včera 09:14 | Nová verze
Vyšla verze 0.2.1 knihovny libisds určené pro přístup k ISDS. Mezi novinky patří schopnost odeslat dokument k autorizované konverzi, (netestovaná) možnost autentizace klientským certifikátem, integrace do pkg-configu, přesměrování protokolu nebo vestavěné adresy ISDS serverů.
petr_p | Komentářů: 0
včera 08:35 | IT novinky
Nicole Wong, viceprezidentka firmy Google, včera před americkým kongresem oznámila, že postoj firmy k cenzuře v Číně se nezměnil a Google trvá na ukončení cenzurování výsledků vyhledávání. S cenzurou jsou rozhodnuti skončit, i kdyby to mělo znamenat definitivní odchod Googlu z Číny. Zdroj: Reuters.
xm | Komentářů: 18
Rozcestník
Doporučujeme
Placené odkazy

Dotaz: Nalezení CD-ROM mechanik

Jardík avatar 5.2. 03:10 Jardík | skóre: 36 | blog: jarda_bloguje
Nalezení CD-ROM mechanik
Přečteno: 458×
Potřeboval bych najít všechny CD-ROM mechaniky v systému. Zatím to dělám tak, že prohledávám adresář /dev, vybírám zařízení s názvy sg<číslo>, otevřu a přes ioctl pošlu SCSI_INQUIRY a pak testuju vrácená inquiry data, byte 1, bity 0-5 na hodnotu 0x05.

Jenže prohledávání /dev adresáře je docela pomalé, dochází tam k neustálému kopírování řetězců, a tak hledám nějaký lepší způsob.
Painting a bicycle does not make it an airplane.

Řešení dotazu:


Odpovědi

5.2. 08:05 ondrej
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Na debianu by ti mohl pomoct soubor /proc/sys/dev/cdrom/info
5.2. 08:13 ondrej
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
prip /proc/diskstats

pokud pouzivas jine distro tak find /proc -name '*cd*'
Jardík avatar 5.2. 11:24 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Nebudu kvůli tomu pouštět externí program. Zapomněl jsem to zmínit, ale pracuji v C/C++.
Painting a bicycle does not make it an airplane.
5.2. 15:37 ondrej.k | skóre: 1
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
externi program ale spoustet vubec nemusis, find jsem uvedl jen pro pripad ze by u tebe byly cesty rozdilne, projdi si adresare /proc a /sys ...
5.2. 09:03 R
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
To je zly postup. sg zariadenia tam vobec nemusia byt. Posielat nejake prikazy zariadeniam "len tak" tiez nie je vporiadku.

Skor by som pouzil /sys. Napr. /sys/block - v kazdom zariadeni pozriet, kam vediet symlink device/driver - (sr alebo ide-cdrom, mozno aj nieco ine).
Jardík avatar 5.2. 11:23 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Jenže když se na to budu dívat takhle, tak tam nemusí být ani /sys/. Navíc s tím zařízením potom potřebuju dál něco dělat (posílat další SCSI příkazy) a tak ho nějak potřebuju otevřít. A nějak nejsem zastánce fixně velikých bufferů a jednorázového čtení celého souboru a spoléhat se na to, že se tam data vejdou (ze /sys/ a /proc/ jinak soubory snad číst nejdou). Nějaké systémové volání k tomu není, abych se vyhnul souborům úplně?
Painting a bicycle does not make it an airplane.
5.2. 12:49 R
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Ze chces jednemu zariadeniu posielat nejake prikazy, to nijako neospravedlnuje posielanie nejakych prikazov kazdemu zariadeniu.

V tom /sys nemusis citat ziadny subor. Staci ti readdir() a readlink().
5.2. 12:51 R
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
A pripadne sa pozri na libsysfs.
Jardík avatar 5.2. 16:27 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Ale já posílám příkazy jen zařízením sgXXX, což by měli být SCSI zařízení a každé SCSI zařízení musí INQUIRY příkaz podporovat. Ano, je tu moňost, že by tam mohlo být ne-SCSI zařízení, pokud si ho někdo takto pojmenuje.

readdir() neustále kopíruje název souboru do bufferu v dirent struktuře, navíc do fixního (256B), readlink vyžaduje fixní velikost bufferu a realokovat 10x buffer, pokud bude cílová cesta dlouhá je taky opruz.

libsysfs stejně čte /sys, cesta je tam hardcodována (jde sice přepsat proměnnou prostředí) a to už rovnou můžu hardcodovat /dev/sgXXX. To není jediné systémové volání na zjištění připojených zařízení?
Painting a bicycle does not make it an airplane.
5.2. 21:50 R
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Zariadenia sg sa vytvaraju aj pre USB mass storage - a pozri sa do jadra, kolko je tam workaroundov ohladne INQUIRY pri tychto zariadeniach.

Co sa stane, ak zariadenie prave vykonava nejaky prikaz a ty mu do toho nieco posles? Preco by mal nejaky program posielat prikazy vsetkym zariadeniam? Pripomina mi to programovanie ako vo Windows.

Inak ty mas nejaku uchylku na zbytocnu mikrooptimalizaciu? Kolkokrat stihne procesor nakopirovat tie retazce, kym ti nejake SCSI zariadenie odpovie na INQUIRY? Hint: moze to trvat niekolko sekund.
Jardík avatar 6.2. 02:28 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Ano, ale flashka je SCSI zařízení, ačkoliv je připojena přes USB. A pokud snad něco vykonává, tak je tam snad nastaven nějaký zámek a dojde k timeoutu (?), který se u SCSI příkazu nastavuje.
Painting a bicycle does not make it an airplane.
5.2. 22:02 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Na SCSI_INQUIRY bych se vykašlal, budit všechna zařízení jen proto, že hldám CD je hloupost, to se dělá tak leda ve Windows. /sys musí stačit.
Jardík avatar 6.2. 02:37 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Ve Windows SCSI_INQUIRY posílat právě nemusím na zjištění, jestli jde o CD-ROMKU, tam jsou na to funkce. Funkcí GetLogicalDrives() dostanu zařízení a funkcí GetVolumeType() dostanu info, jestli jde o CD-ROM, aniž by se požadavek posílal mechanice, protože to už Windows "ví".

Tak mi tedy řekněte, kde v /sys ty mechaniky najdu, sice něco najdu, ale ať tam hledám jak divej, nikde nenalézám symlink na zařízení /dev/sg*
Painting a bicycle does not make it an airplane.
6.2. 11:22 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Nevím bohužel jak v tom C, což samozř. chápu že je pro vás zásadní, nicméně v shellu třeba takto:
find /sys/devices -name 'media' | while read media; do
  [[ "$(<$media)" == "cdrom" ]] && echo "$media"
done
Jardík avatar 6.2. 12:22 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
find /sys/devices -name 'media' mi tu nenajde vůbec nic ...
Painting a bicycle does not make it an airplane.
6.2. 18:20 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Aha :( Když se sebezapřením použiji hal:

hal-device $(hal-find-by-capability --capability storage.cdrom) | grep sysfs

tak mi cdrom najde podle "capabilities". Je jich více: { 'storage', 'block', 'storage.cdrom' }

Ve vygrepovaném adresáři v sysfs sice také existuje soubor capabilities, ale tam je jen "19". Kdyby to znamenalo cdrom (nedaří se mi najít význam toho souboru či čísla) tak by to mohlo pomoct:

find /sys/devices -name 'capability' | while read capability; do [[ "$(<$capability)" == "19" ]] && echo "$capability" done

ale bohužel jsem z toho jinak jelen :(
6.2. 18:36 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
A protože properties jsou koukám nepovinné, tak by bylo asi bezpečnější:

hal-device $(hal-find-by-property --key storage.drive_type --string cdrom) | grep sysfs

ale jinak tomu vůbec nerozumím (to asi nemusím říkat).
6.2. 18:37 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Oprava: A protože propertiescapabilities
Jardík avatar 6.2. 20:03 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
HAL je však to, čemu jsem se chtěl vyhnout.

Zatím jsem našel něco v /sys/bus/scsi/. Jsou tam adresy zařízení ve tvaru A:B:C:D. Když do toho kouknu, jsou tam mimo jiné i údaje z inquery struktury (vendor, model, rev, ...) včetně type (5 = CD-ROM). Dále v tom adresáři je adresář scsi_generic, v něm adresář sg1 atd. Jenže tam nikde nevidím link na soubor s zařízením, který bych byl schopen otevřít a posílat SCSI příkazy, což je můj cíl (tak trochu si hraju a chci se dopracovat ke smazání cédéčka).
Painting a bicycle does not make it an airplane.
6.2. 20:51 R
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Link tam nie je (pretoze moze byt lubovolny pocet suborov, ktore reprezentuju toto zariadenie) - ale v adresari block najdes subor dev, v ktorom je MAJOR a MINOR.
Jardík avatar 6.2. 21:26 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Super, takže kromě prohledávání /sys budu ještě prohledávat /dev, na každý soubor dělat stat a zjišťovat major/minor, zkusit ho otevřít a prohledávat další, protože tam může být třeba 20x pokaždé s jiným oprávněním. Nebo spíš prohledat celý filesystém, co když si náhodou root vzpomněl zařízení vytvořit v uživatelově adresáři místo v dev. Tady je vidět hezké a přehledné "API" linuxu. Radši zůstanu u svého způsobu a počkám si na inquiry a budu předpokládat SCSI zařízení jako /dev/sgX, než trávit půl hodiny prohledáváním filesystému.
Painting a bicycle does not make it an airplane.
Jardík avatar 6.2. 21:29 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
... než trávit půl hodiny prohledáváním filesystému ... a stejně předpokládat 100 jiných věcí.
Painting a bicycle does not make it an airplane.
7.2. 12:22 R
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Dufam, ze sa s tvojimi programami nikdy nestretnem. Nechces to radsej urobit pre Windows?
7.2. 09:36 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
To je řešení?blbost, musí to být v /sys/devices. HAL vám nenutím, měl sloužit jen k identifikaci problému.

Zatím je rozdíl v tom, že vy máte scsi a já ide cd-rom.

Chcete říct, že vám ten hal to zařízení v /sys/devices nenašel?

Osobně mám v /sys/devices jak ide tak scsi zařízení.
Jardík avatar 7.2. 13:32 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
IDE CD-ROM stejně používá SCSI rozhraní ke komunikaci, já mám SATA.

Ano, HAL mi věnuje řádek s /sys/devices/pci0000:00/0000:00:1f.2/host1/target11:0:0/1:0:0:0/block/sr0, ale z toho taky nedostanu cestu k zařízení. Navíc zařízení /dev/sr0 nemůžu SCSI příkazy posílat, jeho otevřením se totiž otevře to médium, co tam je, musí se otevřít generické scsi zařízení /dev/sgX.

Škoda, že se kvůli debilní licenci nemůžu podívat do zdrojáků cdrecordu nebo wodimu. Zkusím naně strace ... á, někdo si může stěžovat na můj přístup, co dělá wodim. Zkouší otevírat všechna zařízení /dev/hda až /dev/hdz, /dev/scd1 až /dev/scd255 a pokud se je podaří otevřít, posílá jim SCSI příkazy. Takže opravdu zůstanu u svého způsobu, když to jinak očividně nejde.

Taky nechápu, proč wodim používá flag O_EXCL pro volání open() bez O_CREAT, když manuálová stránka píše, že je pak výsledek nedefinovaný.
Painting a bicycle does not make it an airplane.
Petr Šobáň avatar 7.2. 13:35 Petr Šobáň | skóre: 72 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Já si taky myslím že přes hal je to nejednoduší, než prohledávat hromadu adresářů.

Mě příkaz: "hal-device $(hal-find-by-property --key storage.drive_type --string cdrom) | grep sysfs" cdrom najde viz:
[petr@nt /sys/devices]$ hal-device $(hal-find-by-property --key storage.drive_type --string cdrom) | grep sysfs
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:11.0/host1/target1:0:0/1:0:0:0/block/sr0'  (string)
[petr@nt /sys/devices]$ 
Doktoři, lékárníci a poslanci při přečtení tohoto příspěvku jsou povinni zaplatit poplatek 30,-Kč provozovateli portálu.
Jardík avatar 7.2. 15:22 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Jak jsem řekl, výsledek tohoto příkazu mi je k ničemu, protože mi nedá link na SCSI zařízení a v tom adresáři to taky nikde není. Navíc by to znamenalo závislost na obludě jménem HAL, a která je navíc označena za deprecated.
Painting a bicycle does not make it an airplane.
Petr Šobáň avatar 7.2. 18:16 Petr Šobáň | skóre: 72 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Jasně já v tom neporadím, prostě buď to budeš muset skoušet a nebo použít ten hal a potom předpokládat že /dev/srX = /dev/sgX ovšem já nemám víc mechanik abych to testnul zda to platí.
Doktoři, lékárníci a poslanci při přečtení tohoto příspěvku jsou povinni zaplatit poplatek 30,-Kč provozovateli portálu.
Jardík avatar 7.2. 18:44 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
To neplatí, mechaniku mám sr0, ale sg0 je můj pevný disk.
Painting a bicycle does not make it an airplane.
7.2. 19:14 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
No já nevím, ale podle mně platí to co řekl R,
Link tam nie je (pretoze moze byt lubovolny pocet suborov, ktore reprezentuju toto zariadenie) - ale v adresari block najdes subor dev, v ktorom je MAJOR a MINOR.
vám sice následně ruply nervy, ale osobně nepovažuji za velký problém projít těch pár AKTIVNÍCH sg zařízení, otevřít pár souborů dev a přečíst si major a minor, čímž mám /dev/srX (v případě scsi).

Zkuste mrknout na sg_map, v nové verzi pracuje se sysfs.
$ sg_map

# Note: the devfs pseudo file system is present

/dev/sg0 /dev/sda

/dev/sg1 /dev/sr0

/dev/sg2 /dev/sr1
Samozřejmě je pořád možnost dělat to postaru, pokud jste pod tlakem.
7.2. 19:16 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Vemte si (nevím pro co to programujete) ale asi nebude připojených těch mechanik 50, ne? A i kdyby, otevřít padesát souborů ještě nikoho nezabilo.
7.2. 19:20 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Ta novější verze se jmenuje sg_map26 (See the sg_map26 utility for a more precise way (i.e. less directory scanning) for mapping between sg device names and higher level names; including finding user defined names.)
Jardík avatar 8.2. 00:37 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Ještě na to kouknu. Asi udělám kompromis - kouknu do /sys/bus/scsi/devices, tam vyhledám všechny adresáře ve formátu U:V:X:Y, tam vezmu typ (5=CDROM), kouknu do scsi_generic, kde je u mě jediný adresář (např. sg1), v tom mám soubor dev, kde je major:minor, pak podle toho adresáře (sg1) zkusím otevřít stat na /dev/sg1, pokud budou sedět major/minor a typ souboru device, tak otevřu (nebo otevřít a pak fstat()?) a inquiry pošlu pak k ověření a dále s ním budu pracovat. A pokud tam sg zařízení nebude (např. ho někdo smazal a udělal si ho v /home (paranoia :-))), tak smůla.

A může mi někdo ještě osvětlit atribut O_EXCL u open(), když není uveden O_CREAT? V manuálové stránce se popisuje nedefinované chování, ale wodim/cdrecord ho tak používají.
Painting a bicycle does not make it an airplane.
8.2. 09:56 R
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=262678
8.2. 18:23 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Pro jistotu zopakuji že HAL jsem se sebezapřením použil jen jako nástroj univerzální komunikace schopný (jednorázově) najít tazatelovu scsi cdromku a její cestu v sysfs, abychom se pohnuli dále. Jinak samozřejmě HAL je přesně ten, kdo suverénně budí na co sáhne. Je možná zábavné sledovat, jak když se spustí hal, rozjíždí se všechny externí disky (a že na firewire jich může být zapojených hodně), zavrní cdromky, zablikají skenery, vrata od garáže se otevřou a zavřou, no trochu přeháním ale každopádně příklad hodný následování to není :)
Jardík avatar 9.2. 20:08 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Fuj, tak jsem to tak udělal a můžu říct jedno - je to prasárna :-) Hledání CD-ROM mechanik a jejich vložení do seznamu má ve Windows verzi 34 řádků (počítám i řádky, které mají jen otevírací/uzavírací závorky {,}).

V Linuxové verzi jsem teď na 174 řádcích a teď zbývá ještě dopsat kód na prohledání celého /dev pro případ, že zařízení /dev/jméno_co_se_našlo_v_sysfs neexistuje, nebo se jeho major/minor neshoduje s tím v /sys.

Kdyby někoho zajímalo, jak to vypadá ve Windows:
  TSCSIDrive *drive;
  TSCSIDrive tmpDrive;
  uint8_t device_type;
  
  /*
   * Using GetLogicalDrives() could speed up things, but there is always
   * possibility, that drive has no letter assigned, is mounted to NTFS
   * folder or it is not even mounted. This way we handle all these cases.
   */
  HANDLE hVolumeSearch;
  /*
   * Volume name is in "\\?\Volume{ITS_GUID}\" format,
   * GUID's format is AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA
   */
  WCHAR volumeName[MAX_PATH];
  
  hVolumeSearch = FindFirstVolumeW(volumeName, MAX_PATH);
  
  if (hVolumeSearch != INVALID_HANDLE_VALUE)
  {
    do
    {
      volumeName[MAX_PATH-1] = 0;
      
      if (GetDriveTypeW(volumeName) == DRIVE_CDROM)
      {
        tmpDrive._open_fn = volumeName;
        
        // remove trailing slash so that we open drive itself and not
        // the medium inserted
        if (tmpDrive._open_fn[tmpDrive._open_fn.size()-1] == '\\')
        {
          tmpDrive._open_fn.erase(tmpDrive._open_fn.size()-1);
        }
        
        if (tmpDrive.openDrive())
        {
          tmpDrive.setTimeout(10);
          
          // request inquiry data and make sure OS didn't lie to us
          if (tmpDrive.inquiry(tmpDrive._inqData, TSCSIDrive::INQUIRY_DATA_SIZE))
          {
            device_type = (tmpDrive._inqData[0] & 0x1F);
            
            if (device_type == 0x05 /* CD-ROM */)
            {
              drive = new TSCSIDrive();
              tmpDrive.readScsiAddress(drive->_address);
              drive->_open_fn = std::move(tmpDrive._open_fn);
              memcpy(drive->_inqData, tmpDrive._inqData, TSCSIDrive::INQUIRY_DATA_SIZE);
              _drives.push_back(drive);
            }
          }
          tmpDrive.closeDrive();
        }
        tmpDrive._open_fn.clear();
      }
    
    } while (FindNextVolumeW(hVolumeSearch, volumeName, MAX_PATH));
    
    FindVolumeClose(hVolumeSearch);
  }
Painting a bicycle does not make it an airplane.
9.2. 20:24 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Asi proto člověk občas vidí system("lsscsi | grep ...") :)
Jardík avatar 9.2. 22:37 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Takový program (lsscsi) však nemám a byla by to další závislost (já vím, že jsem s tím už trapnej, ale to jsem prostě já :-))
Painting a bicycle does not make it an airplane.
kralyk avatar 9.2. 22:48 kralyk | skóre: 21 | blog: Untitled
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Můžeš ten prográmek/knihovnu k tomu přibalit (á la windoze), a basta. Tím by ses imho ani nedostal do konfliktu s GPL, pokud vím. Ale nejsem právník.
9.2. 23:27 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Však jo, tohle rozhodně neměl být příklad lepšího řešení :) A nejedná se o knihovnu, takže v céčkovém programu je to stejně nanic.
Jardík avatar 9.2. 23:58 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Tak spustit příkaz z Céčkového programu a parsovat jeho výstup není problém, ale jestli mám parsovat nějaký výstup, nebo prohledávat sys, to už vyjde na stejno.
Painting a bicycle does not make it an airplane.
11.2. 07:37 zulu
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
174 řádků? Ukaž nám ten kód, ať se zasmějem.
6.2. 20:37 maertien
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Coz prolejzat /proc/ide/* ???
Jardík avatar 6.2. 21:18 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Já se teď nemůžu podívat, ale bude tam i SATA mechanika?
Painting a bicycle does not make it an airplane.
7.2. 09:44 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Na proc se vykašlete když máme sysfs.

Vizte Documentation/sysfs-rules.txt a další.
7.2. 19:25 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Jinak vykašlete == jednak on má scsi, čili /proc/scsi, a potom to není spolehlivé u zařízení připojených za chodu, a takových je dneska hodně.
8.2. 16:50 maertien
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Jiste - /proc/scsci/* . Neprecetl jsem si tazateluv dotaz poradne. A je fakt, ze proc je v tomto kontextu jiz mirne obsoletni.
kralyk avatar 8.2. 17:54 kralyk | skóre: 21 | blog: Untitled
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Buď bych zkusil něco v /proc/scsi, ale být tebou spíš od filesystému upustím.

Když se podíváš do dmesg, tak v něm jsou většinou příslušný devices vypsaný.
Jsem přesvědčen, že bude v linuxu existovat nějaká knihovna či rozhraní systému, která ti umožní SCSI devices vylistovat.

Zkustil jsem namátkou pár příkazů (velmi hrubé info - potřeba googlovat):
vojta|vojta-dell ~ $> pkg-config --list-all | grep -i cd
libcdt                           libcdt - Container DataType library
libudf                           libudf - UDF library of libcdio
libcdio++                        libcdio++ - C++ OO Portable CD-ROM I/O library
libcdio                          libcdio - Portable CD-ROM I/O library
libiso9660++                     libiso9660++ - C++ OO ISO-9660 library of libcdio
libiso9660                       libiso9660 - ISO-9660 library of libcdio
gstreamer-cdda-0.10              GStreamer CDDA Library - CDDA base classes
libcdio_cdda                     libcdio_cdda - CD paranoia CD-DA library from libcdio
libcdio_paranoia                 libcdio_paranoia - CD paranoia library from libcdio
libcddb                          libcddb - CDDB server access library

vojta|vojta-dell ~ $> pkg-config --list-all | grep -i devic
libgphoto2_port                  libgphoto2_port - Device-independent access to serial, USB, and other ports
devkit-power-gobject             devkit-power-gobject - DeviceKit-power is a system daemon for installing stuff.
gnome-bluetooth-1.0              gnome-bluetooth-1.0 - Widgets for Bluetooth device selection
usbutils                         usbutils - USB device database
libmtp                           libmtp - libmtp is a library for accessing Media Transfer Protocol devices
devmapper-event                  devmapper-event - device-mapper event library
pciaccess                        pciaccess - Library providing generic access to the PCI bus and devices.
libsynce                         libsynce - A helper library for SynCE, a framework to sync WinCE devices
libavdevice                      libavdevice - FFmpeg device handling library
DeviceKit-disks                  DeviceKit-disks - DeviceKit-disks daemon
blkid                            blkid - Block device id library
devmapper                        devmapper - device-mapper library
libv4l2                          libv4l2 - v4l2 device access library
hal-storage                      hal-storage - hal library for storage devices and volumes
libudev                          libudev - Library to access udev device information

vojta|vojta-dell ~ $> pkg-config --list-all | grep -i dvd
dvdread                          libdvdread - Low level DVD access library
dvdnavmini                       libdvdnavmini - DVD Navigation mini library
libdvdcss                        libdvdcss - DVD access and decryption library.
dvdnav                           libdvdnav - DVD Navigation library
vojta|vojta-dell ~ $>

Především ta prostřední skupina mi přijde zajímavá.
Případně se můžeš podívat do zdrojáků různých nástrojů na zjišťování info o HW (např. hwd a mnoho dalších...).

Dále by tvým rádcem mohlo být toto hledání

Určitě existuje způsob, jak tohle řešit lépe, než prohledáváním filesystému (ať už v /dev, /sys, nebo /proc), už jen ten způsob najít ;-)
To, co jsem ti tu vypsal, jen výsledek asi pětiminutového "výzkumu", tudíž nečekej zázraky...
kralyk avatar 8.2. 18:01 kralyk | skóre: 21 | blog: Untitled
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Jo, a ještě můžeš oblígátně použít google, chce to vhodný dotaz.
Například tento nebo tento.
Jardík avatar 8.2. 21:08 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Já ty SCSI tutoriály právě četl, nějaké od IBM a pod, ale nikde tam nepíšou o nalezení, jen otevři zařízení /dev/sg0 a dělej co je tu napsáno :-)
Painting a bicycle does not make it an airplane.
8.2. 18:47 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Šmarjá, asi koupím flintu a pudu na zajíce.

/proc/scsi fakt ne, tam nemáš jistotu že budou zařízení připojená za chodu. Už jsem to tu dvakrát říkal.

Jo, vylistovat scsi zařízení můžeš, jsou všechna nečekaně v /sys/devices.

Utilita tu už taky byla, jmenuje se sg_map. Nová verze sg_map26 překvapivě funguje nad /sys... Takže pokud nepoužíváš jádro 2.4...

Hovoříš o linuxu a máš něco proti souborům? Dobré ráno. V linuxu je všechno důležité soubor, a pokud ne soubor, tak alespoň virtuální filesystém. sysfs je standardní rozhraní a má světlou budoucnost (TM).

V linuxu to takto prostě funguje, filesystém a soubory jsou rozhraní k jádru, zařízením a dalším věcem. Je to základní princip fungování, ne něco špatného či nevhodného. Není lepší způsob, protože sysfs není špatný způsob.

Pět minut je fakt málo.
kralyk avatar 8.2. 19:26 kralyk | skóre: 21 | blog: Untitled
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Se uklidni prosimtě, já proti filosofii "everything is file" rozhodně nic nemám.

Tím "prolejzáním filesystému" jsem myslel zmíněnou metodu vylistování /dev nebo volání různých find někde na /proc nebo /sys, to je prostě blbost.

Další věc je, že občas člověk skutečně nemusí vynalézat kolo. Tedy nemá smysl psát parser struktury sysfs (nebo něčeho jiného), když (třeba, nevim) existuje odladěná a spolehlivá knihovna pro tenhle účel.
Někdy ovčem člověk vynalézat kolo z cvičných důvodů chce, a proti tomu nic nemám (bez ironie, sám to často dělám...)
Jardík avatar 9.2. 20:12 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Jenže knihovna = závislost a tím pádem nutnost ji instalovat kvůli jinému programu. Pak z toho vyjde prasárnička typu Hello World! v KDE, kdy kvůli jedné aplikaci, co ukáže okno s nápisem musíte instalovat půl giga závislostí.
Painting a bicycle does not make it an airplane.
Jardík avatar 9.2. 20:14 Jardík | skóre: 36 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Navíc ta knihovna má špatnou licenci (tj. není pod licencí Do what the fuck you want to public license)
Painting a bicycle does not make it an airplane.
9.2. 20:58 Ash | skóre: 46
Rozbalit Rozbalit vše Re: Nalezení CD-ROM mechanik
Od toho knihovny jsou, aby se přidávaly k hlavnímu programu jakožto odladěná znovupoužitelná věc. To o čem mluvíte je spíš přidat jako závislost třeba nějaký nástroj pro "hledání dvd, vypalování iso obrazů a tisk popisků DVD", to je samozřejmě špatně, ale přidat si knihovnu pro procházení sysfs, proč ne, když bude mít nějaké pěkné rozhraní. Nesmí to vést k taovému tomu "najdi mi tohle" chrocht chrocht, jo a "ještě tohle" chrocht chrocht, zatímco ve vlastním kódu by si to člověk promyslel a pak našel na jeden zátah výrazně efektivněji (asi neplatí zrovna pro sysfs, je malej, tam to je hned).

Založit nové vláknoNahoru

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

ISSN 1214-1267   Powered by Powered by Sun
© 1999-2010 Stickfish, s. r. o. Všechna práva vyhrazena.