perl
view release on metacpan or search on metacpan
ext/DynaLoader/dl_aix.xs view on Meta::CPAN
# define AIX_LDSYM LDSYM
# define AIX_LDHDRSZ LDHDRSZ
#endif
/* When using Perl extensions written in C++ the longer versions
* of load() and unload() from libC and libC_r need to be used,
* otherwise statics in the extensions won't get initialized right.
* -- Stephanie Beals <bealzy@us.ibm.com> */
/* Older AIX C compilers cannot deal with C++ double-slash comments in
the ibmcxx and/or xlC includes. Since we only need a single file,
be more fine-grained about what's included <hirschs@btv.ibm.com> */
#ifdef USE_libC /* The define comes, when it comes, from hints/aix.pl. */
# define LOAD loadAndInit
# define UNLOAD terminateAndUnload
# if defined(USE_vacpp_load_h)
# include "/usr/vacpp/include/load.h"
# elif defined(USE_ibmcxx_load_h)
# include "/usr/ibmcxx/include/load.h"
# elif defined(USE_xlC_load_h)
# include "/usr/lpp/xlC/include/load.h"
# elif defined(USE_load_h)
# include "/usr/include/load.h"
# endif
#else
# define LOAD load
# define UNLOAD unload
#endif
/*
* AIX 4.3 does remove some useful definitions from ldfcn.h. Define
* these here to compensate for that lossage.
*/
#ifndef BEGINNING
# define BEGINNING SEEK_SET
#endif
#ifndef FSEEK
# define FSEEK(ldptr,o,p) fseek(IOPTR(ldptr),(p==BEGINNING)?(OFFSET(ldptr) +o):o,p)
#endif
#ifndef FREAD
# define FREAD(p,s,n,ldptr) fread(p,s,n,IOPTR(ldptr))
#endif
#ifndef RTLD_LAZY
# define RTLD_LAZY 0
#endif
#ifndef RTLD_GLOBAL
# define RTLD_GLOBAL 0
#endif
/*
* We simulate dlopen() et al. through a call to load. Because AIX has
* no call to find an exported symbol we read the loader section of the
* loaded module and build a list of exported symbols and their virtual
* address.
*/
typedef struct {
char *name; /* the symbols's name */
void *addr; /* its relocated virtual address */
} Export, *ExportPtr;
/*
* The void * handle returned from dlopen is actually a ModulePtr.
*/
typedef struct Module {
struct Module *next;
char *name; /* module name for refcounting */
int refCnt; /* the number of references */
void *entry; /* entry point from load */
int nExports; /* the number of exports found */
ExportPtr exports; /* the array of exports */
} Module, *ModulePtr;
typedef struct {
/*
* We keep a list of all loaded modules to be able to reference count
* duplicate dlopen's.
*/
ModulePtr x_modList;
/*
* The last error from one of the dl* routines is kept in static
* variables here. Each error is returned only once to the caller.
*/
char x_errbuf[BUFSIZ];
int x_errvalid;
void * x_mainModule;
} my_cxtx_t; /* this *must* be named my_cxtx_t */
#define DL_CXT_EXTRA /* ask for dl_cxtx to be defined in dlutils.c */
#include "dlutils.c" /* SaveError() etc */
#define dl_modList (dl_cxtx.x_modList)
#define dl_errbuf (dl_cxtx.x_errbuf)
#define dl_errvalid (dl_cxtx.x_errvalid)
#define dl_mainModule (dl_cxtx.x_mainModule)
static void caterr(char *);
static int readExports(ModulePtr);
static void *findMain(void);
/* these statics are ok because they're constants */
static char *strerror_failed = "(strerror failed)";
static char *strerror_r_failed = "(strerror_r failed)";
char *strerrorcat(char *str, int err) {
int strsiz = strlen(str);
int msgsiz;
char *msg;
dTHX;
if ((msg = strerror(err)) == 0)
msg = strerror_failed;
msgsiz = strlen(msg); /* Note msg = buf and free() above. */
if (strsiz + msgsiz < BUFSIZ) /* Do not move this after #endif. */
strcat(str, msg);
return str;
( run in 0.578 second using v1.01-cache-2.11-cpan-5511b514fd6 )