- Changes donated by Elemental Security to make it work on AIX 5.3

with IBM's 64-bit compiler (SF patch #1284289).  This also closes SF
  bug #105470: test_pwd fails on 64bit system (Opteron).
This commit is contained in:
Guido van Rossum 2005-09-14 18:09:42 +00:00
parent 539c662f10
commit 8ee3e5aa93
11 changed files with 106 additions and 51 deletions

View File

@ -24,6 +24,7 @@ PyAPI_FUNC(int) PyImport_ImportFrozenModule(char *);
PyAPI_FUNC(struct filedescr *) _PyImport_FindModule(
const char *, PyObject *, char *, size_t, FILE **, PyObject **);
PyAPI_FUNC(int) _PyImport_IsScript(struct filedescr *);
PyAPI_FUNC(void) _PyImport_ReInitLock(void);
PyAPI_FUNC(PyObject *)_PyImport_FindExtension(char *, char *);
PyAPI_FUNC(PyObject *)_PyImport_FixupExtension(char *, char *);

View File

@ -1070,6 +1070,34 @@ _expectations = {
test_winreg
test_winsound
""",
'aix5':
"""
test_aepack
test_al
test_applesingle
test_bsddb
test_bsddb185
test_bsddb3
test_bz2
test_cd
test_cl
test_dl
test_gdbm
test_gl
test_gzip
test_imgfile
test_linuxaudiodev
test_macfs
test_macostools
test_nis
test_ossaudiodev
test_sunaudiodev
test_tcl
test_winreg
test_winsound
test_zipimport
test_zlib
""",
}
_expectations['freebsd5'] = _expectations['freebsd4']
_expectations['freebsd6'] = _expectations['freebsd4']

View File

@ -1,5 +1,5 @@
import unittest
from test_support import TestSkipped, run_unittest
from test.test_support import TestSkipped, run_unittest
import os, struct
try:
import fcntl, termios
@ -16,19 +16,23 @@ except IOError:
class IoctlTests(unittest.TestCase):
def test_ioctl(self):
pgrp = os.getpgrp()
# If this process has been put into the background, TIOCGPGRP returns
# the session ID instead of the process group id.
ids = (os.getpgrp(), os.getsid(0))
tty = open("/dev/tty", "r")
r = fcntl.ioctl(tty, termios.TIOCGPGRP, " ")
self.assertEquals(pgrp, struct.unpack("i", r)[0])
rpgrp = struct.unpack("i", r)[0]
self.assert_(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
def test_ioctl_mutate(self):
import array
buf = array.array('i', [0])
pgrp = os.getpgrp()
ids = (os.getpgrp(), os.getsid(0))
tty = open("/dev/tty", "r")
r = fcntl.ioctl(tty, termios.TIOCGPGRP, buf, 1)
rpgrp = buf[0]
self.assertEquals(r, 0)
self.assertEquals(pgrp, buf[0])
self.assert_(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
def test_main():
run_unittest(IoctlTests)

View File

@ -12,6 +12,10 @@ What's New in Python 2.5 alpha 1?
Core and builtins
-----------------
- Changes donated by Elemental Security to make it work on AIX 5.3
with IBM's 64-bit compiler (SF patch #1284289). This also closes SF
bug #105470: test_pwd fails on 64bit system (Opteron).
- Changes donated by Elemental Security to make it work on HP-UX 11 on
Itanium2 with HP's 64-bit compiler (SF patch #1225212).

View File

@ -85,9 +85,9 @@ mkgrent(struct group *p)
static PyObject *
grp_getgrgid(PyObject *self, PyObject *args)
{
int gid;
unsigned int gid;
struct group *p;
if (!PyArg_ParseTuple(args, "i:getgrgid", &gid))
if (!PyArg_ParseTuple(args, "I:getgrgid", &gid))
return NULL;
if ((p = getgrgid(gid)) == NULL) {
PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %d", gid);

View File

@ -70,6 +70,12 @@ echo "*" >> $expFileName
# left with just the symbol name.
# 7. Eliminate all entries containing two colons, like Class::method
#
/usr/ccs/bin/nm -Bex $inputFiles \
# Use -X32_64 if it appears to be implemented in this version of 'nm'.
NM=/usr/ccs/bin/nm
xopt=-X32_64
$NM -e $xopt $1 >/dev/null 2>&1 || xopt=""
$NM -Bex $xopt $inputFiles \
| sed -e '/ [^BDT] /d' -e '/\./d' -e 's/.* [BDT] //' -e '/::/d' \
| sort | uniq >> $expFileName

View File

@ -102,9 +102,9 @@ See pwd.__doc__ for more on password database entries.");
static PyObject *
pwd_getpwuid(PyObject *self, PyObject *args)
{
int uid;
unsigned int uid;
struct passwd *p;
if (!PyArg_ParseTuple(args, "i:getpwuid", &uid))
if (!PyArg_ParseTuple(args, "I:getpwuid", &uid))
return NULL;
if ((p = getpwuid(uid)) == NULL) {
PyErr_Format(PyExc_KeyError,

View File

@ -669,5 +669,6 @@ PyOS_AfterFork(void)
PyEval_ReInitThreads();
main_thread = PyThread_get_thread_ident();
main_pid = getpid();
_PyImport_ReInitLock();
#endif
}

View File

@ -1344,7 +1344,7 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
static PyObject *
sock_accept(PySocketSockObject *s)
{
char addrbuf[256];
sock_addr_t addrbuf;
SOCKET_T newfd;
socklen_t addrlen;
PyObject *sock = NULL;
@ -1354,7 +1354,7 @@ sock_accept(PySocketSockObject *s)
if (!getsockaddrlen(s, &addrlen))
return NULL;
memset(addrbuf, 0, addrlen);
memset(&addrbuf, 0, addrlen);
#ifdef MS_WINDOWS
newfd = INVALID_SOCKET;
@ -1365,7 +1365,7 @@ sock_accept(PySocketSockObject *s)
Py_BEGIN_ALLOW_THREADS
timeout = internal_select(s, 0);
if (!timeout)
newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
newfd = accept(s->sock_fd, (struct sockaddr *) &addrbuf,
&addrlen);
Py_END_ALLOW_THREADS
@ -1392,7 +1392,7 @@ sock_accept(PySocketSockObject *s)
SOCKETCLOSE(newfd);
goto finally;
}
addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
addrlen, s->sock_proto);
if (addr == NULL)
goto finally;
@ -1865,19 +1865,19 @@ Return a new socket object connected to the same system resource.");
static PyObject *
sock_getsockname(PySocketSockObject *s)
{
char addrbuf[256];
sock_addr_t addrbuf;
int res;
socklen_t addrlen;
if (!getsockaddrlen(s, &addrlen))
return NULL;
memset(addrbuf, 0, addrlen);
memset(&addrbuf, 0, addrlen);
Py_BEGIN_ALLOW_THREADS
res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
res = getsockname(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Py_END_ALLOW_THREADS
if (res < 0)
return s->errorhandler();
return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
s->sock_proto);
}
@ -1894,19 +1894,19 @@ info is a pair (hostaddr, port).");
static PyObject *
sock_getpeername(PySocketSockObject *s)
{
char addrbuf[256];
sock_addr_t addrbuf;
int res;
socklen_t addrlen;
if (!getsockaddrlen(s, &addrlen))
return NULL;
memset(addrbuf, 0, addrlen);
memset(&addrbuf, 0, addrlen);
Py_BEGIN_ALLOW_THREADS
res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
res = getpeername(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Py_END_ALLOW_THREADS
if (res < 0)
return s->errorhandler();
return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen,
return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
s->sock_proto);
}
@ -2115,7 +2115,7 @@ the remote end is closed and all data is read, return the empty string.");
static PyObject *
sock_recvfrom(PySocketSockObject *s, PyObject *args)
{
char addrbuf[256];
sock_addr_t addrbuf;
PyObject *buf = NULL;
PyObject *addr = NULL;
PyObject *ret = NULL;
@ -2132,18 +2132,18 @@ sock_recvfrom(PySocketSockObject *s, PyObject *args)
return NULL;
Py_BEGIN_ALLOW_THREADS
memset(addrbuf, 0, addrlen);
memset(&addrbuf, 0, addrlen);
timeout = internal_select(s, 0);
if (!timeout)
n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
#ifndef MS_WINDOWS
#if defined(PYOS_OS2) && !defined(PYCC_GCC)
(struct sockaddr *)addrbuf, &addrlen
(struct sockaddr *) &addrbuf, &addrlen
#else
(void *)addrbuf, &addrlen
(void *) &addrbuf, &addrlen
#endif
#else
(struct sockaddr *)addrbuf, &addrlen
(struct sockaddr *) &addrbuf, &addrlen
#endif
);
Py_END_ALLOW_THREADS
@ -2161,7 +2161,7 @@ sock_recvfrom(PySocketSockObject *s, PyObject *args)
if (n != len && _PyString_Resize(&buf, n) < 0)
return NULL;
if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
addrlen, s->sock_proto)))
goto finally;
@ -2589,11 +2589,7 @@ static PyObject *
socket_gethostbyname(PyObject *self, PyObject *args)
{
char *name;
#ifdef ENABLE_IPV6
struct sockaddr_storage addrbuf;
#else
struct sockaddr_in addrbuf;
#endif
sock_addr_t addrbuf;
if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
return NULL;

View File

@ -72,6 +72,26 @@ typedef int SOCKET_T;
# define SIZEOF_SOCKET_T SIZEOF_INT
#endif
/* Socket address */
typedef union sock_addr {
struct sockaddr_in in;
#ifdef AF_UNIX
struct sockaddr_un un;
#endif
#ifdef ENABLE_IPV6
struct sockaddr_in6 in6;
struct sockaddr_storage storage;
#endif
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
struct sockaddr_l2 bt_l2;
struct sockaddr_rc bt_rc;
struct sockaddr_sco bt_sco;
#endif
#ifdef HAVE_NETPACKET_PACKET_H
struct sockaddr_ll ll;
#endif
} sock_addr_t;
/* The object holding a socket. It holds some extra information,
like the address family, which is used to decode socket address
arguments properly. */
@ -82,24 +102,7 @@ typedef struct {
int sock_family; /* Address family, e.g., AF_INET */
int sock_type; /* Socket type, e.g., SOCK_STREAM */
int sock_proto; /* Protocol type, usually 0 */
union sock_addr {
struct sockaddr_in in;
#ifdef AF_UNIX
struct sockaddr_un un;
#endif
#ifdef ENABLE_IPV6
struct sockaddr_in6 in6;
struct sockaddr_storage storage;
#endif
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
struct sockaddr_l2 bt_l2;
struct sockaddr_rc bt_rc;
struct sockaddr_sco bt_sco;
#endif
#ifdef HAVE_NETPACKET_PACKET_H
struct sockaddr_ll ll;
#endif
} sock_addr;
sock_addr_t sock_addr; /* Socket address */
PyObject *(*errorhandler)(void); /* Error handler; checks
errno, returns NULL and
sets a Python exception */

View File

@ -260,6 +260,18 @@ unlock_import(void)
return 1;
}
/* This function is called from PyOS_AfterFork to ensure that newly
created child processes do not share locks with the parent. */
void
_PyImport_ReInitLock(void)
{
#ifdef _AIX
if (import_lock != NULL)
import_lock = PyThread_allocate_lock();
#endif
}
#else
#define lock_import()