Annotation of sbbs/include/mozilla/nspr/prlink.h, revision 1.1.1.1

1.1       root        1: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
                      2: /* 
                      3:  * The contents of this file are subject to the Mozilla Public
                      4:  * License Version 1.1 (the "License"); you may not use this file
                      5:  * except in compliance with the License. You may obtain a copy of
                      6:  * the License at http://www.mozilla.org/MPL/
                      7:  * 
                      8:  * Software distributed under the License is distributed on an "AS
                      9:  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
                     10:  * implied. See the License for the specific language governing
                     11:  * rights and limitations under the License.
                     12:  * 
                     13:  * The Original Code is the Netscape Portable Runtime (NSPR).
                     14:  * 
                     15:  * The Initial Developer of the Original Code is Netscape
                     16:  * Communications Corporation.  Portions created by Netscape are 
                     17:  * Copyright (C) 1998-2000 Netscape Communications Corporation.  All
                     18:  * Rights Reserved.
                     19:  * 
                     20:  * Contributor(s):
                     21:  * 
                     22:  * Alternatively, the contents of this file may be used under the
                     23:  * terms of the GNU General Public License Version 2 or later (the
                     24:  * "GPL"), in which case the provisions of the GPL are applicable 
                     25:  * instead of those above.  If you wish to allow use of your 
                     26:  * version of this file only under the terms of the GPL and not to
                     27:  * allow others to use your version of this file under the MPL,
                     28:  * indicate your decision by deleting the provisions above and
                     29:  * replace them with the notice and other provisions required by
                     30:  * the GPL.  If you do not delete the provisions above, a recipient
                     31:  * may use your version of this file under either the MPL or the
                     32:  * GPL.
                     33:  */
                     34: 
                     35: #ifndef prlink_h___
                     36: #define prlink_h___
                     37: 
                     38: /*
                     39: ** API to static and dynamic linking.
                     40: */
                     41: #include "prtypes.h"
                     42: 
                     43: PR_BEGIN_EXTERN_C
                     44: 
                     45: typedef struct PRLibrary PRLibrary;
                     46: 
                     47: typedef struct PRStaticLinkTable {
                     48:     const char *name;
                     49:     void (*fp)();
                     50: } PRStaticLinkTable;
                     51: 
                     52: /*
                     53: ** Change the default library path to the given string. The string is
                     54: ** copied. This call will fail if it runs out of memory.
                     55: **
                     56: ** The string provided as 'path' is copied. The caller can do whatever is
                     57: ** convenient with the argument when the function is complete.
                     58: */
                     59: NSPR_API(PRStatus) PR_SetLibraryPath(const char *path);
                     60: 
                     61: /*
                     62: ** Return a character string which contains the path used to search for
                     63: ** dynamically loadable libraries.
                     64: **
                     65: ** The returned value is basically a copy of a PR_SetLibraryPath().
                     66: ** The storage is allocated by the runtime and becomes the responsibilty
                     67: ** of the caller.
                     68: */
                     69: NSPR_API(char*) PR_GetLibraryPath(void);
                     70: 
                     71: /*
                     72: ** Given a directory name "dir" and a library name "lib" construct a full
                     73: ** path name that will refer to the actual dynamically loaded
                     74: ** library. This does not test for existance of said file, it just
                     75: ** constructs the full filename. The name constructed is system dependent
                     76: ** and prepared for PR_LoadLibrary. The result must be free'd when the
                     77: ** caller is done with it.
                     78: **
                     79: ** The storage for the result is allocated by the runtime and becomes the
                     80: ** responsibility of the caller.
                     81: */
                     82: NSPR_API(char*) PR_GetLibraryName(const char *dir, const char *lib);
                     83: 
                     84: /*
                     85: **
                     86: ** Free the memory allocated, for the caller, by PR_GetLibraryName
                     87: */
                     88: NSPR_API(void) PR_FreeLibraryName(char *mem);
                     89: 
                     90: /*
                     91: ** Given a library "name" try to load the library. The argument "name"
                     92: ** is a machine-dependent name for the library, such as the full pathname
                     93: ** returned by PR_GetLibraryName.  If the library is already loaded,
                     94: ** this function will avoid loading the library twice.
                     95: **
                     96: ** If the library is loaded successfully, then a pointer to the PRLibrary
                     97: ** structure representing the library is returned.  Otherwise, NULL is
                     98: ** returned.
                     99: **
                    100: ** This increments the reference count of the library.
                    101: */
                    102: NSPR_API(PRLibrary*) PR_LoadLibrary(const char *name);
                    103: 
                    104: /*
                    105: ** Each operating system has its preferred way of specifying
                    106: ** a file in the file system.  Most operating systems use
                    107: ** a pathname.  Mac OS, on the other hand, uses the FSSpec
                    108: ** structure to specify a file. PRLibSpec allows NSPR clients
                    109: ** to use the type of file specification that is most efficient
                    110: ** for a particular platform.
                    111: **
                    112: ** On some operating systems such as Mac OS, a shared library may
                    113: ** contain code fragments that can be individually loaded.
                    114: ** PRLibSpec also allows NSPR clients to identify a code fragment
                    115: ** in a library, if code fragments are supported by the OS.
                    116: ** A code fragment can be specified by name or by an integer index.
                    117: **
                    118: ** Right now PRLibSpec supports three types of library specification:
                    119: ** a pathname, a Mac code fragment by name, and a Mac code fragment
                    120: ** by index.
                    121: */
                    122: 
                    123: typedef enum PRLibSpecType {
                    124:     PR_LibSpec_Pathname,
                    125:     PR_LibSpec_MacNamedFragment,
                    126:     PR_LibSpec_MacIndexedFragment
                    127: } PRLibSpecType;
                    128: 
                    129: struct FSSpec; /* Mac OS FSSpec */
                    130: 
                    131: typedef struct PRLibSpec {
                    132:     PRLibSpecType type;
                    133:     union {
                    134:         /* if type is PR_LibSpec_Pathname */
                    135:         const char *pathname;
                    136: 
                    137:         /* if type is PR_LibSpec_MacNamedFragment */
                    138:         struct {
                    139:             const struct FSSpec *fsspec;
                    140:             const char *name;
                    141:         } mac_named_fragment;
                    142: 
                    143:         /* if type is PR_LibSpec_MacIndexedFragment */
                    144:         struct {
                    145:             const struct FSSpec *fsspec;
                    146:             PRUint32 index;
                    147:         } mac_indexed_fragment;
                    148:     } value;
                    149: } PRLibSpec;
                    150: 
                    151: /*
                    152: ** The following bit flags may be or'd together and passed
                    153: ** as the 'flags' argument to PR_LoadLibraryWithFlags.
                    154: ** Flags not supported by the underlying OS are ignored.
                    155: */
                    156: 
                    157: #define PR_LD_LAZY   0x1  /* equivalent to RTLD_LAZY on Unix */
                    158: #define PR_LD_NOW    0x2  /* equivalent to RTLD_NOW on Unix */
                    159: #define PR_LD_GLOBAL 0x4  /* equivalent to RTLD_GLOBAL on Unix */
                    160: #define PR_LD_LOCAL  0x8  /* equivalent to RTLD_LOCAL on Unix */
                    161: 
                    162: /*
                    163: ** Load the specified library, in the manner specified by 'flags'.
                    164: */
                    165: 
                    166: NSPR_API(PRLibrary *)
                    167: PR_LoadLibraryWithFlags(
                    168:     PRLibSpec libSpec,    /* the shared library */
                    169:     PRIntn flags          /* flags that affect the loading */
                    170: );
                    171: 
                    172: /*
                    173: ** Unload a previously loaded library. If the library was a static
                    174: ** library then the static link table will no longer be referenced. The
                    175: ** associated PRLibrary object is freed.
                    176: **
                    177: ** PR_FAILURE is returned if the library cannot be unloaded.
                    178: **
                    179: ** This function decrements the reference count of the library.
                    180: */
                    181: NSPR_API(PRStatus) PR_UnloadLibrary(PRLibrary *lib);
                    182: 
                    183: /*
                    184: ** Given the name of a procedure, return the address of the function that
                    185: ** implements the procedure, or NULL if no such function can be
                    186: ** found. This does not find symbols in the main program (the ".exe");
                    187: ** use PR_LoadStaticLibrary to register symbols in the main program.
                    188: **
                    189: ** This function does not modify the reference count of the library.
                    190: */
                    191: NSPR_API(void*) PR_FindSymbol(PRLibrary *lib, const char *name);
                    192: 
                    193: /*
                    194: ** Similar to PR_FindSymbol, except that the return value is a pointer to
                    195: ** a function, and not a pointer to void. Casting between a data pointer
                    196: ** and a function pointer is not portable according to the C standard.
                    197: ** Any function pointer can be cast to any other function pointer.
                    198: **
                    199: ** This function does not modify the reference count of the library.
                    200: */
                    201: typedef void (*PRFuncPtr)();
                    202: NSPR_API(PRFuncPtr) PR_FindFunctionSymbol(PRLibrary *lib, const char *name);
                    203: 
                    204: /*
                    205: ** Finds a symbol in one of the currently loaded libraries. Given the
                    206: ** name of a procedure, return the address of the function that
                    207: ** implements the procedure, and return the library that contains that
                    208: ** symbol, or NULL if no such function can be found. This does not find
                    209: ** symbols in the main program (the ".exe"); use PR_AddStaticLibrary to
                    210: ** register symbols in the main program.  
                    211: **
                    212: ** This increments the reference count of the library.
                    213: */
                    214: NSPR_API(void*) PR_FindSymbolAndLibrary(const char *name,
                    215:                              PRLibrary* *lib);
                    216: 
                    217: /*
                    218: ** Similar to PR_FindSymbolAndLibrary, except that the return value is
                    219: ** a pointer to a function, and not a pointer to void. Casting between a
                    220: ** data pointer and a function pointer is not portable according to the C
                    221: ** standard. Any function pointer can be cast to any other function pointer.
                    222: **
                    223: ** This increments the reference count of the library.
                    224: */
                    225: NSPR_API(PRFuncPtr) PR_FindFunctionSymbolAndLibrary(const char *name,
                    226:                              PRLibrary* *lib);
                    227: 
                    228: /*
                    229: ** Register a static link table with the runtime under the name
                    230: ** "name". The symbols present in the static link table will be made
                    231: ** available to PR_FindSymbol. If "name" is null then the symbols will be
                    232: ** made available to the library which represents the executable. The
                    233: ** tables are not copied.
                    234: **
                    235: ** Returns the library object if successful, null otherwise.
                    236: **
                    237: ** This increments the reference count of the library.
                    238: */
                    239: NSPR_API(PRLibrary*) PR_LoadStaticLibrary(
                    240:     const char *name, const PRStaticLinkTable *table);
                    241: 
                    242: /*
                    243: ** Return the pathname of the file that the library "name" was loaded
                    244: ** from. "addr" is the address of a function defined in the library.
                    245: **
                    246: ** The caller is responsible for freeing the result with PR_Free.
                    247: */
                    248: NSPR_API(char *) PR_GetLibraryFilePathname(const char *name, PRFuncPtr addr);
                    249: 
                    250: PR_END_EXTERN_C
                    251: 
                    252: #endif /* prlink_h___ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.