1 /**
2  * D header file for FreeBSD.
3  *
4  * Copyright: Copyright Martin Nowak 2012.
5  * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6  * Authors:   Martin Nowak
7  */
8 module core.sys.freebsd.dlfcn;
9 
10 public import core.sys.posix.dlfcn;
11 
12 version (FreeBSD):
13 extern (C):
14 nothrow:
15 @nogc:
16 
17 enum __BSD_VISIBLE = true;
18 
19 /*
20  * Request arguments for dlinfo().
21  */
22 enum RTLD_DI_LINKMAP     = 2;    /* Obtain link map. */
23 enum RTLD_DI_SERINFO     = 4;    /* Obtain search path info. */
24 enum RTLD_DI_SERINFOSIZE = 5;    /*  ... query for required space. */
25 enum RTLD_DI_ORIGIN      = 6;    /* Obtain object origin */
26 enum RTLD_DI_MAX         = RTLD_DI_ORIGIN;
27 
28 /*
29  * Special handle arguments for dlsym()/dlinfo().
30  */
31 enum RTLD_NEXT    = cast(void *)-1;    /* Search subsequent objects. */
32 enum RTLD_DEFAULT = cast(void *)-2;    /* Use default search algorithm. */
33 enum RTLD_SELF    = cast(void *)-3;    /* Search the caller itself. */
34 
35 static if (__BSD_VISIBLE)
36 {
37     /*-
38      * The actual type declared by this typedef is immaterial, provided that
39      * it is a function pointer.  Its purpose is to provide a return type for
40      * dlfunc() which can be cast to a function pointer type without depending
41      * on behavior undefined by the C standard, which might trigger a compiler
42      * diagnostic.  We intentionally declare a unique type signature to force
43      * a diagnostic should the application not cast the return value of dlfunc()
44      * appropriately.
45      */
46     struct __dlfunc_arg {
47         int     __dlfunc_dummy;
48     }
49 
50     alias dlfunc_t = void function(__dlfunc_arg);
51 
52     /*
53      * Structures, returned by the RTLD_DI_SERINFO dlinfo() request.
54      */
55     struct Dl_serpath {
56         char *          dls_name;       /* single search path entry */
57         uint            dls_flags;      /* path information */
58     }
59 
60     struct Dl_serinfo {
61         size_t          dls_size;       /* total buffer size */
62         uint            dls_cnt;        /* number of path entries */
63         Dl_serpath[1]   dls_serpath;    /* there may be more than one */
64     }
65 }
66 
67 /* XSI functions first. */
68 extern(C) {
69     static assert(is(typeof(&dlclose) == int function(void*)));
70     static assert(is(typeof(&dlerror) == char* function()));
71     static assert(is(typeof(&dlopen)  == void* function(const scope char*, int)));
72     static assert(is(typeof(&dlsym)   == void* function(void*, const scope char*)));
73 }
74 
75 static if (__BSD_VISIBLE)
76 {
77     void*    fdlopen(int, int);
78     dlfunc_t dlfunc(void*, const(char)*);
79     int      dlinfo(void*, int, void*);
80     void     dllockinit(void* _context,
81         void* function(void* _context) _lock_create,
82         void  function(void* _lock)    _rlock_acquire,
83         void  function(void* _lock)    _wlock_acquire,
84         void  function(void* _lock)    _lock_release,
85         void  function(void* _lock)    _lock_destroy,
86         void  function(void* _context) _context_destroy);
87     void*    dlvsym(void*, const(char)*, const(char)*);
88 }