Présentation du problème
La partie probablement la plus importante d’un module Apache est la structure module, qui est définie dans http_config.h. Par conséquent, tous les modules doivent commencer (exception faite des notes de copyright, etc.) par les lignes suivantes :
#include "httpd.h"
#include "http_config.h"
Notez que httpd.h est nécessaire pour tout code source Apache.
À quoi sert la structure module ? C’est simple : elle sert de raccord entre le noyau Apache et le code du module. Elle contient des pointeurs (de fonctions, de listes, etc.) utilisés par les composants du noyau au moment venu. Le noyau connaît les différentes structures module parce qu’elles sont énumérées dans modules.c, qui est produit par le script Configure à partir du fichier Configuration.
Traditionnellement, tout module se termine par sa structure module. Voici un exemple particulièrement trivial, tiré de mod_asis.c (1.3) :
module asis_module = {
STANDARD_MODULE_STUFF,
NULL, /* initialisateur */
NULL, /* crée une structure de config répertoire */
NULL, /* fusionne des structures de config répertoire */
NULL, /* crée une structure de config serveur */
NULL, /* fusionne des structures de config serveur */
NULL, /* tableau de commandes */
asis_handlers, /* handlers */
NULL, /* traduction de handler */
NULL, /* vérif. de l’id utilisateur */
NULL, /* vérif. auth */
NULL, /* vérif. accès */
NULL, /* vérif. type */
NULL, /* prerun fixups */
NULL /* logger */
NULL, /* analyse des en-têtes */
NULL, /* initialisation fils */
NULL, /* sortie fils */
NULL /* requête de lecture */
};
Le premier champ, STANDARD_MODULE_STUFF, doit apparaître dans toutes les structures module. Il initialise certains éléments de la structure, que le noyau utilise pour gérer les modules. Actuellement, ce sont le numéro de version de l’API, l’indice du module dans les différents tableaux, le nom du module (son nom de fichier, en fait) et un pointeur vers la structure module suivante dans une liste chaînée de tous les modules.
Le seul autre champ est handlers. Nous l’étudierons plus en détails ensuite. Pour l’instant, il suffit de dire que ce champ pointe vers une liste de chaînes et de fonctions définissant la relation entre les types MIME ou handler et les fonctions qui les traitent. Tous les autres champs valent NULL, ce qui signifie simplement que le module n’utilise pas ces hooks particuliers.
La structure équivalente pour 2.0 ressemble à ceci :
static void register_hooks(apr_pool_t *p)
{
ap_hook_handler(asis_handler,NULL,NULL,APR_HOOK_MIDDLE);
}
module AP_MODULE_DECLARE_DATA asis_module =
{
STANDARD20_MODULE_STUFF,
NULL, /* crée une structure de config répertoire */
NULL, /* fusionne les structures de config répertoire */
NULL, /* crée une structure de config serveur */
NULL, /* fusionne les structures de config serveur */
NULL, /* apr_table_t (commandes)*/
register_hooks /* register hooks */
};
Vous remarquerez que l’on doit indiquer la fonction register_hooks( ) pour que cela corresponde à la fonctionnalité de la structure de module 1.3. Une fois de plus, STANDARD20_MODULE_STUFF est nécessaire pour toutes les structures de module et la fonction register_hooks( ) remplace l’essentiel du reste de l’ancienne structure 1.3. Le fonctionnement de tout ceci est décrit dans la section suivante.