annotate Modules/dlmodule.c @ 16798:258dcafe2d0b legacy-trunk

Gustavo Niemeyer <niemeyer@conectiva.com>: Fixed recno support (keys are integers rather than strings). Work around DB bug that cause stdin to be closed by rnopen() when the DB file needed to exist but did not (no longer segfaults). This closes SF tracker patch #403445. Also wrapped some long lines and added whitespace around operators -- FLD.
author Fred Drake <fdrake@acm.org>
date Tue, 27 Feb 2001 18:56:46 +0000
parents 9f86cba4766b
children 8156879fe60d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
1
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* dl module */
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
4 #include "Python.h"
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #include <dlfcn.h>
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
7
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 #ifndef RTLD_LAZY
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 #define RTLD_LAZY 1
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 #endif
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
11
13709
4e2aaf1e722a Use 'void' directly instead of the ANY #define, now that all code is ANSI C.
Thomas Wouters <thomas@python.org>
parents: 13651
diff changeset
12 typedef void *PyUnivPtr;
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 typedef struct {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
14 PyObject_HEAD
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
15 PyUnivPtr *dl_handle;
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 } dlobject;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
17
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
18 staticforward PyTypeObject Dltype;
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
19
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
20 static PyObject *Dlerror;
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
22 static PyObject *
13499
046799a08057 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
23 newdlobject(PyUnivPtr *handle)
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 {
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 dlobject *xp;
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 6889
diff changeset
26 xp = PyObject_New(dlobject, &Dltype);
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 if (xp == NULL)
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 return NULL;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 xp->dl_handle = handle;
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
30 return (PyObject *)xp;
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
32
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 static void
13499
046799a08057 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
34 dl_dealloc(dlobject *xp)
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 {
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 if (xp->dl_handle != NULL)
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 dlclose(xp->dl_handle);
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 6889
diff changeset
38 PyObject_Del(xp);
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
40
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
41 static PyObject *
13499
046799a08057 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
42 dl_close(dlobject *xp, PyObject *args)
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
44 if (!PyArg_Parse(args, ""))
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 return NULL;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 if (xp->dl_handle != NULL) {
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 dlclose(xp->dl_handle);
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 xp->dl_handle = NULL;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 }
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
50 Py_INCREF(Py_None);
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
51 return Py_None;
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
53
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
54 static PyObject *
13499
046799a08057 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
55 dl_sym(dlobject *xp, PyObject *args)
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 {
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 char *name;
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
58 PyUnivPtr *func;
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
59 if (!PyArg_Parse(args, "s", &name))
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 return NULL;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 func = dlsym(xp->dl_handle, name);
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 if (func == NULL) {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
63 Py_INCREF(Py_None);
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
64 return Py_None;
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 }
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
66 return PyInt_FromLong((long)func);
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
68
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
69 static PyObject *
13499
046799a08057 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
70 dl_call(dlobject *xp, PyObject *args)
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
72 PyObject *name;
15157
459232a9b804 Remove one more gcc -Wall warning.
Fred Drake <fdrake@acm.org>
parents: 14542
diff changeset
73 long (*func)(long, long, long, long, long,
459232a9b804 Remove one more gcc -Wall warning.
Fred Drake <fdrake@acm.org>
parents: 14542
diff changeset
74 long, long, long, long, long);
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 long alist[10];
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 long res;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 int i;
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
78 int n = PyTuple_Size(args);
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 if (n < 1) {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
80 PyErr_SetString(PyExc_TypeError, "at least a name is needed");
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 return NULL;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 }
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
83 name = PyTuple_GetItem(args, 0);
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
84 if (!PyString_Check(name)) {
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
85 PyErr_SetString(PyExc_TypeError,
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
86 "function name must be a string");
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 return NULL;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 }
16735
9f86cba4766b Patch #103926: fix two warnings from Tru64's compiler
Andrew M. Kuchling <amk@amk.ca>
parents: 15157
diff changeset
89 func = (long (*)(long, long, long, long, long,
9f86cba4766b Patch #103926: fix two warnings from Tru64's compiler
Andrew M. Kuchling <amk@amk.ca>
parents: 15157
diff changeset
90 long, long, long, long, long))
9f86cba4766b Patch #103926: fix two warnings from Tru64's compiler
Andrew M. Kuchling <amk@amk.ca>
parents: 15157
diff changeset
91 dlsym(xp->dl_handle, PyString_AsString(name));
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 if (func == NULL) {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
93 PyErr_SetString(PyExc_ValueError, dlerror());
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 return NULL;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 if (n-1 > 10) {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
97 PyErr_SetString(PyExc_TypeError,
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
98 "too many arguments (max 10)");
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 return NULL;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 for (i = 1; i < n; i++) {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
102 PyObject *v = PyTuple_GetItem(args, i);
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
103 if (PyInt_Check(v))
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
104 alist[i-1] = PyInt_AsLong(v);
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
105 else if (PyString_Check(v))
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
106 alist[i-1] = (long)PyString_AsString(v);
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
107 else if (v == Py_None)
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 alist[i-1] = (long) ((char *)NULL);
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 else {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
110 PyErr_SetString(PyExc_TypeError,
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 "arguments must be int, string or None");
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 return NULL;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 for (; i <= 10; i++)
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 alist[i-1] = 0;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 res = (*func)(alist[0], alist[1], alist[2], alist[3], alist[4],
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 alist[5], alist[6], alist[7], alist[8], alist[9]);
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
119 return PyInt_FromLong(res);
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
121
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
122 static PyMethodDef dlobject_methods[] = {
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
123 {"call", (PyCFunction)dl_call, 1 /* varargs */},
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
124 {"sym", (PyCFunction)dl_sym},
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
125 {"close", (PyCFunction)dl_close},
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
126 {NULL, NULL} /* Sentinel */
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 };
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
128
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
129 static PyObject *
13499
046799a08057 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
130 dl_getattr(dlobject *xp, char *name)
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
132 return Py_FindMethod(dlobject_methods, (PyObject *)xp, name);
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
134
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
135
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
136 static PyTypeObject Dltype = {
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
137 PyObject_HEAD_INIT(&PyType_Type)
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 0, /*ob_size*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 "dl", /*tp_name*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 sizeof(dlobject), /*tp_basicsize*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 0, /*tp_itemsize*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 /* methods */
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 (destructor)dl_dealloc, /*tp_dealloc*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 0, /*tp_print*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 (getattrfunc)dl_getattr,/*tp_getattr*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 0, /*tp_setattr*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 0, /*tp_compare*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 0, /*tp_repr*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 0, /*tp_as_number*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 0, /*tp_as_sequence*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 0, /*tp_as_mapping*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 0, /*tp_hash*/
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 };
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
154
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
155 static PyObject *
13499
046799a08057 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
156 dl_open(PyObject *self, PyObject *args)
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 {
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 char *name;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 int mode;
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
160 PyUnivPtr *handle;
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
161 if (PyArg_Parse(args, "z", &name))
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 mode = RTLD_LAZY;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 else {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
164 PyErr_Clear();
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
165 if (!PyArg_Parse(args, "(zi)", &name, &mode))
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 return NULL;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 #ifndef RTLD_NOW
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 if (mode != RTLD_LAZY) {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
169 PyErr_SetString(PyExc_ValueError, "mode must be 1");
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 return NULL;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 #endif
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 handle = dlopen(name, mode);
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 if (handle == NULL) {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
176 PyErr_SetString(Dlerror, dlerror());
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 return NULL;
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 return newdlobject(handle);
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 }
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
181
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
182 static PyMethodDef dl_methods[] = {
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 {"open", dl_open},
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 {NULL, NULL} /* sentinel */
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 };
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
186
14542
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
187 /* From socketmodule.c
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
188 * Convenience routine to export an integer value.
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
189 *
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
190 * Errors are silently ignored, for better or for worse...
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
191 */
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
192 static void
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
193 insint(PyObject *d, char *name, int value)
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
194 {
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
195 PyObject *v = PyInt_FromLong((long) value);
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
196 if (!v || PyDict_SetItemString(d, name, v))
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
197 PyErr_Clear();
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
198
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
199 Py_XDECREF(v);
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
200 }
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
201
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 void
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13499
diff changeset
203 initdl(void)
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 {
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
205 PyObject *m, *d, *x;
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
206
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 if (sizeof(int) != sizeof(long) ||
6367
2c29b8982643 Apply two changes, systematically:
Guido van Rossum <guido@python.org>
parents: 4725
diff changeset
208 sizeof(long) != sizeof(char *)) {
6889
c7bab73e63c6 Fix mysterious undetected error -- call to non-existant Py_Err_SetStr()
Guido van Rossum <guido@python.org>
parents: 6367
diff changeset
209 PyErr_SetString(PyExc_SystemError,
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 "module dl requires sizeof(int) == sizeof(long) == sizeof(char*)");
6367
2c29b8982643 Apply two changes, systematically:
Guido van Rossum <guido@python.org>
parents: 4725
diff changeset
211 return;
2c29b8982643 Apply two changes, systematically:
Guido van Rossum <guido@python.org>
parents: 4725
diff changeset
212 }
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
213
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 /* Create the module and add the functions */
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
215 m = Py_InitModule("dl", dl_methods);
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
216
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 /* Add some symbolic constants to the module */
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
218 d = PyModule_GetDict(m);
6367
2c29b8982643 Apply two changes, systematically:
Guido van Rossum <guido@python.org>
parents: 4725
diff changeset
219 Dlerror = x = PyErr_NewException("dl.error", NULL, NULL);
4725
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
220 PyDict_SetItemString(d, "error", x);
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
221 x = PyInt_FromLong((long)RTLD_LAZY);
8669edb1d9c5 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4503
diff changeset
222 PyDict_SetItemString(d, "RTLD_LAZY", x);
14542
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
223 #define INSINT(X) insint(d,#X,X)
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 #ifdef RTLD_NOW
14542
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
225 INSINT(RTLD_NOW);
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
226 #endif
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
227 #ifdef RTLD_NOLOAD
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
228 INSINT(RTLD_NOLOAD);
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
229 #endif
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
230 #ifdef RTLD_GLOBAL
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
231 INSINT(RTLD_GLOBAL);
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
232 #endif
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
233 #ifdef RTLD_LOCAL
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
234 INSINT(RTLD_LOCAL);
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
235 #endif
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
236 #ifdef RTLD_PARENT
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
237 INSINT(RTLD_PARENT);
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
238 #endif
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
239 #ifdef RTLD_GROUP
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
240 INSINT(RTLD_GROUP);
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
241 #endif
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
242 #ifdef RTLD_WORLD
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
243 INSINT(RTLD_WORLD);
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
244 #endif
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
245 #ifdef RTLD_NODELETE
a45ca1f7f241 Add several dl.RTLD_ constants. Closes bug 110842.
Martin v. Löwis <martin@v.loewis.de>
parents: 14375
diff changeset
246 INSINT(RTLD_NODELETE);
1650
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 #endif
51a06fdfff78 Added some new modules
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 }