[Tech] [C] Passaggio numero variabile di argomenti

Gianni Bianchini giannibi@firenze.linux.it
Lun 15 Set 2003 18:53:27 CEST


Ciao. Non sono riuscito a trovare una soluzione elegante e portabile
al problema che vi espongo.

Si tratta di scrivere una funzione C che prenda un numero variabile di
argomenti e passi tutti o alcuni di questi argomenti ad una seconda
funzione, *alla cui implementazione non ho accesso*, che a sua volta
prende un numero variabile di parametri.
Supponiamo ad esempio di voler fare un "override" di ioctl(), che ha
il seguente prototipo:

int ioctl (int fd, unsigned long int request, ...)

con una funzione my_ioctl(), con prototipo

int my_ioctl (int fd, unsigned long int request, ...)

La my_ioctl(), chiamata ad es. da main(), chiama a sua volta la ioctl()
originaria dopo aver fatto una qualche elaborazione, e quindi dovra'
passare ad essa gli opportuni parametri che ha ricevuto dal chiamante. 
Il problema e' che la chiamata a ioctl(), se fatta in modo standard,
dev'essere del tipo

x = ioctl(fd, request, pippo1, pippo2)

con pippo1 e pippo2 (o in generale il numero di argomenti) noto a
compile-time, mentre il numero di parametri effettivi varia ad ogni
singola chiamata. Il numero di parametri ed il loro valore e'
naturalmente recuperabile con stdarg.

Una soluzione non portabile e' la seguente, almeno in linea di
principio: si pigiano a mano nello stack tutti i parametri 
(quanti sono lo sappiamo) e si fa una call (del processore) a ioctl(),
ma questo richiede qualche riga di assembler, cosa che vorrei evitare.

Nei documenti che ho trovato, questo sembrerebbe l'unico modo, ma
ci sta che esista una soluzione che usi solo il C. Qualcuno ne ha per
caso sentito parlare?

Nota: ribadisco l'ipotesi che la ioctl originale *non si possa toccare*,
ovvero non sia possibile crearne una versione alternativa con un
prototipo diverso.

Ciao.
Gianni.  




Maggiori informazioni sulla lista flug-tech