[Gulli] [PROGRAMMAZIONE] Contribuire al kernel di Linux

Daniele Forsi dforsi@gmail.com
Dom 15 Ott 2017 20:52:12 CEST


= Il programma di esempio =

Insieme ai sorgenti del kernel di Linux sono forniti die programmi di
esempio, tra cui samples/uhid/uhid-example.c che permette di emulare
il mouse di sistema usando la tastiera (non è il modo migliore per
emulare un mouse o una tastiera, è solo un esempio di una tecnica
particolare che potrebbe essere usata anche per gestire dispositivi di
altri tipi).

= La compilazione =

La compilazione è molto semplice perché è necessario solo un file
include specifico di Linux e questo è un vantaggio notevole.
La parte fondamentale di questo driver d'esempio sembra funzionare a
dovere, ma la qualità del codice potrebbe essere maggiore perché ci
sono dei warning, degli errori concettuali e dei problemi di stile.

= Warning =

Ci sono dei warning (avvertimenti del compilatore) relativi alle
direttive di formattazione di fprintf(), del tipo:
warning: format ‘%ld’ expects argument of type ‘long int’, but
argument 3 has type ‘ssize_t {aka int}’
può darsi che questo esempio sia stato scritto prima che gcc facesse
questo tipo di controllo, sono facili da correggere ("man 3 printf" e
poi cercare ssize_t) ma non è un buon inizio.

= Errori concettuali =

Guardando il sorgente salta subito all'occhio un errore concettuale
ripetuto più volte, del tipo:
ret = ...;
if (ret < 0) {
               fprintf(stderr, ...);
               return -errno;
}
è proprio l'errore descritto nelle note di "man errno", cioè la
sovrascrittura di errno prima del suo uso.

= Stile =

Ci sono anche delle scelte discutibili nei nomi delle funzioni, come
create() e destroy() perché con questi nomi generici è necessario
leggere le loro definizioni per capire cosa creano e cosa distruggono
e anche leggendole non è evidente cosa fanno perché sono azioni
specifiche relative a HID/UHID che chi sta leggendo questo esempio non
conosce, altrimenti non avrebbe bisogno dell'esempio...

= Il prossimo passo =

Il prossimo passo è fare un passo indietro: avevo scaricato solo il
sorgente dell'esempio, ma per capire a chi devo mandare eventuali
correzioni mi servono tutti i sorgenti di Linux che contengono le
istruzioni (nel file MAINTAINERS).

Potrei scaricare solo l'archivio della versione più recente da
https://www.kernel.org/ ma preferisco scaricare un repository git
perché contiene anche tutte le versioni passate e posso vedere se sono
state fatte modifiche al file dell'esempio. Sapendo già come funziona
lo sviluppo del kernel, immagino che dovrò fare le modifiche sul
repository dedicato a HID e ce ne è uno solo fra tutti quelli elencati
in https://git.kernel.org/

$ git clone https://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git/
Cloning into 'hid'...
remote: Counting objects: 5622147, done.
remote: Compressing objects: 100% (861941/861941), done.
remote: Total 5622147 (delta 4718842), reused 5620950 (delta 4718034)
Ricezione degli oggetti: 100% (5622147/5622147), 967.37 MiB | 715.00
KiB/s, done.
Risoluzione dei delta: 100% (4718842/4718842), done.
Checking out files: 100% (61287/61287), done.
$ du -sh hid
2,0G    hid

-- 
Daniele Forsi


Maggiori informazioni sulla lista Gulli