ยปCore Development>Code coverage>PC/os2emx/dlfcn.c

Python code coverage for PC/os2emx/dlfcn.c

#countcontent
1n/a/* -*- C -*- ***********************************************
2n/aCopyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3n/aThe Netherlands.
4n/a
5n/a All Rights Reserved
6n/a
7n/aPermission to use, copy, modify, and distribute this software and its
8n/adocumentation for any purpose and without fee is hereby granted,
9n/aprovided that the above copyright notice appear in all copies and that
10n/aboth that copyright notice and this permission notice appear in
11n/asupporting documentation, and that the names of Stichting Mathematisch
12n/aCentrum or CWI or Corporation for National Research Initiatives or
13n/aCNRI not be used in advertising or publicity pertaining to
14n/adistribution of the software without specific, written prior
15n/apermission.
16n/a
17n/aWhile CWI is the initial source for this software, a modified version
18n/ais made available by the Corporation for National Research Initiatives
19n/a(CNRI) at the Internet address ftp://ftp.python.org.
20n/a
21n/aSTICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22n/aREGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23n/aMERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24n/aCENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25n/aDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26n/aPROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27n/aTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28n/aPERFORMANCE OF THIS SOFTWARE.
29n/a
30n/a******************************************************************/
31n/a
32n/a/* This library implements dlopen() - Unix-like dynamic linking
33n/a * emulation functions for OS/2 using DosLoadModule() and company.
34n/a */
35n/a
36n/a#define INCL_DOS
37n/a#define INCL_DOSERRORS
38n/a#define INCL_DOSSESMGR
39n/a#define INCL_WINPROGRAMLIST
40n/a#define INCL_WINFRAMEMGR
41n/a#include <os2.h>
42n/a
43n/a#include <stdio.h>
44n/a#include <stdlib.h>
45n/a#include <string.h>
46n/a#include <malloc.h>
47n/a
48n/atypedef struct _track_rec {
49n/a char *name;
50n/a HMODULE handle;
51n/a void *id;
52n/a struct _track_rec *next;
53n/a} tDLLchain, *DLLchain;
54n/a
55n/astatic DLLchain dlload = NULL; /* A simple chained list of DLL names */
56n/astatic char dlerr [256]; /* last error text string */
57n/astatic void *last_id;
58n/a
59n/astatic DLLchain find_id(void *id)
60n/a{
61n/a DLLchain tmp;
62n/a
63n/a for (tmp = dlload; tmp; tmp = tmp->next)
64n/a if (id == tmp->id)
65n/a return tmp;
66n/a
67n/a return NULL;
68n/a}
69n/a
70n/a/* load a dynamic-link library and return handle */
71n/avoid *dlopen(char *filename, int flags)
72n/a{
73n/a HMODULE hm;
74n/a DLLchain tmp;
75n/a char err[256];
76n/a char *errtxt;
77n/a int rc = 0, set_chain = 0;
78n/a
79n/a for (tmp = dlload; tmp; tmp = tmp->next)
80n/a if (strnicmp(tmp->name, filename, 999) == 0)
81n/a break;
82n/a
83n/a if (!tmp)
84n/a {
85n/a tmp = (DLLchain) malloc(sizeof(tDLLchain));
86n/a if (!tmp)
87n/a goto nomem;
88n/a tmp->name = strdup(filename);
89n/a tmp->next = dlload;
90n/a set_chain = 1;
91n/a }
92n/a
93n/a switch (rc = DosLoadModule((PSZ)&err, sizeof(err), filename, &hm))
94n/a {
95n/a case NO_ERROR:
96n/a tmp->handle = hm;
97n/a if (set_chain)
98n/a {
99n/a do
100n/a last_id++;
101n/a while ((last_id == 0) || (find_id(last_id)));
102n/a tmp->id = last_id;
103n/a dlload = tmp;
104n/a }
105n/a return tmp->id;
106n/a case ERROR_FILE_NOT_FOUND:
107n/a case ERROR_PATH_NOT_FOUND:
108n/a errtxt = "module `%s' not found";
109n/a break;
110n/a case ERROR_TOO_MANY_OPEN_FILES:
111n/a case ERROR_NOT_ENOUGH_MEMORY:
112n/a case ERROR_SHARING_BUFFER_EXCEEDED:
113n/anomem:
114n/a errtxt = "out of system resources";
115n/a break;
116n/a case ERROR_ACCESS_DENIED:
117n/a errtxt = "access denied";
118n/a break;
119n/a case ERROR_BAD_FORMAT:
120n/a case ERROR_INVALID_SEGMENT_NUMBER:
121n/a case ERROR_INVALID_ORDINAL:
122n/a case ERROR_INVALID_MODULETYPE:
123n/a case ERROR_INVALID_EXE_SIGNATURE:
124n/a case ERROR_EXE_MARKED_INVALID:
125n/a case ERROR_ITERATED_DATA_EXCEEDS_64K:
126n/a case ERROR_INVALID_MINALLOCSIZE:
127n/a case ERROR_INVALID_SEGDPL:
128n/a case ERROR_AUTODATASEG_EXCEEDS_64K:
129n/a case ERROR_RELOCSRC_CHAIN_EXCEEDS_SEGLIMIT:
130n/a errtxt = "invalid module format";
131n/a break;
132n/a case ERROR_INVALID_NAME:
133n/a errtxt = "filename doesn't match module name";
134n/a break;
135n/a case ERROR_SHARING_VIOLATION:
136n/a case ERROR_LOCK_VIOLATION:
137n/a errtxt = "sharing violation";
138n/a break;
139n/a case ERROR_INIT_ROUTINE_FAILED:
140n/a errtxt = "module initialization failed";
141n/a break;
142n/a default:
143n/a errtxt = "cause `%s', error code = %d";
144n/a break;
145n/a }
146n/a snprintf(dlerr, sizeof(dlerr), errtxt, &err, rc);
147n/a if (tmp)
148n/a {
149n/a if (tmp->name)
150n/a free(tmp->name);
151n/a free(tmp);
152n/a }
153n/a return 0;
154n/a}
155n/a
156n/a/* return a pointer to the `symbol' in DLL */
157n/avoid *dlsym(void *handle, char *symbol)
158n/a{
159n/a int rc = 0;
160n/a PFN addr;
161n/a char *errtxt;
162n/a int symord = 0;
163n/a DLLchain tmp = find_id(handle);
164n/a
165n/a if (!tmp)
166n/a goto inv_handle;
167n/a
168n/a if (*symbol == '#')
169n/a symord = atoi(symbol + 1);
170n/a
171n/a switch (rc = DosQueryProcAddr(tmp->handle, symord, symbol, &addr))
172n/a {
173n/a case NO_ERROR:
174n/a return (void *)addr;
175n/a case ERROR_INVALID_HANDLE:
176n/ainv_handle:
177n/a errtxt = "invalid module handle";
178n/a break;
179n/a case ERROR_PROC_NOT_FOUND:
180n/a case ERROR_INVALID_NAME:
181n/a errtxt = "no symbol `%s' in module";
182n/a break;
183n/a default:
184n/a errtxt = "symbol `%s', error code = %d";
185n/a break;
186n/a }
187n/a snprintf(dlerr, sizeof(dlerr), errtxt, symbol, rc);
188n/a return NULL;
189n/a}
190n/a
191n/a/* free dynamically-linked library */
192n/aint dlclose(void *handle)
193n/a{
194n/a int rc;
195n/a DLLchain tmp = find_id(handle);
196n/a
197n/a if (!tmp)
198n/a goto inv_handle;
199n/a
200n/a switch (rc = DosFreeModule(tmp->handle))
201n/a {
202n/a case NO_ERROR:
203n/a free(tmp->name);
204n/a dlload = tmp->next;
205n/a free(tmp);
206n/a return 0;
207n/a case ERROR_INVALID_HANDLE:
208n/ainv_handle:
209n/a strcpy(dlerr, "invalid module handle");
210n/a return -1;
211n/a case ERROR_INVALID_ACCESS:
212n/a strcpy(dlerr, "access denied");
213n/a return -1;
214n/a default:
215n/a return -1;
216n/a }
217n/a}
218n/a
219n/a/* return a string describing last occurred dl error */
220n/achar *dlerror()
221n/a{
222n/a return dlerr;
223n/a}