def test_dup2(self):
self.check(os.dup2, 20)
+ @unittest.skipUnless(hasattr(os, 'dup2'), 'test needs os.dup2()')
+ def test_dup2_negative_fd(self):
+ valid_fd = os.open(__file__, os.O_RDONLY)
+ self.addCleanup(os.close, valid_fd)
+ fds = [
+ valid_fd,
+ -1,
+ -2**31,
+ ]
+ for fd, fd2 in itertools.product(fds, repeat=2):
+ if fd != fd2:
+ with self.subTest(fd=fd, fd2=fd2):
+ with self.assertRaises(OSError) as ctx:
+ os.dup2(fd, fd2)
+ self.assertEqual(ctx.exception.errno, errno.EBADF)
+
@unittest.skipUnless(hasattr(os, 'fchmod'), 'test needs os.fchmod()')
def test_fchmod(self):
self.check(os.fchmod, 0)
static int dup3_works = -1;
#endif
- 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
* upon close(), and therefore below.