mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
return the new file descriptor from os.dup2 (closes bpo-32441) (#5041)
This commit is contained in:
parent
03220fdb26
commit
bbdb17d19b
5 changed files with 50 additions and 32 deletions
|
@ -7770,7 +7770,7 @@ os_dup_impl(PyObject *module, int fd)
|
|||
|
||||
|
||||
/*[clinic input]
|
||||
os.dup2
|
||||
os.dup2 -> int
|
||||
fd: int
|
||||
fd2: int
|
||||
inheritable: bool=True
|
||||
|
@ -7778,9 +7778,9 @@ os.dup2
|
|||
Duplicate file descriptor.
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
static int
|
||||
os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
|
||||
/*[clinic end generated code: output=db832a2d872ccc5f input=76e96f511be0352f]*/
|
||||
/*[clinic end generated code: output=bc059d34a73404d1 input=c3cddda8922b038d]*/
|
||||
{
|
||||
int res;
|
||||
#if defined(HAVE_DUP3) && \
|
||||
|
@ -7789,8 +7789,10 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
|
|||
int dup3_works = -1;
|
||||
#endif
|
||||
|
||||
if (fd < 0 || fd2 < 0)
|
||||
return posix_error();
|
||||
if (fd < 0 || fd2 < 0) {
|
||||
posix_error();
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* dup2() can fail with EINTR if the target FD is already open, because it
|
||||
* then has to be closed. See os_close_impl() for why we don't handle EINTR
|
||||
|
@ -7802,13 +7804,16 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
|
|||
res = dup2(fd, fd2);
|
||||
_Py_END_SUPPRESS_IPH
|
||||
Py_END_ALLOW_THREADS
|
||||
if (res < 0)
|
||||
return posix_error();
|
||||
if (res < 0) {
|
||||
posix_error();
|
||||
return -1;
|
||||
}
|
||||
res = fd2; // msvcrt dup2 returns 0 on success.
|
||||
|
||||
/* Character files like console cannot be make non-inheritable */
|
||||
if (!inheritable && _Py_set_inheritable(fd2, 0, NULL) < 0) {
|
||||
close(fd2);
|
||||
return NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#elif defined(HAVE_FCNTL_H) && defined(F_DUP2FD_CLOEXEC)
|
||||
|
@ -7818,8 +7823,10 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
|
|||
else
|
||||
res = dup2(fd, fd2);
|
||||
Py_END_ALLOW_THREADS
|
||||
if (res < 0)
|
||||
return posix_error();
|
||||
if (res < 0) {
|
||||
posix_error();
|
||||
return -1;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
|
@ -7831,8 +7838,10 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
|
|||
if (res < 0) {
|
||||
if (dup3_works == -1)
|
||||
dup3_works = (errno != ENOSYS);
|
||||
if (dup3_works)
|
||||
return posix_error();
|
||||
if (dup3_works) {
|
||||
posix_error();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7842,12 +7851,14 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
|
|||
Py_BEGIN_ALLOW_THREADS
|
||||
res = dup2(fd, fd2);
|
||||
Py_END_ALLOW_THREADS
|
||||
if (res < 0)
|
||||
return posix_error();
|
||||
if (res < 0) {
|
||||
posix_error();
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!inheritable && _Py_set_inheritable(fd2, 0, NULL) < 0) {
|
||||
close(fd2);
|
||||
return NULL;
|
||||
return -1;
|
||||
}
|
||||
#ifdef HAVE_DUP3
|
||||
}
|
||||
|
@ -7855,7 +7866,7 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable)
|
|||
|
||||
#endif
|
||||
|
||||
Py_RETURN_NONE;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue