Merged revisions 72887 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r72887 | antoine.pitrou | 2009-05-24 17:40:09 +0200 (dim., 24 mai 2009) | 6 lines

  Issue #1309352: fcntl now converts its third arguments to a C `long` rather
  than an int, which makes some operations possible under 64-bit Linux (e.g.
  DN_MULTISHOT with F_NOTIFY).
........
This commit is contained in:
Antoine Pitrou 2009-05-24 15:46:13 +00:00
parent 1ef7f6e183
commit 61f77b57fd
3 changed files with 22 additions and 3 deletions

View File

@ -59,7 +59,7 @@ class TestFcntl(unittest.TestCase):
self.f = None
def tearDown(self):
if not self.f.closed:
if self.f and not self.f.closed:
self.f.close()
unlink(TESTFN)
@ -83,6 +83,21 @@ class TestFcntl(unittest.TestCase):
rv = fcntl.fcntl(self.f, fcntl.F_SETLKW, lockdata)
self.f.close()
def test_fcntl_64_bit(self):
# Issue #1309352: fcntl shouldn't fail when the third arg fits in a
# C 'long' but not in a C 'int'.
try:
cmd = fcntl.F_NOTIFY
# This flag is larger than 2**31 in 64-bit builds
flags = fcntl.DN_MULTISHOT
except AttributeError:
self.skipTest("F_NOTIFY or DN_MULTISHOT unavailable")
fd = os.open(os.path.dirname(os.path.abspath(TESTFN)), os.O_RDONLY)
try:
fcntl.fcntl(fd, cmd, flags)
finally:
os.close(fd)
def test_main():
run_unittest(TestFcntl)

View File

@ -32,6 +32,10 @@ Core and Builtins
Library
-------
- Issue #1309352: fcntl now converts its third arguments to a C `long` rather
than an int, which makes some operations possible under 64-bit Linux (e.g.
DN_MULTISHOT with F_NOTIFY).
- Issue #5761: Add the name of the underlying file to the repr() of various
IO objects.

View File

@ -34,7 +34,7 @@ fcntl_fcntl(PyObject *self, PyObject *args)
{
int fd;
int code;
int arg;
long arg;
int ret;
char *str;
Py_ssize_t len;
@ -61,7 +61,7 @@ fcntl_fcntl(PyObject *self, PyObject *args)
PyErr_Clear();
arg = 0;
if (!PyArg_ParseTuple(args,
"O&i|i;fcntl requires a file or file descriptor,"
"O&i|l;fcntl requires a file or file descriptor,"
" an integer and optionally a third integer or a string",
conv_descriptor, &fd, &code, &arg)) {
return NULL;