source: trunk/third/perl/os2/dl_os2.c @ 14545

Revision 14545, 1.9 KB checked in by ghudson, 24 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r14544, which included commits to RCS files with non-trunk default branches.
Line 
1#include "dlfcn.h"
2
3#define INCL_BASE
4#include <os2.h>
5
6static ULONG retcode;
7static char fail[300];
8
9void *
10dlopen(char *path, int mode)
11{
12        HMODULE handle;
13        char tmp[260], *beg, *dot;
14        ULONG rc;
15
16        fail[0] = 0;
17        if ((rc = DosLoadModule(fail, sizeof fail, path, &handle)) == 0)
18                return (void *)handle;
19
20        retcode = rc;
21
22        /* Not found. Check for non-FAT name and try truncated name. */
23        /* Don't know if this helps though... */
24        for (beg = dot = path + strlen(path);
25             beg > path && !strchr(":/\\", *(beg-1));
26             beg--)
27                if (*beg == '.')
28                        dot = beg;
29        if (dot - beg > 8) {
30                int n = beg+8-path;
31                memmove(tmp, path, n);
32                memmove(tmp+n, dot, strlen(dot)+1);
33                if (DosLoadModule(fail, sizeof fail, tmp, &handle) == 0)
34                        return (void *)handle;
35        }
36
37        return NULL;
38}
39
40void *
41dlsym(void *handle, char *symbol)
42{
43        ULONG rc, type;
44        PFN addr;
45
46        fail[0] = 0;
47        rc = DosQueryProcAddr((HMODULE)handle, 0, symbol, &addr);
48        if (rc == 0) {
49                rc = DosQueryProcType((HMODULE)handle, 0, symbol, &type);
50                if (rc == 0 && type == PT_32BIT)
51                        return (void *)addr;
52                rc = ERROR_CALL_NOT_IMPLEMENTED;
53        }
54        retcode = rc;
55        return NULL;
56}
57
58char *
59dlerror(void)
60{
61        static char buf[700];
62        ULONG len;
63
64        if (retcode == 0)
65                return NULL;
66        if (DosGetMessage(NULL, 0, buf, sizeof buf - 1, retcode,
67                          "OSO001.MSG", &len)) {
68                if (fail[0])
69                  sprintf(buf,
70"OS/2 system error code %d, possible problematic module: '%s'",
71                          retcode, fail);
72                else
73                  sprintf(buf, "OS/2 system error code %d", retcode);
74        } else {
75                buf[len] = '\0';
76                if (len && buf[len - 1] == '\n')
77                        buf[--len] = 0;
78                if (len && buf[len - 1] == '\r')
79                        buf[--len] = 0;
80                if (len && buf[len - 1] == '.')
81                        buf[--len] = 0;
82                if (fail[0] && len < 300)
83                  sprintf(buf + len, ", possible problematic module: '%s'",
84                          fail);
85        }
86        retcode = 0;
87        return buf;
88}
89
90int
91dlclose(void *handle)
92{
93        ULONG rc;
94
95        if ((rc = DosFreeModule((HMODULE)handle)) == 0) return 0;
96
97        retcode = rc;
98        return 2;
99}
Note: See TracBrowser for help on using the repository browser.