summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-05-23 15:37:45 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2009-05-23 15:37:45 (GMT)
commit5e858fe52be292e7a1b56547bb9bad286f89f2c1 (patch)
treeae3c79573d7245eae19db1e7a27ca35a99c6eddf
parent4b94b192ff38f37b99f04605fd6515d7fb97ffea (diff)
downloadcpython-5e858fe52be292e7a1b56547bb9bad286f89f2c1.zip
cpython-5e858fe52be292e7a1b56547bb9bad286f89f2c1.tar.gz
cpython-5e858fe52be292e7a1b56547bb9bad286f89f2c1.tar.bz2
Issue #1983: Fix functions taking or returning a process identifier to use
the dedicated C type `pid_t` instead of a C `int`. Some platforms have a process identifier type wider than the standard C integer type.
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/posixmodule.c51
2 files changed, 39 insertions, 16 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index 358d6ed..ba1e7e4 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -302,6 +302,10 @@ Core and Builtins
Library
-------
+- Issue #1983: Fix functions taking or returning a process identifier to use
+ the dedicated C type ``pid_t`` instead of a C ``int``. Some platforms have
+ a process identifier type wider than the standard C integer type.
+
- Issue #4066: smtplib.SMTP_SSL._get_socket now correctly returns the socket.
Patch by Farhan Ahmad, test by Marcin Bachry.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index c6481ac..81110c2 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -311,6 +311,25 @@ extern int lstat(const char *, struct stat *);
#define WAIT_STATUS_INT(s) (s)
#endif /* UNION_WAIT */
+/* Issue #1983: pid_t can be longer than a C long on some systems */
+#ifdef SIZEOF_PID_T
+#if SIZEOF_PID_T == SIZEOF_INT
+#define PARSE_PID "i"
+#define PyLong_FromPid PyInt_FromLong
+#define PyLong_AsPid PyInt_AsLong
+#elif SIZEOF_PID_T == SIZEOF_LONG
+#define PARSE_PID "l"
+#define PyLong_FromPid PyInt_FromLong
+#define PyLong_AsPid PyInt_AsLong
+#elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG
+#define PARSE_PID "L"
+#define PyLong_FromPid PyLong_FromLongLong
+#define PyLong_AsPid PyInt_AsLongLong
+#else
+#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)"
+#endif
+#endif /* SIZEOF_PID_T */
+
/* Don't use the "_r" form if we don't need it (also, won't have a
prototype for it, at least on Solaris -- maybe others as well?). */
#if defined(HAVE_CTERMID_R) && defined(WITH_THREAD)
@@ -3704,7 +3723,7 @@ posix_fork1(PyObject *self, PyObject *noargs)
return posix_error();
if (pid == 0)
PyOS_AfterFork();
- return PyInt_FromLong(pid);
+ return PyLong_FromPid(pid);
}
#endif
@@ -3723,7 +3742,7 @@ posix_fork(PyObject *self, PyObject *noargs)
return posix_error();
if (pid == 0)
PyOS_AfterFork();
- return PyInt_FromLong(pid);
+ return PyLong_FromPid(pid);
}
#endif
@@ -3833,7 +3852,7 @@ posix_forkpty(PyObject *self, PyObject *noargs)
return posix_error();
if (pid == 0)
PyOS_AfterFork();
- return Py_BuildValue("(li)", pid, master_fd);
+ return Py_BuildValue("(Ni)", PyLong_FromPid(pid), master_fd);
}
#endif
@@ -4050,7 +4069,7 @@ posix_kill(PyObject *self, PyObject *args)
{
pid_t pid;
int sig;
- if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig))
+ if (!PyArg_ParseTuple(args, PARSE_PID "i:kill", &pid, &sig))
return NULL;
#if defined(PYOS_OS2) && !defined(PYCC_GCC)
if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
@@ -4619,7 +4638,7 @@ _PyPopen(char *cmdstring, int mode, int n, int bufsize)
ins_rc[0] = ins_rc[1] = ins_rc[2] = 0;
procObj = PyList_New(2);
- pidObj = PyInt_FromLong((long) pipe_pid);
+ pidObj = PyLong_FromPid(pipe_pid);
intObj = PyInt_FromLong((long) file_count);
if (procObj && pidObj && intObj)
@@ -4745,7 +4764,7 @@ static int _PyPclose(FILE *file)
(pidObj = PyList_GetItem(procObj,0)) != NULL &&
(intObj = PyList_GetItem(procObj,1)) != NULL)
{
- pipe_pid = (int) PyInt_AsLong(pidObj);
+ pipe_pid = (pid_t) PyLong_AsPid(pidObj);
file_count = (int) PyInt_AsLong(intObj);
if (file_count > 1)
@@ -5862,7 +5881,7 @@ wait_helper(pid_t pid, int status, struct rusage *ru)
return NULL;
}
- return Py_BuildValue("iiN", pid, status, result);
+ return Py_BuildValue("NiN", PyLong_FromPid(pid), status, result);
}
#endif /* HAVE_WAIT3 || HAVE_WAIT4 */
@@ -5905,7 +5924,7 @@ posix_wait4(PyObject *self, PyObject *args)
WAIT_TYPE status;
WAIT_STATUS_INT(status) = 0;
- if (!PyArg_ParseTuple(args, "ii:wait4", &pid, &options))
+ if (!PyArg_ParseTuple(args, PARSE_PID "i:wait4", &pid, &options))
return NULL;
Py_BEGIN_ALLOW_THREADS
@@ -5929,7 +5948,7 @@ posix_waitpid(PyObject *self, PyObject *args)
WAIT_TYPE status;
WAIT_STATUS_INT(status) = 0;
- if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options))
+ if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options))
return NULL;
Py_BEGIN_ALLOW_THREADS
pid = waitpid(pid, &status, options);
@@ -5937,7 +5956,7 @@ posix_waitpid(PyObject *self, PyObject *args)
if (pid == -1)
return posix_error();
- return Py_BuildValue("ii", pid, WAIT_STATUS_INT(status));
+ return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status));
}
#elif defined(HAVE_CWAIT)
@@ -5953,7 +5972,7 @@ posix_waitpid(PyObject *self, PyObject *args)
Py_intptr_t pid;
int status, options;
- if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options))
+ if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options))
return NULL;
Py_BEGIN_ALLOW_THREADS
pid = _cwait(&status, pid, options);
@@ -5962,7 +5981,7 @@ posix_waitpid(PyObject *self, PyObject *args)
return posix_error();
/* shift the status left a byte so this is more like the POSIX waitpid */
- return Py_BuildValue("ii", pid, status << 8);
+ return Py_BuildValue("Ni", PyLong_FromPid(pid), status << 8);
}
#endif /* HAVE_WAITPID || HAVE_CWAIT */
@@ -5984,7 +6003,7 @@ posix_wait(PyObject *self, PyObject *noargs)
if (pid == -1)
return posix_error();
- return Py_BuildValue("ii", pid, WAIT_STATUS_INT(status));
+ return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status));
}
#endif
@@ -6175,7 +6194,7 @@ posix_getsid(PyObject *self, PyObject *args)
{
pid_t pid;
int sid;
- if (!PyArg_ParseTuple(args, "i:getsid", &pid))
+ if (!PyArg_ParseTuple(args, PARSE_PID ":getsid", &pid))
return NULL;
sid = getsid(pid);
if (sid < 0)
@@ -6210,7 +6229,7 @@ posix_setpgid(PyObject *self, PyObject *args)
{
pid_t pid;
int pgrp;
- if (!PyArg_ParseTuple(args, "ii:setpgid", &pid, &pgrp))
+ if (!PyArg_ParseTuple(args, PARSE_PID "i:setpgid", &pid, &pgrp))
return NULL;
if (setpgid(pid, pgrp) < 0)
return posix_error();
@@ -6235,7 +6254,7 @@ posix_tcgetpgrp(PyObject *self, PyObject *args)
pgid = tcgetpgrp(fd);
if (pgid < 0)
return posix_error();
- return PyInt_FromLong((long)pgid);
+ return PyLong_FromPid(pgid);
}
#endif /* HAVE_TCGETPGRP */