Programación de un módulo de apache simple
La programación de un módulo sencillo para el apache no son muchas lineas. Vamos a ver como realizar un módulo simple (“Hello World“).
#include "httpd.h"
#include "http_config.h"
static int hello_world_modulo_apache (request_rec *r)
{
fprintf(stderr,"modulo ejemplo apache: Hello World.\n");
return DECLINED;
}
static void register_hooks(apr_pool_t *p)
{
ap_hook_handler(hello_world_modulo_apache, NULL, NULL, APR_HOOK_REALLY_FIRST);
}
module AP_MODULE_DECLARE_DATA mod_ejemplo =
{
STANDARD20_MODULE_STUFF,
NULL,
NULL,
NULL,
NULL,
NULL,
register_hooks
};
Vamos a ver por partes el código:
-
static int hello_world_modulo_apache (request_rec *r)
Definimos la acción que va a realizar el módulo, en este caso imprimir por stderr (en el error log) la cadena “Hello World“
-
static void register_hooks(apr_pool_t *p)
Definimos la función que va a registrar los hooks (puntos del proceso de una petición) en los que el módulo va a actuar
-
module AP_MODULE_DECLARE_DATA mod_ejemplo =
Definimos la estructura de datos que luego el apache va a leer para registrar el módulo y activarlo
Para compilar el módulo lo deberemos hacer mediante este comando (evidentemente deberemos adaptar los paths a nuestro sistema):
# gcc $(/usr/local/apache22/bin/apr-1-config --cppflags) $(/usr/local/apache22/bin/apr-1-config --cflags) -fPIC -DSHARED_MODULE -I/usr/local/apache2/include/ -c mod_ejemplo.c # ld -Bshareable -o mod_ejemplo.so mod_ejemplo.o # cp mod_ejemplo.so /usr/local/apache2/modules/
Para cargar el módulo deberemos añadir en el fichero httpd.conf la siguiente línea:
LoadModule mod_ejemplo modules/mod_ejemplo.so
El primer parámetro indica el nombre de la estructura de datos AP_MODULE_DECLARE_DATA, siendo el segundo parámetro el path donde se encuentra el módulo.
Una vez reiniciado el apache podremos ver como se escribe en el logs/error_log la cadena:
modulo ejemplo apache: Hello World.
Veremos que no aparece inmediatamente después de cada petición, esto es porque no se realiza el flush, podemos forzarlo mediante fflush inmediatamente después del fprintf:
fflush(stderr);
Relacionados
Imprimir
Deja un comentario: