#include "httpd.h"
typedef struct {
char libname[PATH_MAX + 3];
} t_mpe_dld, *p_mpe_dld;
extern void hpunload(
int parms,
char * symbolname,
char * libname,
int * status,
int * symboltype,
int casesensitive);
#ifdef __GNUC__
extern void HPGETPROCPLABEL(
int parms,
char * symbolname,
void * symboladdr,
int * status,
char * libname,
int casesensitive,
int symboltype,
int * datasize,
int position,
int searchpath,
int binding);
extern void HPERRMSG(
int parms,
int displaycode,
int depth,
short errorproc,
int errornum,
char * buffer,
short * buflength,
int * status);
#else
#pragma intrinsic HPERRMSG
#pragma intrinsic HPGETPROCPLABEL
#endif
int mpe_dl_status = 0;
char mpe_dl_errmsg[1024];
char mpe_dl_symname[128];
int mpe_dl_symtype;
void *dlopen(const char *libname, int flag) {
t_mpe_dld *handle;
char cwd[PATH_MAX+3];
char library[PATH_MAX+3];
void *symaddr;
int datalen;
if (libname[0] != '/') {
getcwd(cwd, sizeof(cwd));
ap_snprintf(library, sizeof(library), " %s/%s ", cwd, libname);
} else
ap_snprintf(library, sizeof(library), " %s ", libname);
#define MPE_WITHOUT_MPELX44
#ifdef MPE_WITHOUT_MPELX44
ap_cpystrn(mpe_dl_symname, " mpe_dl_stub ", sizeof(mpe_dl_symname));
mpe_dl_symtype = 0;
HPGETPROCPLABEL(
#ifdef __GNUC__
8,
#endif
mpe_dl_symname, &symaddr, &mpe_dl_status, library, 1,
mpe_dl_symtype, &datalen, 1, 0, 0);
#endif
mpe_dl_symtype = 2;
if ((handle = (t_mpe_dld *)malloc(sizeof(t_mpe_dld))) == NULL) return NULL;
memset(handle, 0, sizeof(t_mpe_dld));
ap_cpystrn(handle->libname,library,sizeof(handle->libname));
return handle;
}
void *dlsym(void *handle, const char *symbol) {
t_mpe_dld *myhandle = handle;
int datalen;
void * symaddr = NULL;
ap_snprintf(mpe_dl_symname, sizeof(mpe_dl_symname), " %s ", symbol);
mpe_dl_symtype = 1;
HPGETPROCPLABEL(
#ifdef __GNUC__
8,
#endif
mpe_dl_symname, &symaddr, &mpe_dl_status, myhandle->libname, 1,
mpe_dl_symtype, &datalen, 1, 0, 0);
if (mpe_dl_status != 0) {
return NULL;
} else {
return symaddr;
}
}
int dlclose(void *handle) {
p_mpe_dld myhandle = handle;
mpe_dl_symtype = 3;
hpunload(5, " @ ", myhandle->libname, &mpe_dl_status, NULL, 0);
free(handle);
if (mpe_dl_status == 0)
return 0;
else
return -1;
}
const char *dlerror(void) {
char errmsg[1024];
short buflen = sizeof(errmsg)-1;
int status;
char prefix[80];
if (mpe_dl_status == 0) return NULL;
switch (mpe_dl_symtype) {
case 0:
ap_snprintf(prefix,sizeof(prefix),
"HPGETPROCPLABEL() failed on procedure%s",mpe_dl_symname);
break;
case 1:
ap_snprintf(prefix,sizeof(prefix),
"HPGETPROCPLABEL() failed on data item%s",mpe_dl_symname);
break;
case 3:
ap_cpystrn(prefix,"hpunload() failed",sizeof(prefix));
break;
default:
ap_cpystrn(prefix,"Unknown MPE dynaloader error",sizeof(prefix));
break;
}
HPERRMSG(
#ifdef __GNUC__
7,
#endif
3, 0, 0, mpe_dl_status, (char *)&errmsg, &buflen, &status);
if (status == 0)
errmsg[buflen] = '\0';
else
ap_snprintf(errmsg,sizeof(errmsg),
"HPERRMSG failed (status=%x); MPE loader status = %x",
status, mpe_dl_status);
ap_snprintf(mpe_dl_errmsg,sizeof(mpe_dl_errmsg),"%s\n%s",prefix,errmsg);
return (char *)&mpe_dl_errmsg;
}