Index: Modules/posixmodule.c =================================================================== --- Modules/posixmodule.c (révision 72778) +++ Modules/posixmodule.c (copie de travail) @@ -311,6 +311,25 @@ #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 @@ return posix_error(); if (pid == 0) PyOS_AfterFork(); - return PyInt_FromLong(pid); + return PyLong_FromPid(pid); } #endif @@ -3723,7 +3742,7 @@ return posix_error(); if (pid == 0) PyOS_AfterFork(); - return PyInt_FromLong(pid); + return PyLong_FromPid(pid); } #endif @@ -3833,7 +3852,7 @@ 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 @@ { 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 @@ 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 @@ (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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ { 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 @@ { 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 @@ pgid = tcgetpgrp(fd); if (pgid < 0) return posix_error(); - return PyInt_FromLong((long)pgid); + return PyLong_FromPid(pgid); } #endif /* HAVE_TCGETPGRP */