I have something like this on 'radiusd.conf': ... modules{ ... pgping { } ... } ... Where 'rlm_pgping' is a module compiled and installed following the manual. My question is why does it not appear to load (i.e. not showing any messages with 'radiusd -X')? _the module code is on the end of the message_ I have other custom modules that works fine. Am I doing something wrong? On the other hand, I've been playing around with 'radiusd.conf' I've discovered that if I add some random module name in the module instantiation section, radiusd doesn't complain at all about it's non-existence! This is a little inconvenient. Thanks in advance, --- Tomás A. Rossi Ministerio de Economía Proyecto de Informática Buenos Aires, Argentina /* * rlm_pgping.c * * Este módulo se encarga de "pinguear" la base de datos primaria e informa si * la misma está caída (FAIL) o funcionando normalmente (OK). */ #include "autoconf.h" #include "libradius.h" #include <stdio.h> #include <stdlib.h> #include "radiusd.h" #include "modules.h" #include "conffile.h" #include "libpq-fe.h" /* * Estructura para la configuración del módulo. */ typedef struct rlm_pgping_t { char *host; char *dbname; char *user; char *password; char *port; int timeout; } rlm_pgping_t; /* * No hay parámetros de configuración. */ static CONF_PARSER module_config[] = { { "string", PW_TYPE_STRING_PTR, offsetof(rlm_pgping_t,host), NULL, "localhost" }, { "string", PW_TYPE_STRING_PTR, offsetof(rlm_pgping_t,dbname), NULL, "" }, { "string", PW_TYPE_STRING_PTR, offsetof(rlm_pgping_t,user), NULL, "" }, { "string", PW_TYPE_STRING_PTR, offsetof(rlm_pgping_t,password), NULL, "" }, { "string", PW_TYPE_STRING_PTR, offsetof(rlm_pgping_t,port), NULL, "" }, { "integer", PW_TYPE_INTEGER, offsetof(rlm_pgping_t,timeout), NULL, "30" }, { NULL, -1, 0, NULL, NULL } /* end the list */ }; static int mandar_pgping(void *inst, REQUEST *req) { char condata[256]; /* Buffer para guardar los datos de conexión. */ PGconn *con; /* Conexión a la base. */ DEBUG("PGPING: Empieza el modulo"); /*req = req;*/ #define INST ((rlm_pgping_t *)inst) snprintf(condata, sizeof(condata)-1, "host=%s port=%s dbname=%s user=%s " "password='%s' connect_timeout=%d", INST->host, INST->port, INST->dbname, INST->user, INST->password, INST->timeout); con = PQconnectdb(condata); DEBUG("Intentando conectar a la base primaria con datos de conexión: '%s'", condata); if (PQstatus(con) == CONNECTION_BAD) { radlog(L_AUTH, "Falló la conexión a la base primaria."); return RLM_MODULE_FAIL; } return RLM_MODULE_OK; } static int pgping_init(void) { return 0; } /* * Hay que leer los parámetros de configuración para la instancia. */ static int pgping_instantiate(CONF_SECTION *conf, void **instance) { rlm_pgping_t *conf_data; /* * Pedir memoria para los parámetros de configuración. */ conf_data = rad_malloc(sizeof(*conf_data)); if (!conf_data) { return RLM_MODULE_FAIL; } memset(conf_data, 0, sizeof(*conf_data)); /* * Si falla el "parseo" del archivo de configuración para el módulo, CHAU!. */ if (cf_section_parse(conf, conf_data, module_config) < 0) { free(conf_data); return RLM_MODULE_FAIL; } *instance = conf_data; return RLM_MODULE_OK; } static int pgping_detach(void *inst) { free(INST->host); free(INST->port); free(INST->dbname); free(INST->user); free(INST->password); free(inst); return 0; } /* * The module name should be the only globally exported symbol. * That is, everything else should be 'static'. * * If the module needs to temporarily modify it's instantiation * data, the type should be changed to RLM_TYPE_THREAD_UNSAFE. * The server will then take care of ensuring that the module * is single-threaded. */ module_t rlm_pgping = { "pgping", RLM_TYPE_THREAD_SAFE, /* type */ pgping_init, /* initialization */ pgping_instantiate, /* instantiation */ { mandar_pgping, /* authentication */ mandar_pgping, /* authorization */ mandar_pgping, /* preaccounting */ mandar_pgping, /* accounting */ NULL, /* checksimul */ NULL, /* pre-proxy */ NULL, /* post-proxy */ NULL /* post-auth */ }, pgping_detach, /* detach */ NULL, /* destroy */ };