1 /*-------------------------------------------------------------------------
2 *
3 * dynloader.c
4 * dynamic loader for HP-UX using the shared library mechanism
5 *
6 * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 *
10 * IDENTIFICATION
11 * src/backend/port/dynloader/hpux.c
12 *
13 * NOTES
14 * all functions are defined here -- it's impossible to trace the
15 * shl_* routines from the bundled HP-UX debugger.
16 *
17 *-------------------------------------------------------------------------
18 */
19 #include "postgres.h"
20
21 /* System includes */
22 #include <a.out.h>
23 #include <dl.h>
24
25 #include "dynloader.h"
26 #include "utils/dynamic_loader.h"
27
28 void *
pg_dlopen(const char * filename)29 pg_dlopen(const char *filename)
30 {
31 /*
32 * Use BIND_IMMEDIATE so that undefined symbols cause a failure return
33 * from shl_load(), rather than an abort() later on when we attempt to
34 * call the library!
35 */
36 shl_t handle = shl_load(filename,
37 BIND_IMMEDIATE | BIND_VERBOSE | DYNAMIC_PATH,
38 0L);
39
40 return (void *) handle;
41 }
42
43 PGFunction
pg_dlsym(void * handle,const char * funcname)44 pg_dlsym(void *handle, const char *funcname)
45 {
46 PGFunction f;
47
48 if (shl_findsym((shl_t *) & handle, funcname, TYPE_PROCEDURE, &f) == -1)
49 f = (PGFunction) NULL;
50 return f;
51 }
52
53 void
pg_dlclose(void * handle)54 pg_dlclose(void *handle)
55 {
56 shl_unload((shl_t) handle);
57 }
58
59 char *
pg_dlerror(void)60 pg_dlerror(void)
61 {
62 static char errmsg[] = "shl_load failed";
63
64 if (errno)
65 return strerror(errno);
66
67 return errmsg;
68 }
69