Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma.
Byla vydána nová stabilní verze 3.22.0, tj. první z nové řady 3.22, minimalistické linuxové distribuce zaměřené na bezpečnost Alpine Linux (Wikipedie) postavené na standardní knihovně jazyka C musl libc a BusyBoxu. Přehled novinek v poznámkách k vydání.
FEL ČVUT vyvinula robotickou stavebnici pro mladé programátory. Stavebnice Brian byla navržená speciálně pro potřeby populární Robosoutěže. Jde ale také o samostatný produkt, který si může koupit každý fanoušek robotiky a programování od 10 let, ideální je i pro střední školy jako výuková pomůcka. Jádro stavebnice tvoří programovatelná řídicí jednotka, kterou vyvinul tým z FEL ČVUT ve spolupráci s průmyslovými partnery. Stavebnici
… více »Ubuntu bude pro testování nových verzí vydávat měsíční snapshoty. Dnes vyšel 1. snapshot Ubuntu 25.10 (Questing Quokka).
Společnost Netgate oznámila vydání nové verze 2.8.0 open source firewallové, routovací a VPN platformy pfSense (Wikipedie) postavené na FreeBSD. Přehled novinek v poznámkách k vydání.
Byla vydána nová verze 6.16 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Tor Browser byl povýšen na verzi 14.5.3. Linux na verzi 6.1.140. Další změny v příslušném seznamu.
Člověk odsouzený za obchod s drogami daroval letos ministerstvu spravedlnosti 468 kusů kryptoměny bitcoin, které pak resort v aukcích prodal za skoro miliardu korun. Darováním se zabývá policejní Národní centrála proti organizovanému zločinu (NCOZ). Deníku N to potvrdil přímo ministr spravedlnosti Pavel Blažek (ODS). Podle resortu bylo nicméně vše v souladu s právem.
Svobodný a otevřený multiplatformní editor EPUB souborů Sigil (Wikipedie, GitHub) byl vydán ve verzi 2.5.0. Stejně tak doprovodný vizuální EPUB XHTML editor PageEdit (GitHub).
Na základě národního atribučního procesu vláda České republiky označila Čínskou lidovou republiku za zodpovědnou za škodlivou kybernetickou kampaň proti jedné z neutajovaných komunikačních sítí Ministerstva zahraničních věcí ČR. Tato škodlivá aktivita, která trvala od roku 2022 a zasáhla instituci zařazenou na seznam české kritické infrastruktury, byla provedena kyberšpionážní skupinou APT31, veřejně spojovanou se zpravodajskou službou Ministerstvo státní bezpečnosti (MSS).
Google Chrome 137 byl prohlášen za stabilní. Nejnovější stabilní verze 137.0.7151.55 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 11 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
Problém 1. Místo nějakého hezkého systémového volání musím k enumeraci zařízení jak debil procházet /sys/. To bych ještě přežil. Další problém je, že tam je jenom "kernel name" zařízení - buď jen blokového (srX), popř. ještě generic SCSI device (sgX). Pak tam ještě najdu major:minor čísla zařízení. Pak nastávají 2 možnosti:
Otázkou je, jestli není lepší rovnou enumerovat zařízení pomocí udevu ... asi ano a na procházení /sys se vykašlu.
Problém 2 Detekce připojení/odpojení zařízení, výměny média, ... Pro detekci připojení/odpojení hlídám /proc/self/mountinfo, pro detekci nového zařízení, odebrání zařízení (např. USB palírny) používám udev. Při změně média mě taky informuje udev - problém udev informuje jen o změně média pro zařízení srX
, né však o změně sgX
.
Po změně zařízení se kouknu (v druhém threadu, abych neblokoval GUI), jestli je tam médium, popř. jaké médium tam je. Problém - otevřít srX nebo sgX
V případě srX si můžu dovolit posílat SCSI příkazy pouze přes ioctl(), které vždycky blokuje - a když něco mechaniku používá (např. HAL nebo udisk, když se marně snaží provádět heuristiku média, tak mi zablokuje thread, který zjišťuje typ média a ani pthread_kill nepomůže ioctl() přerušit, i když podle manuálu ioctl() je signálem přerušeno.
V případě zařízení sgX
můžu SCSI příkazy posílat přes neblokující write() a read(), použít poll() a pokud to trvá dlouho, můžu to prostě zrušit (tj. nevolat read() a zavřít zařízení). Ale je tu problém - když už nějaký program vypaluje přes zařízení srX, tak i když má exkluzivní přístup, mně je umožněno si otevřít zařízení sgX taky pro exkluzivní přístup a zavolat nějaký příkaz, by se mohlo rovnat podělání vypalování (TEST UNIT READY by sice nic zkazit nemělo, ale o tom, jestli něco vyvede GET CONFIGURATION (pro zjištění typu média), už nic dokumentace neříká).
Takže - zatím to vypadá na hybrida - vše budu provádět přes zařízení sgX (tak to dělá např. Nero), ale zároveň si pro exkluzivní přístup otevřu srX zařízení, aby mi další programy (cdrecord, dvd+rwtools, HAL, udisk) nepodělávaly vypalování. Škoda, zatím jsem nenašel žádný způsob, jak zabránit přístupu přes druhé zařízení, když používám to první. Ve Windows je např. k tomuto účelu IOCTL_CDROM_EXCLUSIVE_ACCESS, kdy mi žádný jiný program nebude kecat do vypalování (a popř. ani já jemu). V Linuxu je však API asi značně omezeno a asi se předpokládá, že si uživatel nespustí 2 takové programy, nebo fakt nevím. V případě hybridního přístupu bych musel v případě nepřítomnosti "scsi_generic" modulu přistupovat jen přes srX zařízení - to je další kompikace, se srX můžu, jak jsem již řekl, pouze blokující ioctl() = zablokování vlákna, když bude HAL/udisk provádět svoje prasárničky.
CHANGELOG: 20100608-1502 - opraveno pár chybek
Tiskni
Sdílej:
Nejde k enumeraci zařízení použít taky udev s vyhledáváním podle major a minor čísel? Já pro enumeraci sériových portů v PC používám tenhle kód:
{ QStringList ret; struct udev * udev = udev_new(); if(udev == NULL) { qCritical() << "udev_new() failed"; return ret; } for(quint8 minor = 64; minor <= 255; ++minor) { struct udev_device * udev_device = udev_device_new_from_devnum(udev, 'c', makedev(4, minor)); if(udev_device != NULL) { ret.append(udev_device_get_devnode(udev_device)); udev_device_unref(udev_device); } else break; } udev_unref(udev); return ret; }
Seznam a vysvětlení major čísel je v dokumentaci kernelu.
Požádám udev o přeložení major:minor na soubor se zařízením (např. /dev/sr0)Tím jsem měl na mysli právě použitím udev_device_new_from_devnum
It is in the process of being merged into udev (main udev, libudev, and udev-extras) and existing udev and kernel functionality. Initially a new daemon DeviceKit was planned to replace certain aspects of HAL, but in March 2009, DeviceKit was deprecated in favor of adding the same code to udev as a package: udev-extras, and some functions have now moved to udev proper.
udisks
According to DeviceKit devel mailing list, DeviceKit is getting merged with udev-extra and the existing DeviceKit programs such as DeviceKit-disks and DeviceKit-power will be switched over to use libudev.Takže by bylo fajn se začít poohlížet jak se vlastně vůbec pracuje s libudev. Jinak by ale na toto měl snad mít Qt svoje serepetičky, ne?
void bla() { struct udev_enumerate* enumerate = udev_enumerate_new(_udev); if (!enumerate) return; udev_enumerate_add_match_subsystem(enumerate, "block"); if (udev_enumerate_scan_devices(enumerate) == 0) { struct udev_list_entry *e; const char *syspath, *prop; struct udev_device *dev, *parent_dev; e = udev_enumerate_get_list_entry(enumerate); while (e) { syspath = udev_list_entry_get_name(e); dev = udev_device_new_from_syspath(_udev, syspath); if (dev) { prop = udev_device_get_property_value(dev, "ID_TYPE"); if (prop && strcmp(prop, "cd") == 0) { qDebug() << "Found CD-ROM device" << udev_device_get_devnode(dev); //printAttrs(dev); } udev_device_unref(dev); } e = udev_list_entry_get_next(e); } } udev_enumerate_unref(enumerate); }Snad se to nějak dá do kupy. Ale mě by spíše potěšilo, aby se ta CD-ROMka dala zamknout pro exkluzivní přístup nezávisle na typu zařízení, přes které se přistupuje.
Problém ale bude určitě v tom, že distribucím bude dost dlouho trvat, než nový model přijmou. Například Arch stále ještě jede na HALu. Nebo prostě bude někdo mít nainstalovanou starší verzi nějaké konzervativní ditribuce s HALem, a bude problém...Tak ten program nebudu vydávat zítra. Než to dám do nějakého použitelného stavu, aby se kvůli každé operaci nemusel rekompilovat zdroják (
Jó no, ona to fakt taková hrůza neníBer to z té pozitivní stránky. Zas se nemusíš drbat s komunikací pomocí DBUSu.
Ale mě by spíše potěšilo, aby se ta CD-ROMka dala zamknout pro exkluzivní přístup nezávisle na typu zařízení, přes které se přistupuje.Tak flock(2) to nebere. Ale jak jsem řekl. Inspiruj se u konkurence. Tady nejsi ve Widlích, ale na otevřené platformě. Co jsem se tak zběžně díval do cdrecord, tak si první autor udělá v paměti buffer a ten si všelijak pozamyká s následujícím komentářem:
/* * Try to lock us im memory (will only work for root) * but you need access to root anyway to send SCSI commands. * We need to be root to open /dev/scg? or similar devices * on other OS variants and we need to be root to be able * to send SCSI commands at least on AIX and * Solaris (USCSI only) regardless of the permissions for * opening files * * XXX The folowing test used to be * XXX #if defined(HAVE_MLOCKALL) || defined(_POSIX_MEMLOCK) * XXX but the definition for _POSIX_MEMLOCK did change during * XXX the last 8 years and the autoconf test is better for * XXX the static case. sysconf() only makes sense if we like * XXX to check dynamically. */, kde když se zámek nepovede, tak: errmsgno(EX_BAD, "WARNING: This causes a high risk for buffer underruns.\n"); a pak se na tu zamknutou paměť snaží připojit (fs = init_fifo(fs); /* Attach shared memory (still one process) */) a následně nějak propojit s nějakou scg což vypadá na knihovnu, viz komentář:
/* * Call scg_remote() to force loading the remote SCSI transport library * code that is located in librscg instead of the dummy remote routines * that are located inside libscg. */A IMHO je za dostání do stavu kdy jednotka nebude komunikovat s ničím jiným je zodpovědná právě ta knihovna nebo ta komunikace skrze SCSI příkazy. Jinak celý proces vypalování vypadá opravdu dost brutálně, takže pokud sis myslel, že to bude jen otevření blokového zařízení, uzamknutí přístupu pro exkluzivní přístup a pár writů, tak ses IMHO docela zmýlil.
PREVENT/ALLOW MEDIUM REMOVAL - zamknu eject mechanismus TEST UNIT READY - test jestli je tam médium a jestli je jednotka ready GET CONFIGURATION - získání aktuálního profilu (podle profilu se určí typ vloženého média (u příkladu DVD+RW)) READ DISC INFORMATION - zkontroluju jestli je naformátováno SET STREAMING - nastavím rychlost pálení FORMAT UNIT - pokud není naformátováno, spustím background format série WRITE(10) popř. WRITE(12) - zapíšu data SYNCHRONIZE CACHE - flush (DVD+RW se nezavírá, nikdy) Pokud stále běží background format tak CLOSE TRACK/SESSION na ukončení formátování PREVENT/ALLOW MEDIUM REMOVAL - povolím ejectSnad jsem nic nezapomněl
Děláte WRITE a při tom se plní buffer a vypalovačka pálí. DVD+RW lze vypalovat "náhodně", není třeba sekvenční pálení, určíte si start sektor, počet sektorů, co pálíte a prostě pálíte. To samé platí o DVD-RAM a DVD-RW v Restricted overwrite módu (tj. naformátované). A pro zbytek ve write parameters mode page nastavíte BUFE bit (ochrana proti podtečení). Pokud nestíháte posílat WRITE a buffer palírny se vyprázdní, tak může dojít a) k průseru, b) provedení "linkingu".
Každopádně prostě vy děláte WRITE, vypalovačka si plní buffer daty, co jí posíláte a pálí. Data čtu v extra vlákně (SW buffer jsem pro zatím zvolil 64 MB, ale dneska asi nemá cenu šetřit, tak bych se nebál půl giga (vtip, samozřejmě půjde nastavit)).rozumíme si, že se nejedná o systémové volání write(), ale o SCSI příkaz WRITE(10), který posíláte přes ioctl(SG_IO) či write()?Aha, tak už jo.
posíláteMy? No my toho neposíláme.
My? No my toho neposíláme.sry