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 */
8module core.sys.freebsd.dlfcn;
9
10public import core.sys.posix.dlfcn;
11
12version (FreeBSD):
13extern (C):
14nothrow:
15@nogc:
16
17enum __BSD_VISIBLE = true;
18
19/*
20 * Request arguments for dlinfo().
21 */
22enum RTLD_DI_LINKMAP     = 2;    /* Obtain link map. */
23enum RTLD_DI_SERINFO     = 4;    /* Obtain search path info. */
24enum RTLD_DI_SERINFOSIZE = 5;    /*  ... query for required space. */
25enum RTLD_DI_ORIGIN      = 6;    /* Obtain object origin */
26enum RTLD_DI_MAX         = RTLD_DI_ORIGIN;
27
28/*
29 * Special handle arguments for dlsym()/dlinfo().
30 */
31enum RTLD_NEXT    = cast(void *)-1;    /* Search subsequent objects. */
32enum RTLD_DEFAULT = cast(void *)-2;    /* Use default search algorithm. */
33enum RTLD_SELF    = cast(void *)-3;    /* Search the caller itself. */
34
35static 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. */
68extern(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
75static 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}
89