|
|
|
@ -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; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|