|
|
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___ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.