]> granicus.if.org Git - python/commitdiff
Remove the dl module per PEP 3108.
authorNeal Norwitz <nnorwitz@gmail.com>
Mon, 24 Mar 2008 06:22:57 +0000 (06:22 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Mon, 24 Mar 2008 06:22:57 +0000 (06:22 +0000)
Doc/library/dl.rst [deleted file]
Doc/library/sys.rst
Doc/library/unix.rst
Lib/test/test_dl.py [deleted file]
Misc/NEWS
Modules/Setup.dist
Modules/dlmodule.c [deleted file]
PC/os2emx/Makefile
PC/os2vacpp/makefile
PC/os2vacpp/makefile.omk
setup.py

diff --git a/Doc/library/dl.rst b/Doc/library/dl.rst
deleted file mode 100644 (file)
index de641e3..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-
-:mod:`dl` --- Call C functions in shared objects
-================================================
-
-.. module:: dl
-   :platform: Unix
-   :synopsis: Call C functions in shared objects.
-.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
-
-The :mod:`dl` module defines an interface to the :cfunc:`dlopen` function, which
-is the most common interface on Unix platforms for handling dynamically linked
-libraries. It allows the program to call arbitrary functions in such a library.
-
-.. warning::
-
-   The :mod:`dl` module bypasses the Python type system and  error handling. If
-   used incorrectly it may cause segmentation faults, crashes or other incorrect
-   behaviour.
-
-.. note::
-
-   This module will not work unless ``sizeof(int) == sizeof(long) == sizeof(char
-   *)`` If this is not the case, :exc:`SystemError` will be raised on import.
-
-The :mod:`dl` module defines the following function:
-
-
-.. function:: open(name[, mode=RTLD_LAZY])
-
-   Open a shared object file, and return a handle. Mode signifies late binding
-   (:const:`RTLD_LAZY`) or immediate binding (:const:`RTLD_NOW`). Default is
-   :const:`RTLD_LAZY`. Note that some systems do not support :const:`RTLD_NOW`.
-
-   Return value is a :class:`dlobject`.
-
-The :mod:`dl` module defines the following constants:
-
-
-.. data:: RTLD_LAZY
-
-   Useful as an argument to :func:`open`.
-
-
-.. data:: RTLD_NOW
-
-   Useful as an argument to :func:`open`.  Note that on systems which do not
-   support immediate binding, this constant will not appear in the module. For
-   maximum portability, use :func:`hasattr` to determine if the system supports
-   immediate binding.
-
-The :mod:`dl` module defines the following exception:
-
-
-.. exception:: error
-
-   Exception raised when an error has occurred inside the dynamic loading and
-   linking routines.
-
-Example::
-
-   >>> import dl, time
-   >>> a=dl.open('/lib/libc.so.6')
-   >>> a.call('time'), time.time()
-   (929723914, 929723914.498)
-
-This example was tried on a Debian GNU/Linux system, and is a good example of
-the fact that using this module is usually a bad alternative.
-
-
-.. _dl-objects:
-
-Dl Objects
-----------
-
-Dl objects, as returned by :func:`open` above, have the following methods:
-
-
-.. method:: dl.close()
-
-   Free all resources, except the memory.
-
-
-.. method:: dl.sym(name)
-
-   Return the pointer for the function named *name*, as a number, if it exists in
-   the referenced shared object, otherwise ``None``. This is useful in code like::
-
-      >>> if a.sym('time'): 
-      ...     a.call('time')
-      ... else: 
-      ...     time.time()
-
-   (Note that this function will return a non-zero number, as zero is the *NULL*
-   pointer)
-
-
-.. method:: dl.call(name[, arg1[, arg2...]])
-
-   Call the function named *name* in the referenced shared object. The arguments
-   must be either Python integers, which will be  passed as is, Python strings, to
-   which a pointer will be passed,  or ``None``, which will be passed as *NULL*.
-   Note that  strings should only be passed to functions as :ctype:`const char\*`,
-   as Python will not like its string mutated.
-
-   There must be at most 10 arguments, and arguments not given will be treated as
-   ``None``. The function's return value must be a C :ctype:`long`, which is a
-   Python integer.
-
index 02a1d20bcce2d21508704848a06540948e4ae45f..085ba64c9748ab43bdbc36f96bb1ee01d7668514 100644 (file)
@@ -304,7 +304,7 @@ always available.
 .. function:: getdlopenflags()
 
    Return the current value of the flags that are used for :cfunc:`dlopen` calls.
-   The flag constants are defined in the :mod:`dl` and :mod:`DLFCN` modules.
+   The flag constants are defined in the :mod:`ctypes` and :mod:`DLFCN` modules.
    Availability: Unix.
 
 
@@ -587,8 +587,8 @@ always available.
    the interpreter loads extension modules.  Among other things, this will enable a
    lazy resolving of symbols when importing a module, if called as
    ``sys.setdlopenflags(0)``.  To share symbols across extension modules, call as
-   ``sys.setdlopenflags(dl.RTLD_NOW | dl.RTLD_GLOBAL)``.  Symbolic names for the
-   flag modules can be either found in the :mod:`dl` module, or in the :mod:`DLFCN`
+   ``sys.setdlopenflags(ctypes.RTLD_GLOBAL)``.  Symbolic names for the
+   flag modules can be either found in the :mod:`ctypes` module, or in the :mod:`DLFCN`
    module. If :mod:`DLFCN` is not available, it can be generated from
    :file:`/usr/include/dlfcn.h` using the :program:`h2py` script. Availability:
    Unix.
index b60af0fe1c3b691e3baab548fc373249ae286b1a..1b1592e16129abd3457cc6a0205934a6f6385a92 100644 (file)
@@ -17,7 +17,6 @@ of it.  Here's an overview:
    spwd.rst
    grp.rst
    crypt.rst
-   dl.rst
    termios.rst
    tty.rst
    pty.rst
diff --git a/Lib/test/test_dl.py b/Lib/test/test_dl.py
deleted file mode 100755 (executable)
index 606da46..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#! /usr/bin/env python
-"""Test dlmodule.c
-   Roger E. Masse  revised strategy by Barry Warsaw
-"""
-
-import dl
-from test.test_support import verbose,TestSkipped
-
-sharedlibs = [
-    ('/usr/lib/libc.so', 'getpid'),
-    ('/lib/libc.so.6', 'getpid'),
-    ('/usr/bin/cygwin1.dll', 'getpid'),
-    ('/usr/lib/libc.dylib', 'getpid'),
-    ]
-
-for s, func in sharedlibs:
-    try:
-        if verbose:
-            print('trying to open:', s, end=' ')
-        l = dl.open(s)
-    except dl.error as err:
-        if verbose:
-            print('failed', repr(str(err)))
-        pass
-    else:
-        if verbose:
-            print('succeeded...', end=' ')
-        l.call(func)
-        l.close()
-        if verbose:
-            print('worked!')
-        break
-else:
-    raise TestSkipped('Could not open any shared libraries')
index 437999771cc1c497daf94e8007b65b2b3188bf1c..8aa1f303311fa42e28acce31c32dea9da4b60bda 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -18,6 +18,8 @@ Core and Builtins
 Extension Modules
 -----------------
 
+- The dl module was removed, use the ctypes module instead.
+
 - Use wchar_t functions in _locale module.
 
 Library
index ea1b8065aef65fb8f0b5b4c16e17d831fef61395..1c0715857968415aa5de23102822798dc9537184 100644 (file)
@@ -295,14 +295,6 @@ _symtable symtablemodule.c
 #_curses_panel _curses_panel.c -lpanel -lncurses 
 
 
-# Generic (SunOS / SVR4) dynamic loading module.
-# This is not needed for dynamic loading of Python modules --
-# it is a highly experimental and dangerous device for calling
-# *arbitrary* C functions in *arbitrary* shared libraries:
-
-#dl dlmodule.c
-
-
 # Modules that provide persistent dictionary-like semantics.  You will
 # probably want to arrange for at least one of them to be available on
 # your machine, though none are defined by default because of library
diff --git a/Modules/dlmodule.c b/Modules/dlmodule.c
deleted file mode 100644 (file)
index 04587f6..0000000
+++ /dev/null
@@ -1,279 +0,0 @@
-
-/* dl module */
-
-#include "Python.h"
-
-#include <dlfcn.h>
-
-#ifdef __VMS
-#include <unistd.h>
-#endif
-
-#ifndef RTLD_LAZY
-#define RTLD_LAZY 1
-#endif
-
-typedef void *PyUnivPtr;
-typedef struct {
-       PyObject_HEAD
-       PyUnivPtr *dl_handle;
-} dlobject;
-
-static PyTypeObject Dltype;
-
-static PyObject *Dlerror;
-
-static PyObject *
-newdlobject(PyUnivPtr *handle)
-{
-       dlobject *xp;
-       xp = PyObject_New(dlobject, &Dltype);
-       if (xp == NULL)
-               return NULL;
-       xp->dl_handle = handle;
-       return (PyObject *)xp;
-}
-
-static void
-dl_dealloc(dlobject *xp)
-{
-       if (xp->dl_handle != NULL)
-               dlclose(xp->dl_handle);
-       PyObject_Del(xp);
-}
-
-static PyObject *
-dl_close(dlobject *xp)
-{
-       if (xp->dl_handle != NULL) {
-               dlclose(xp->dl_handle);
-               xp->dl_handle = NULL;
-       }
-       Py_INCREF(Py_None);
-       return Py_None;
-}
-
-static PyObject *
-dl_sym(dlobject *xp, PyObject *args)
-{
-       char *name;
-       PyUnivPtr *func;
-       if (PyUnicode_Check(args)) {
-               name = PyUnicode_AsString(args);
-       } else {
-               PyErr_Format(PyExc_TypeError, "expected string, found %.200s",
-                            Py_TYPE(args)->tp_name);
-               return NULL;
-       }
-       func = dlsym(xp->dl_handle, name);
-       if (func == NULL) {
-               Py_INCREF(Py_None);
-               return Py_None;
-       }
-       return PyLong_FromLong((long)func);
-}
-
-static PyObject *
-dl_call(dlobject *xp, PyObject *args)
-{
-       PyObject *name;
-       long (*func)(long, long, long, long, long,
-                     long, long, long, long, long);
-       long alist[10];
-       long res;
-       Py_ssize_t i;
-       Py_ssize_t n = PyTuple_Size(args);
-       if (n < 1) {
-               PyErr_SetString(PyExc_TypeError, "at least a name is needed");
-               return NULL;
-       }
-       name = PyTuple_GetItem(args, 0);
-       if (!PyUnicode_Check(name)) {
-               PyErr_SetString(PyExc_TypeError,
-                               "function name must be a string");
-               return NULL;
-       }
-       func = (long (*)(long, long, long, long, long, 
-                         long, long, long, long, long)) 
-          dlsym(xp->dl_handle, PyUnicode_AsString(name));
-       if (func == NULL) {
-               PyErr_SetString(PyExc_ValueError, dlerror());
-               return NULL;
-       }
-       if (n-1 > 10) {
-               PyErr_SetString(PyExc_TypeError,
-                               "too many arguments (max 10)");
-               return NULL;
-       }
-       for (i = 1; i < n; i++) {
-               PyObject *v = PyTuple_GetItem(args, i);
-               if (PyLong_Check(v)) {
-                       alist[i-1] = PyLong_AsLong(v);
-                       if (alist[i-1] == -1 && PyErr_Occurred())
-                               return NULL;
-               } else if (PyUnicode_Check(v))
-                       alist[i-1] = (long)PyUnicode_AsString(v);
-               else if (v == Py_None)
-                       alist[i-1] = (long) ((char *)NULL);
-               else {
-                       PyErr_SetString(PyExc_TypeError,
-                                  "arguments must be int, string or None");
-                       return NULL;
-               }
-       }
-       for (; i <= 10; i++)
-               alist[i-1] = 0;
-       res = (*func)(alist[0], alist[1], alist[2], alist[3], alist[4],
-                     alist[5], alist[6], alist[7], alist[8], alist[9]);
-       return PyLong_FromLong(res);
-}
-
-static PyMethodDef dlobject_methods[] = {
-       {"call",        (PyCFunction)dl_call, METH_VARARGS},
-       {"sym",         (PyCFunction)dl_sym, METH_O},
-       {"close",       (PyCFunction)dl_close, METH_NOARGS},
-       {NULL,          NULL}                    /* Sentinel */
-};
-
-static PyObject *
-dl_getattr(dlobject *xp, char *name)
-{
-       return Py_FindMethod(dlobject_methods, (PyObject *)xp, name);
-}
-
-
-static PyTypeObject Dltype = {
-       PyVarObject_HEAD_INIT(NULL, 0)
-       "dl.dl",                /*tp_name*/
-       sizeof(dlobject),       /*tp_basicsize*/
-       0,                      /*tp_itemsize*/
-       /* methods */
-       (destructor)dl_dealloc, /*tp_dealloc*/
-       0,                      /*tp_print*/
-       (getattrfunc)dl_getattr,/*tp_getattr*/
-       0,                      /*tp_setattr*/
-       0,                      /*tp_compare*/
-       0,                      /*tp_repr*/
-       0,                      /*tp_as_number*/
-       0,                      /*tp_as_sequence*/
-       0,                      /*tp_as_mapping*/
-       0,                      /*tp_hash*/
-};
-
-static PyObject *
-dl_open(PyObject *self, PyObject *args)
-{
-       char *name;
-       int mode;
-       PyUnivPtr *handle;
-       if (sizeof(int) != sizeof(long) ||
-           sizeof(long) != sizeof(char *)) {
-               PyErr_SetString(PyExc_SystemError,
- "module dl requires sizeof(int) == sizeof(long) == sizeof(char*)");
-               return NULL;
-       }
-
-       if (PyArg_ParseTuple(args, "z:open", &name))
-               mode = RTLD_LAZY;
-       else {
-               PyErr_Clear();
-               if (!PyArg_ParseTuple(args, "zi:open", &name, &mode))
-                       return NULL;
-#ifndef RTLD_NOW
-               if (mode != RTLD_LAZY) {
-                       PyErr_SetString(PyExc_ValueError, "mode must be 1");
-                       return NULL;
-               }
-#endif
-       }
-       handle = dlopen(name, mode);
-       if (handle == NULL) {
-               PyErr_SetString(Dlerror, dlerror());
-               return NULL;
-       }
-#ifdef __VMS
-       /*   Under OpenVMS dlopen doesn't do any check, just save the name
-        * for later use, so we have to check if the file is readable,
-        * the name can be a logical or a file from SYS$SHARE.
-        */
-       if (access(name, R_OK)) {
-               char fname[strlen(name) + 20];
-               strcpy(fname, "SYS$SHARE:");
-               strcat(fname, name);
-               strcat(fname, ".EXE");
-               if (access(fname, R_OK)) {
-                       dlclose(handle);
-                       PyErr_SetString(Dlerror,
-                               "File not found or protection violation");
-                       return NULL;
-               }
-       }
-#endif
-       return newdlobject(handle);
-}
-
-static PyMethodDef dl_methods[] = {
-       {"open",        dl_open, METH_VARARGS},
-       {NULL,          NULL}           /* sentinel */
-};
-
-/* From socketmodule.c
- * Convenience routine to export an integer value.
- *
- * Errors are silently ignored, for better or for worse...
- */
-static void
-insint(PyObject *d, char *name, int value)
-{
-       PyObject *v = PyLong_FromLong((long) value);
-       if (!v || PyDict_SetItemString(d, name, v))
-               PyErr_Clear();
-
-       Py_XDECREF(v);
-}
-
-PyMODINIT_FUNC
-initdl(void)
-{
-       PyObject *m, *d, *x;
-
-       /* Initialize object type */
-       Py_TYPE(&Dltype) = &PyType_Type;
-
-       /* Create the module and add the functions */
-       m = Py_InitModule("dl", dl_methods);
-       if (m == NULL)
-               return;
-
-       /* Add some symbolic constants to the module */
-       d = PyModule_GetDict(m);
-       Dlerror = x = PyErr_NewException("dl.error", NULL, NULL);
-       PyDict_SetItemString(d, "error", x);
-       x = PyLong_FromLong((long)RTLD_LAZY);
-       PyDict_SetItemString(d, "RTLD_LAZY", x);
-#define INSINT(X)    insint(d,#X,X)
-#ifdef RTLD_NOW
-        INSINT(RTLD_NOW);
-#endif
-#ifdef RTLD_NOLOAD
-        INSINT(RTLD_NOLOAD);
-#endif
-#ifdef RTLD_GLOBAL
-        INSINT(RTLD_GLOBAL);
-#endif
-#ifdef RTLD_LOCAL
-        INSINT(RTLD_LOCAL);
-#endif
-#ifdef RTLD_PARENT
-        INSINT(RTLD_PARENT);
-#endif
-#ifdef RTLD_GROUP
-        INSINT(RTLD_GROUP);
-#endif
-#ifdef RTLD_WORLD
-        INSINT(RTLD_WORLD);
-#endif
-#ifdef RTLD_NODELETE
-        INSINT(RTLD_NODELETE);
-#endif
-}
index d3ef12ba5ec32183cf8b2e522529adca90bfc825..2fcb3340b8dc9a267ac9977e9ece8ed62f65d211 100644 (file)
@@ -290,7 +290,6 @@ SRC.MODULES=        $(addprefix $(TOP), \
                Modules/cStringIO.c \
                Modules/_csv.c \
                Modules/datetimemodule.c \
-               Modules/dlmodule.c \
                Modules/errnomodule.c \
                Modules/fcntlmodule.c \
                Modules/_functoolsmodule.c \
index 7e795669c078ab47425fc7d0bf65e9801a11e362..93cae7356a5174753f6fd8fb95e4d09fe1a3fcaf 100644 (file)
@@ -507,19 +507,6 @@ dbmmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\clas
         $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
         $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
 
-dlmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
-        $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
-        $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
-        $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
-        $(PY_INCLUDE)\intrcheck.h $(PY_INCLUDE)\listobject.h $(PY_INCLUDE)\longobject.h \
-        $(PY_INCLUDE)\methodobject.h $(PY_INCLUDE)\modsupport.h \
-        $(PY_INCLUDE)\moduleobject.h $(PY_INCLUDE)\mymalloc.h $(PY_INCLUDE)\myproto.h \
-        $(PY_INCLUDE)\object.h $(PY_INCLUDE)\objimpl.h $(PY_INCLUDE)\pydebug.h \
-        $(PY_INCLUDE)\pyerrors.h $(PY_INCLUDE)\pyfpe.h $(PY_INCLUDE)\pystate.h \
-        $(PY_INCLUDE)\python.h $(PY_INCLUDE)\pythonrun.h $(PY_INCLUDE)\rangeobject.h \
-        $(PY_INCLUDE)\sliceobject.h $(PY_INCLUDE)\stringobject.h \
-        $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h $(PY_INCLUDE)\tupleobject.h
-
 errno.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
         $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
         $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
index f0ed27398ad1e566f0a3322bedb7b9612dd08da1..2e0aae3ebed99f7b32a9a342683f0322c1a43074 100644 (file)
@@ -201,7 +201,6 @@ MODULES             =                   \
 
   # zlibmodule.c    -- Wrapper of ZLib Compression API (GZip Format)
   # puremodule.c    -- Wrapper of Purify Debugging API (Probably Non-OS/2)
-  # dlmodule.c      -- Some Wierd Form of Data Processing Module
   # xxmodule.c      -- Template to Create Your Own Module
 
 #
@@ -419,14 +418,6 @@ dbmmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
         pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
         traceback.h tupleobject.h
 
-dlmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
-        pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
-        import.h intobject.h intrcheck.h listobject.h longobject.h \
-        methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
-        object.h objimpl.h pydebug.h pyerrors.h pyfpe.h pystate.h python.h \
-        pythonrun.h rangeobject.h sliceobject.h stringobject.h sysmodule.h \
-        traceback.h tupleobject.h
-
 errno.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
         pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
         import.h intobject.h intrcheck.h listobject.h longobject.h \
index be34cd11ec9464ab5b42ef83551aa1f086e20fa7..2bfa91b71a1b51390272368a860b55ebfb14d95e 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -1105,17 +1105,6 @@ class PyBuildExt(build_ext):
             exts.append(Extension('_codecs_%s' % loc,
                                   ['cjkcodecs/_codecs_%s.c' % loc]))
 
-        # Dynamic loading module
-        if sys.maxsize == 0x7fffffff:
-            # This requires sizeof(int) == sizeof(long) == sizeof(char*)
-            dl_inc = find_file('dlfcn.h', [], inc_dirs)
-            if (dl_inc is not None) and (platform not in ['atheos']):
-                exts.append( Extension('dl', ['dlmodule.c']) )
-            else:
-                missing.append('dl')
-        else:
-            missing.append('dl')
-
         # Thomas Heller's _ctypes module
         self.detect_ctypes(inc_dirs, lib_dirs)