Wed Oct 28 15:48:47 2009

Asterisk developer's documentation


dlfcn-compat.h File Reference

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  dl_info

Defines

#define dl_restrict
#define RTLD_DEFAULT   ((void *) -2)
#define RTLD_GLOBAL   0x8
#define RTLD_LAZY   0x1
#define RTLD_LOCAL   0x4
#define RTLD_NEXT   ((void *) -1)
#define RTLD_NODELETE   0x80
#define RTLD_NOLOAD   0x10
#define RTLD_NOW   0x2

Typedefs

typedef struct dl_info Dl_info

Functions

int dladdr (const void *dl_restrict, Dl_info *dl_restrict)
int dlclose (void *handle)
const char * dlerror (void)
void * dlopen (const char *path, int mode)
void * dlsym (void *dl_restrict handle, const char *dl_restrict symbol)


Define Documentation

#define dl_restrict

Definition at line 52 of file dlfcn-compat.h.

#define RTLD_DEFAULT   ((void *) -2)

Definition at line 82 of file dlfcn-compat.h.

Referenced by dlsymIntern().

#define RTLD_GLOBAL   0x8

Definition at line 74 of file dlfcn-compat.h.

Referenced by __load_resource(), loadModule(), and reference().

#define RTLD_LAZY   0x1

Definition at line 71 of file dlfcn-compat.h.

Referenced by __load_resource(), and dlopen().

#define RTLD_LOCAL   0x4

Definition at line 73 of file dlfcn-compat.h.

#define RTLD_NEXT   ((void *) -1)

Definition at line 81 of file dlfcn-compat.h.

Referenced by dlsymIntern().

#define RTLD_NODELETE   0x80

Definition at line 76 of file dlfcn-compat.h.

Referenced by dlclose().

#define RTLD_NOLOAD   0x10

Definition at line 75 of file dlfcn-compat.h.

Referenced by dlopen().

#define RTLD_NOW   0x2

Definition at line 72 of file dlfcn-compat.h.


Typedef Documentation

typedef struct dl_info Dl_info


Function Documentation

int dladdr ( const void *  dl_restrict,
Dl_info dl_restrict 
)

int dlclose ( void *  handle  ) 

Definition at line 1041 of file dlfcn.c.

References debug, dlsymIntern(), dolock(), dounlock(), error(), get_lib_name(), get_mach_header_from_NSModule(), isFlagSet(), isValidStatus(), dlstatus::lib, MAGIC_DYLIB_MOD, dlstatus::mode, dlstatus::module, name, dlstatus::refs, resetdlerror(), RTLD_NODELETE, and warning().

Referenced by __load_resource(), and ast_unload_resource().

01042 {
01043    struct dlstatus *dls = handle;
01044    dolock();
01045    resetdlerror();
01046    if (!isValidStatus(dls))
01047    {
01048       goto dlcloseerror;
01049    }
01050    if (dls->module == MAGIC_DYLIB_MOD)
01051    {
01052       const char *name;
01053       if (!dls->lib)
01054       {
01055          name = "global context";
01056       }
01057       else
01058       {
01059          name = get_lib_name(dls->lib);
01060       }
01061       warning("trying to close a .dylib!");
01062       error("Not closing \"%s\" - dynamic libraries cannot be closed", name);
01063       goto dlcloseerror;
01064    }
01065    if (!dls->module)
01066    {
01067       error("module already closed");
01068       goto dlcloseerror;
01069    }
01070    
01071    if (dls->refs == 1)
01072    {
01073       unsigned long options = 0;
01074       void (*fini) (void);
01075       if ((fini = dlsymIntern(dls, "__fini", 0)))
01076       {
01077          debug("calling _fini()");
01078          fini();
01079       }
01080 #ifdef __ppc__
01081       options |= NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES;
01082 #endif
01083 #if 1
01084 /*  Currently, if a module contains c++ static destructors and it is unloaded, we
01085  *  get a segfault in atexit(), due to compiler and dynamic loader differences of
01086  *  opinion, this works around that.
01087  *  I really need a way to figure out from code if this is still necessary.
01088  */
01089       if ((const struct section *)NULL !=
01090          getsectbynamefromheader(get_mach_header_from_NSModule(dls->module),
01091                            "__DATA", "__mod_term_func"))
01092       {
01093          options |= NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED;
01094       }
01095 #endif
01096 #ifdef RTLD_NODELETE
01097       if (isFlagSet(dls->mode, RTLD_NODELETE))
01098          options |= NSUNLINKMODULE_OPTION_KEEP_MEMORY_MAPPED;
01099 #endif
01100       if (!NSUnLinkModule(dls->module, options))
01101       {
01102          error("unable to unlink module");
01103          goto dlcloseerror;
01104       }
01105       dls->refs--;
01106       dls->module = 0;
01107       /* Note: the dlstatus struct dls is neither removed from the list
01108        * nor is the memory it occupies freed. This shouldn't pose a 
01109        * problem in mostly all cases, though.
01110        */
01111    }
01112    dounlock();
01113    return 0;
01114   dlcloseerror:
01115    dounlock();
01116    return 1;
01117 }

const char* dlerror ( void   ) 

Definition at line 1119 of file dlfcn.c.

References dlerror_key, dlthread::errset, and dlthread::errstr.

Referenced by __load_resource().

01120 {
01121    struct dlthread  *tss;
01122    char * err_str;
01123    tss = pthread_getspecific(dlerror_key);
01124    err_str = tss->errstr;
01125    tss = pthread_getspecific(dlerror_key);
01126    if (tss->errset == 0)
01127       return 0;
01128    tss->errset = 0;  
01129    return (err_str );
01130 }

void* dlopen ( const char *  path,
int  mode 
)

Definition at line 897 of file dlfcn.c.

References dlcompat_init_func(), dolock(), dounlock(), error(), findFile(), isFlagSet(), loadModule(), lookupStatus(), reference(), dlstatus::refs, resetdlerror(), RTLD_LAZY, RTLD_NOLOAD, and RTLD_NOW.

Referenced by __load_resource().

00898 {
00899    const struct stat *sbuf;
00900    struct dlstatus *dls;
00901    const char *fullPath;
00902    dlcompat_init_func();      /* Just in case */
00903    dolock();
00904    resetdlerror();
00905    if (!path)
00906    {
00907       dls = &mainStatus;
00908       goto dlopenok;
00909    }
00910    if (!(sbuf = findFile(path, &fullPath)))
00911    {
00912       error("file \"%s\" not found", path);
00913       goto dlopenerror;
00914    }
00915    /* Now checks that it hasn't been closed already */
00916    if ((dls = lookupStatus(sbuf)) && (dls->refs > 0))
00917    {
00918       /* debug("status found"); */
00919       dls = reference(dls, mode);
00920       goto dlopenok;
00921    }
00922 #ifdef   RTLD_NOLOAD
00923    if (isFlagSet(mode, RTLD_NOLOAD))
00924    {
00925       error("no existing handle and RTLD_NOLOAD specified");
00926       goto dlopenerror;
00927    }
00928 #endif
00929    if (isFlagSet(mode, RTLD_LAZY) && isFlagSet(mode, RTLD_NOW))
00930    {
00931       error("how can I load something both RTLD_LAZY and RTLD_NOW?");
00932       goto dlopenerror;
00933    }
00934    dls = loadModule(fullPath, sbuf, mode);
00935    
00936   dlopenok:
00937    dounlock();
00938    return (void *)dls;
00939   dlopenerror:
00940    dounlock();
00941    return NULL;
00942 }

void* dlsym ( void *dl_restrict  handle,
const char *dl_restrict  symbol 
)

Definition at line 945 of file dlfcn.c.

References dlsymIntern(), dolock(), dounlock(), error(), free, and malloc.

Referenced by __load_resource().

00946 {
00947    int sym_len = strlen(symbol);
00948    void *value = NULL;
00949    char *malloc_sym = NULL;
00950    dolock();
00951    malloc_sym = malloc(sym_len + 2);
00952    if (malloc_sym)
00953    {
00954       sprintf(malloc_sym, "_%s", symbol);
00955       value = dlsymIntern(handle, malloc_sym, 1);
00956       free(malloc_sym);
00957    }
00958    else
00959    {
00960       error("Unable to allocate memory");
00961       goto dlsymerror;
00962    }
00963    dounlock();
00964    return value;
00965   dlsymerror:
00966    dounlock();
00967    return NULL;
00968 }


Generated on Wed Oct 28 15:48:47 2009 for Asterisk - the Open Source PBX by  doxygen 1.5.6