mirror of
https://github.com/python/cpython.git
synced 2025-10-28 20:25:04 +00:00
svn+ssh://pythondev@svn.python.org/python/trunk
........
r59704 | christian.heimes | 2008-01-04 04:15:05 +0100 (Fri, 04 Jan 2008) | 1 line
Moved include "Python.h" in front of other imports to silence a warning.
........
r59706 | raymond.hettinger | 2008-01-04 04:22:53 +0100 (Fri, 04 Jan 2008) | 10 lines
Minor fix-ups to named tuples:
* Make the _replace() method respect subclassing.
* Using property() to make _fields read-only wasn't a good idea.
It caused len(Point._fields) to fail.
* Add note to _cast() about length checking and alternative with the star-operator.
........
r59707 | jeffrey.yasskin | 2008-01-04 09:01:23 +0100 (Fri, 04 Jan 2008) | 3 lines
Make math.{floor,ceil}({int,long}) return float again for backwards
compatibility after r59671 made them return integral types.
........
r59709 | christian.heimes | 2008-01-04 14:21:07 +0100 (Fri, 04 Jan 2008) | 1 line
Bug #1713: posixpath.ismount() claims symlink to a mountpoint is a mountpoint.
........
r59712 | lars.gustaebel | 2008-01-04 15:00:33 +0100 (Fri, 04 Jan 2008) | 5 lines
Issue #1735: TarFile.extractall() now correctly sets
directory permissions and times.
(will backport to 2.5)
........
r59714 | andrew.kuchling | 2008-01-04 15:47:17 +0100 (Fri, 04 Jan 2008) | 1 line
Update links to bug/patch tracker
........
r59716 | christian.heimes | 2008-01-04 16:23:30 +0100 (Fri, 04 Jan 2008) | 1 line
Added interface to Windows' WSAIoctl and a simple example for a network sniffer.
........
r59717 | christian.heimes | 2008-01-04 16:29:00 +0100 (Fri, 04 Jan 2008) | 1 line
And here is the rest of Hirokazu Yamamoto's patch for VS6.0 support. Thanks Hiro!
........
r59719 | christian.heimes | 2008-01-04 16:34:06 +0100 (Fri, 04 Jan 2008) | 1 line
Reverted last transaction. It's the wrong branch.
........
r59721 | christian.heimes | 2008-01-04 16:48:06 +0100 (Fri, 04 Jan 2008) | 1 line
socket.ioctl is only available on Windows
........
r59722 | andrew.kuchling | 2008-01-04 19:24:41 +0100 (Fri, 04 Jan 2008) | 1 line
Fix markup
........
r59723 | andrew.kuchling | 2008-01-04 19:25:05 +0100 (Fri, 04 Jan 2008) | 1 line
Fix markup
........
r59725 | guido.van.rossum | 2008-01-05 01:59:59 +0100 (Sat, 05 Jan 2008) | 3 lines
Patch #1725 by Mark Dickinson, fixes incorrect conversion of -1e1000
and adds errors for -0x.
........
r59726 | guido.van.rossum | 2008-01-05 02:21:57 +0100 (Sat, 05 Jan 2008) | 2 lines
Patch #1698 by Senthil: allow '@' in username when parsed by urlparse.py.
........
r59727 | raymond.hettinger | 2008-01-05 02:35:43 +0100 (Sat, 05 Jan 2008) | 1 line
Improve namedtuple's _cast() method with a docstring, new name, and error-checking.
........
r59728 | raymond.hettinger | 2008-01-05 03:17:24 +0100 (Sat, 05 Jan 2008) | 1 line
Add error-checking to namedtuple's _replace() method.
........
r59730 | fred.drake | 2008-01-05 05:38:38 +0100 (Sat, 05 Jan 2008) | 2 lines
clean up a comment
........
r59731 | jeffrey.yasskin | 2008-01-05 09:47:13 +0100 (Sat, 05 Jan 2008) | 11 lines
Continue rolling back pep-3141 changes that changed behavior from 2.5. This
round included:
* Revert round to its 2.6 behavior (half away from 0).
* Because round, floor, and ceil always return float again, it's no
longer necessary to have them delegate to __xxx___, so I've ripped
that out of their implementations and the Real ABC. This also helps
in implementing types that work in both 2.6 and 3.0: you return int
from the __xxx__ methods, and let it get enabled by the version
upgrade.
* Make pow(-1, .5) raise a ValueError again.
........
r59736 | andrew.kuchling | 2008-01-05 16:13:49 +0100 (Sat, 05 Jan 2008) | 1 line
Fix comment typo
........
r59738 | thomas.heller | 2008-01-05 18:15:44 +0100 (Sat, 05 Jan 2008) | 1 line
Add myself.
........
r59739 | georg.brandl | 2008-01-05 18:49:17 +0100 (Sat, 05 Jan 2008) | 2 lines
Fix C++-style comment.
........
r59742 | georg.brandl | 2008-01-05 20:28:16 +0100 (Sat, 05 Jan 2008) | 2 lines
Remove with_statement future imports from 2.6 docs.
........
r59743 | georg.brandl | 2008-01-05 20:29:45 +0100 (Sat, 05 Jan 2008) | 2 lines
Simplify index entries; fix #1712.
........
r59744 | georg.brandl | 2008-01-05 20:44:22 +0100 (Sat, 05 Jan 2008) | 2 lines
Doc patch #1730 from Robin Stocker; minor corrections mostly to os.rst.
........
r59749 | georg.brandl | 2008-01-05 21:29:13 +0100 (Sat, 05 Jan 2008) | 2 lines
Revert socket.rst to unix-eol.
........
r59750 | georg.brandl | 2008-01-05 21:33:46 +0100 (Sat, 05 Jan 2008) | 2 lines
Set native svn:eol-style property for text files.
........
r59752 | georg.brandl | 2008-01-05 21:46:29 +0100 (Sat, 05 Jan 2008) | 2 lines
#1719: capitalization error in "UuidCreate".
........
r59753 | georg.brandl | 2008-01-05 22:02:25 +0100 (Sat, 05 Jan 2008) | 2 lines
Repair markup.
........
r59754 | georg.brandl | 2008-01-05 22:10:50 +0100 (Sat, 05 Jan 2008) | 2 lines
Use markup.
........
r59757 | christian.heimes | 2008-01-05 22:35:52 +0100 (Sat, 05 Jan 2008) | 1 line
Final adjustments for #1601
........
r59758 | guido.van.rossum | 2008-01-05 23:19:06 +0100 (Sat, 05 Jan 2008) | 3 lines
Patch #1637: fix urlparse for URLs like 'http://x.com?arg=/foo'.
Fix by John Nagle.
........
r59759 | guido.van.rossum | 2008-01-05 23:20:01 +0100 (Sat, 05 Jan 2008) | 2 lines
Add John Nagle (of issue #1637).
........
r59765 | raymond.hettinger | 2008-01-06 10:02:24 +0100 (Sun, 06 Jan 2008) | 1 line
Small code simplification. Forgot that classmethods can be called from intances.
........
r59766 | martin.v.loewis | 2008-01-06 11:09:48 +0100 (Sun, 06 Jan 2008) | 2 lines
Use vcbuild for VS 2009.
........
r59767 | martin.v.loewis | 2008-01-06 12:03:43 +0100 (Sun, 06 Jan 2008) | 2 lines
Package using VS 2008.
........
r59768 | martin.v.loewis | 2008-01-06 12:13:16 +0100 (Sun, 06 Jan 2008) | 2 lines
Don't try to package msvcr90 for the moment.
........
r59769 | georg.brandl | 2008-01-06 15:17:36 +0100 (Sun, 06 Jan 2008) | 4 lines
#1696393: don't check for '.' and '..' in ntpath.walk since
they aren't returned from os.listdir anymore.
Reported by Michael Haggerty.
........
r59770 | georg.brandl | 2008-01-06 15:27:15 +0100 (Sun, 06 Jan 2008) | 3 lines
#1742: don't raise exception on os.path.relpath("a", "a"), but return os.curdir.
Reported by Jesse Towner.
........
r59771 | georg.brandl | 2008-01-06 15:33:52 +0100 (Sun, 06 Jan 2008) | 2 lines
#1591: Clarify docstring of Popen3.
........
r59772 | georg.brandl | 2008-01-06 16:30:34 +0100 (Sun, 06 Jan 2008) | 2 lines
#1680: fix context manager example function name.
........
r59773 | georg.brandl | 2008-01-06 16:34:57 +0100 (Sun, 06 Jan 2008) | 2 lines
#1755097: document default values for [].sort() and sorted().
........
261 lines
7.3 KiB
C
261 lines
7.3 KiB
C
|
|
/* Support for dynamic loading of extension modules */
|
|
|
|
#include "Python.h"
|
|
|
|
#ifdef HAVE_DIRECT_H
|
|
#include <direct.h>
|
|
#endif
|
|
#include <ctype.h>
|
|
|
|
#include "importdl.h"
|
|
#include <windows.h>
|
|
|
|
const struct filedescr _PyImport_DynLoadFiletab[] = {
|
|
#ifdef _DEBUG
|
|
{"_d.pyd", "rb", C_EXTENSION},
|
|
#else
|
|
{".pyd", "rb", C_EXTENSION},
|
|
#endif
|
|
{0, 0}
|
|
};
|
|
|
|
|
|
/* Case insensitive string compare, to avoid any dependencies on particular
|
|
C RTL implementations */
|
|
|
|
static int strcasecmp (char *string1, char *string2)
|
|
{
|
|
int first, second;
|
|
|
|
do {
|
|
first = tolower(*string1);
|
|
second = tolower(*string2);
|
|
string1++;
|
|
string2++;
|
|
} while (first && first == second);
|
|
|
|
return (first - second);
|
|
}
|
|
|
|
|
|
/* Function to return the name of the "python" DLL that the supplied module
|
|
directly imports. Looks through the list of imported modules and
|
|
returns the first entry that starts with "python" (case sensitive) and
|
|
is followed by nothing but numbers until the separator (period).
|
|
|
|
Returns a pointer to the import name, or NULL if no matching name was
|
|
located.
|
|
|
|
This function parses through the PE header for the module as loaded in
|
|
memory by the system loader. The PE header is accessed as documented by
|
|
Microsoft in the MSDN PE and COFF specification (2/99), and handles
|
|
both PE32 and PE32+. It only worries about the direct import table and
|
|
not the delay load import table since it's unlikely an extension is
|
|
going to be delay loading Python (after all, it's already loaded).
|
|
|
|
If any magic values are not found (e.g., the PE header or optional
|
|
header magic), then this function simply returns NULL. */
|
|
|
|
#define DWORD_AT(mem) (*(DWORD *)(mem))
|
|
#define WORD_AT(mem) (*(WORD *)(mem))
|
|
|
|
static char *GetPythonImport (HINSTANCE hModule)
|
|
{
|
|
unsigned char *dllbase, *import_data, *import_name;
|
|
DWORD pe_offset, opt_offset;
|
|
WORD opt_magic;
|
|
int num_dict_off, import_off;
|
|
|
|
/* Safety check input */
|
|
if (hModule == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
/* Module instance is also the base load address. First portion of
|
|
memory is the MS-DOS loader, which holds the offset to the PE
|
|
header (from the load base) at 0x3C */
|
|
dllbase = (unsigned char *)hModule;
|
|
pe_offset = DWORD_AT(dllbase + 0x3C);
|
|
|
|
/* The PE signature must be "PE\0\0" */
|
|
if (memcmp(dllbase+pe_offset,"PE\0\0",4)) {
|
|
return NULL;
|
|
}
|
|
|
|
/* Following the PE signature is the standard COFF header (20
|
|
bytes) and then the optional header. The optional header starts
|
|
with a magic value of 0x10B for PE32 or 0x20B for PE32+ (PE32+
|
|
uses 64-bits for some fields). It might also be 0x107 for a ROM
|
|
image, but we don't process that here.
|
|
|
|
The optional header ends with a data dictionary that directly
|
|
points to certain types of data, among them the import entries
|
|
(in the second table entry). Based on the header type, we
|
|
determine offsets for the data dictionary count and the entry
|
|
within the dictionary pointing to the imports. */
|
|
|
|
opt_offset = pe_offset + 4 + 20;
|
|
opt_magic = WORD_AT(dllbase+opt_offset);
|
|
if (opt_magic == 0x10B) {
|
|
/* PE32 */
|
|
num_dict_off = 92;
|
|
import_off = 104;
|
|
} else if (opt_magic == 0x20B) {
|
|
/* PE32+ */
|
|
num_dict_off = 108;
|
|
import_off = 120;
|
|
} else {
|
|
/* Unsupported */
|
|
return NULL;
|
|
}
|
|
|
|
/* Now if an import table exists, offset to it and walk the list of
|
|
imports. The import table is an array (ending when an entry has
|
|
empty values) of structures (20 bytes each), which contains (at
|
|
offset 12) a relative address (to the module base) at which a
|
|
string constant holding the import name is located. */
|
|
|
|
if (DWORD_AT(dllbase + opt_offset + num_dict_off) >= 2) {
|
|
/* We have at least 2 tables - the import table is the second
|
|
one. But still it may be that the table size is zero */
|
|
if (0 == DWORD_AT(dllbase + opt_offset + import_off + sizeof(DWORD)))
|
|
return NULL;
|
|
import_data = dllbase + DWORD_AT(dllbase +
|
|
opt_offset +
|
|
import_off);
|
|
while (DWORD_AT(import_data)) {
|
|
import_name = dllbase + DWORD_AT(import_data+12);
|
|
if (strlen(import_name) >= 6 &&
|
|
!strncmp(import_name,"python",6)) {
|
|
char *pch;
|
|
|
|
/* Ensure python prefix is followed only
|
|
by numbers to the end of the basename */
|
|
pch = import_name + 6;
|
|
#ifdef _DEBUG
|
|
while (*pch && pch[0] != '_' && pch[1] != 'd' && pch[2] != '.') {
|
|
#else
|
|
while (*pch && *pch != '.') {
|
|
#endif
|
|
if (*pch >= '0' && *pch <= '9') {
|
|
pch++;
|
|
} else {
|
|
pch = NULL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (pch) {
|
|
/* Found it - return the name */
|
|
return import_name;
|
|
}
|
|
}
|
|
import_data += 20;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
|
|
const char *pathname, FILE *fp)
|
|
{
|
|
dl_funcptr p;
|
|
char funcname[258], *import_python;
|
|
|
|
PyOS_snprintf(funcname, sizeof(funcname), "init%.200s", shortname);
|
|
|
|
{
|
|
HINSTANCE hDLL = NULL;
|
|
char pathbuf[260];
|
|
LPTSTR dummy;
|
|
/* We use LoadLibraryEx so Windows looks for dependent DLLs
|
|
in directory of pathname first. However, Windows95
|
|
can sometimes not work correctly unless the absolute
|
|
path is used. If GetFullPathName() fails, the LoadLibrary
|
|
will certainly fail too, so use its error code */
|
|
if (GetFullPathName(pathname,
|
|
sizeof(pathbuf),
|
|
pathbuf,
|
|
&dummy))
|
|
/* XXX This call doesn't exist in Windows CE */
|
|
hDLL = LoadLibraryEx(pathname, NULL,
|
|
LOAD_WITH_ALTERED_SEARCH_PATH);
|
|
if (hDLL==NULL){
|
|
PyObject *message;
|
|
unsigned int errorCode;
|
|
|
|
/* Get an error string from Win32 error code */
|
|
wchar_t theInfo[256]; /* Pointer to error text
|
|
from system */
|
|
int theLength; /* Length of error text */
|
|
|
|
errorCode = GetLastError();
|
|
|
|
theLength = FormatMessageW(
|
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
FORMAT_MESSAGE_IGNORE_INSERTS, /* flags */
|
|
NULL, /* message source */
|
|
errorCode, /* the message (error) ID */
|
|
MAKELANGID(LANG_NEUTRAL,
|
|
SUBLANG_DEFAULT),
|
|
/* Default language */
|
|
theInfo, /* the buffer */
|
|
sizeof(theInfo), /* the buffer size */
|
|
NULL); /* no additional format args. */
|
|
|
|
/* Problem: could not get the error message.
|
|
This should not happen if called correctly. */
|
|
if (theLength == 0) {
|
|
message = PyUnicode_FromFormat(
|
|
"DLL load failed with error code %d",
|
|
errorCode);
|
|
} else {
|
|
/* For some reason a \r\n
|
|
is appended to the text */
|
|
if (theLength >= 2 &&
|
|
theInfo[theLength-2] == '\r' &&
|
|
theInfo[theLength-1] == '\n') {
|
|
theLength -= 2;
|
|
theInfo[theLength] = '\0';
|
|
}
|
|
message = PyUnicode_FromString(
|
|
"DLL load failed: ");
|
|
|
|
PyUnicode_AppendAndDel(&message,
|
|
PyUnicode_FromUnicode(
|
|
theInfo,
|
|
theLength));
|
|
}
|
|
PyErr_SetObject(PyExc_ImportError, message);
|
|
Py_XDECREF(message);
|
|
return NULL;
|
|
} else {
|
|
char buffer[256];
|
|
|
|
#ifdef _DEBUG
|
|
PyOS_snprintf(buffer, sizeof(buffer), "python%d%d_d.dll",
|
|
#else
|
|
PyOS_snprintf(buffer, sizeof(buffer), "python%d%d.dll",
|
|
#endif
|
|
PY_MAJOR_VERSION,PY_MINOR_VERSION);
|
|
import_python = GetPythonImport(hDLL);
|
|
|
|
if (import_python &&
|
|
strcasecmp(buffer,import_python)) {
|
|
PyOS_snprintf(buffer, sizeof(buffer),
|
|
"Module use of %.150s conflicts "
|
|
"with this version of Python.",
|
|
import_python);
|
|
PyErr_SetString(PyExc_ImportError,buffer);
|
|
FreeLibrary(hDLL);
|
|
return NULL;
|
|
}
|
|
}
|
|
p = GetProcAddress(hDLL, funcname);
|
|
}
|
|
|
|
return p;
|
|
}
|