#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_WITHOUT_MPELX44 */
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;
}