Swisslinux.org

− Le carrefour GNU/Linux en Suisse −

 

Langue

 

Le Forum

Vous n'êtes pas identifié.

#1 25 Oct 2010 16:30:03

PierreG
Citoyen(ne)
Lieu: 40km from Zurich
Date d'inscription: 21 Oct 2010
Messages: 18
Site web

[C] API hooking pour les appels de socket BSD

Je travaille sur des 'continuations' en C (voir call/cc SHEME)
et je voudrais rendre ces fonctions disponibles par défaut
dans les appels de socket (accept, read, write) qui bloquent.

Cela permet de rendre ces appels bloquants asynchrones
TOUT EN programmant de manière procédurale (pas de
state-machine pour traiter les évênements, comme avec
les appels non-bloquants).

Pour que cela marche avec le code existant (librairies de
protocoles réseau, ou interfaces SQL, etc.) il faut que je
puisse encapsuler ou intercepter les appels de socket pour
gérer les "continuations" de manière transparente.

J'ai entendu parler de #undef et #define pour "overloader"
les fonctions mais je suis débutant sous Linux.

Savez-vous comment faire? Toute suggestion est bienvenue!

Pierre.


"He who can does. He who cannot teaches".
(George Bernard Shaw)

Hors ligne

 

#2 02 Nov 2010 20:20:47

[GO]Skywalker13
Modérateur
Lieu: Choëx (VS)
Date d'inscription: 05 Oct 2004
Messages: 896
Site web

Re: [C] API hooking pour les appels de socket BSD

Tu peux surcharger n'importe quelles fonctions non-static via LD_PRELOAD (voir ton moteur de recherche favori) et passer par dlopen pour chopper les vrais fonctions.


Mathieu SCHROETER
log.schroetersa.ch

Hors ligne

 

#3 03 Nov 2010 14:47:00

jean@adimp.ch
Illuminé(e)
Lieu: Marly
Date d'inscription: 10 Mar 2005
Messages: 1228
Site web

Re: [C] API hooking pour les appels de socket BSD

Salut,
Je ne comprends pas la question. Dans un code source C/C++ il peut y avoir des lignes qui commencent par le #. Ce sont des instructions de "précompillation". 
Par exemple si dans un fichier il y a cette ligne :

Code:

#define AIRE_DU_CERCLE(x) (3.14 * ( x ) * ( x ))

alors lors de la phase de précompilation le texte "aire =  AIRE_DU_CERCLE(2);" est remplacée par "aire = (3.14 * ( 2 ) * ( 2 ));"
Pour enlever cette directive il es possible d'utiliser la directive #undef...

Plus d'explications ici : http://www2.ift.ulaval.ca/~dupuis/Progr … lation.pdf

Meilleures salutations.

PS : autre exemple piqué ici http://homepage.mac.com/pierremousel/La … eProc.html

Code:

#define pi 3.1415926536
circonference = 2 * pi * rayon;
#undef pi
#define pi "3.1415"
printf ("pi vaut %s", pi);

Dernière modification par jean@adimp.ch (03 Nov 2010 23:07:56)


--------------------------------------------------------
Jean Tinguely Awais
Ma vie sur twitter : http://www.twitter.com/tservi

Hors ligne

 

#4 03 Nov 2010 20:21:07

[GO]Skywalker13
Modérateur
Lieu: Choëx (VS)
Date d'inscription: 05 Oct 2004
Messages: 896
Site web

Re: [C] API hooking pour les appels de socket BSD

En fait tu peux aussi "surcharger" avec un #define :-) mais c'est au niveau de la compilation et non en runtime. Il arrive que c'est utile de faire des hooks du point de vue des sources.

Par exemple tu as une bibliothèque qui te donne accès à la fonction void foobar(int a) et tu l'utilises dans un gros programme à beaucoup d'endroits. Pour différentes raisons tu ne veux pas faire du hack dans tous les coins, alors tu fais :

Code:

#undef foobar
#define foobar my_foobar

pour que ca appel bien ta fonction et non l'original (je le fais d'ailleurs ces jours-ci dans un projet très particulier).

Mais cette façon de faire peu avoir des effets de bords selon l'endroit où est utilisé le mot "foobar". Alors faut faire attention avec ça.

Mieux:

Code:

#undef foobar
#define foobar(a) my_foobar(a)

le premier exemple je l'utilise en réalité avec des noms de classes (dans mon projet spécial). Si c'est une fonction alors en passant par un paramètre c'est bcp plus sûr.


Mathieu SCHROETER
log.schroetersa.ch

Hors ligne

 

Pied de page des forums

Powered by FluxBB