Hallo,
Ich habe wiedermal ein Problem bei dem ich nicht weiter komme, und zwar programmiere ich schon seit einiger Zeit ein Apache modul.
Nun bin ich "dummer weise" auf die Idee gekommen einige funktionen in shared objects auszulagern.
So weit funktioniert auch alles. Aber der Apache erstellt bei jedem request vom Internet einen neuen Process. Wenn ich die funktionen lade nachdem der neue Process erstellt wurde sind die funktionen vorhanden, aber ich würde gerne die funktionene vorher laden. Und bei diesem versuch, mittlerweile mit den standartfunktionen dlopen und dlsym und nicht mit den dafür vorgesehnen apr funktionen bekomme ich ein segment fault, wenn ich bei dlsym ankomme.
Würde mich sehr über hilfe oder tipps wo ich weitere informationen finde freuen.
MfG.
Patrick Weber
Ich habe wiedermal ein Problem bei dem ich nicht weiter komme, und zwar programmiere ich schon seit einiger Zeit ein Apache modul.
Nun bin ich "dummer weise" auf die Idee gekommen einige funktionen in shared objects auszulagern.
So weit funktioniert auch alles. Aber der Apache erstellt bei jedem request vom Internet einen neuen Process. Wenn ich die funktionen lade nachdem der neue Process erstellt wurde sind die funktionen vorhanden, aber ich würde gerne die funktionene vorher laden. Und bei diesem versuch, mittlerweile mit den standartfunktionen dlopen und dlsym und nicht mit den dafür vorgesehnen apr funktionen bekomme ich ein segment fault, wenn ich bei dlsym ankomme.
Würde mich sehr über hilfe oder tipps wo ich weitere informationen finde freuen.
Code:
module AP_MODULE_DECLARE_DATA helloworld_module = {
STANDARD20_MODULE_STUFF,
module_init,
NULL,
create_helloworld_config,
merged_helloworld_config,
mod_helloworld_cmds,
helloworld_hooks
};
void *verschl_lib;
char *verschl_verz=0;
typedef char *(*pw_verschluesseln_t)(char*, char*, unsigned int, apr_pool_t*);
typedef char *(*pw_entschluesseln_t)(char*, char*, unsigned int, apr_pool_t*);
pw_verschluesseln_t pw_verschluesseln;
pw_entschluesseln_t pw_entschluesseln;
//einrichten der externen notwendigen funktionen
static int load_stdfunc(apr_pool_t *pool){
if(!(verschl_lib=dlopen(verschl_verz, RTLD_NOW|RTLD_GLOBAL))){
return 1;
}
printf("versch_lib:%i, %s\n",verschl_lib,verschl_verz);
if(!(pw_entschluesseln=(pw_entschluesseln_t)dlsym(verschl_lib,"pw_entschluesseln"))){
if(dlerror()){
return 2;
}
}
printf("versch_lib1:%i, %s\n",verschl_lib,verschl_verz);
if(!(pw_verschluesseln=(pw_verschluesseln_t)dlsym(verschl_lib,"pw_verschluesseln"))){
if(dlerror()){
return 2;
}
}
return 0;
}
static int init_stdfunc(apr_pool_t *pool){
//vorbereitung der externen notwendigen funktionen
verschl_verz=apr_palloc(pool,strlen(my_libs)+strlen("verschluesseln.so.1")+1);
sprintf(verschl_verz,"%s%s",my_libs,"verschluesseln.so.1");
if(!verschl_verz){
return 3;
}
return 0;
}
int set_global(apr_pool_t *pool){
// initialisieren der lib structuren
init_lib_structs(pool);
int st=0;
if(st=init_stdfunc(pool)){
}
dbg_fnrwrite_log("test","%i",st);
if(st=load_stdfunc(pool)){
dbg_fnrwrite_log("dl_load","%s","error");
}
}
//so funktioniert es, es wird bei jedem request neu geladen
static int helloworld_handler(request_rec *r)
{
dbg_fwrite_log(r,"debug","%s","request startet");
interp_cfg *r_cfg=ap_get_module_config(
r->server->module_config, &helloworld_module);
dbg_fwrite_log(r,"test","%s","lines");
if (!r_cfg->Status) {
return DECLINED;
}
set_global(r->pool);
#include "status.c"
return Verteiler(r,s_cfg,r_cfg);
}
// so funktioniert es nicht, soll nur einmal beim start des servers geladen werden
// und stürtz auch direkt beim laden des Servers ab, es muss keine zuladen funktion ausgeführt werden
static void helloworld_hooks(apr_pool_t *pool)
{
set_global(pool);
ap_hook_log_transaction(close_proc, NULL, NULL, APR_HOOK_MIDDLE);
//ap_hook_child_init(my_child_init, NULL, NULL, APR_HOOK_MIDDLE);//eventuell grund des fehlers bei dlopen und fork
ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE);
}
MfG.
Patrick Weber
Zuletzt bearbeitet: