def test_set_inheritable(): fd1, fd2 = os.pipe() rposix.set_inheritable(fd1, True) assert rposix.get_inheritable(fd1) == True rposix.set_inheritable(fd1, False) assert rposix.get_inheritable(fd1) == False os.close(fd1) os.close(fd2)
def descr__new__(space, w_subtype): kqfd = syscall_kqueue() if kqfd < 0: raise exception_from_saved_errno(space, space.w_IOError) try: rposix.set_inheritable(kqfd, False) except OSError as e: raise wrap_oserror(space, e) return W_Kqueue(space, kqfd)
def test_dup_dup2_non_inheritable(): for preset in [False, True]: fd1, fd2 = os.pipe() rposix.set_inheritable(fd1, preset) rposix.set_inheritable(fd2, preset) fd3 = rposix.dup(fd1, True) assert rposix.get_inheritable(fd3) == True fd4 = rposix.dup(fd1, False) assert rposix.get_inheritable(fd4) == False rposix.dup2(fd2, fd4, False) assert rposix.get_inheritable(fd4) == False rposix.dup2(fd2, fd3, True) assert rposix.get_inheritable(fd3) == True os.close(fd1) os.close(fd2) os.close(fd3) os.close(fd4)
def test_SetNonInheritableCache(): cache = rposix.SetNonInheritableCache() fd1, fd2 = os.pipe() if sys.platform == 'win32': rposix.set_inheritable(fd1, True) rposix.set_inheritable(fd2, True) assert rposix.get_inheritable(fd1) == True assert rposix.get_inheritable(fd1) == True assert cache.cached_inheritable == -1 cache.set_non_inheritable(fd1) assert cache.cached_inheritable == 1 cache.set_non_inheritable(fd2) assert cache.cached_inheritable == 1 assert rposix.get_inheritable(fd1) == False assert rposix.get_inheritable(fd1) == False os.close(fd1) os.close(fd2)
def descr_init(self, space, w_name, mode='r', closefd=True, w_opener=None): if self.fd >= 0: if self.closefd: self._close(space) else: self.fd = -1 if space.isinstance_w(w_name, space.w_float): raise oefmt(space.w_TypeError, "integer argument expected, got float") fd = -1 try: fd = space.c_int_w(w_name) except OperationError as e: pass else: if fd < 0: raise oefmt(space.w_ValueError, "negative file descriptor") self.readable, self.writable, self.created, self.appending, flags = decode_mode(space, mode) if rposix.O_CLOEXEC is not None: flags |= rposix.O_CLOEXEC fd_is_own = False try: if fd >= 0: self.fd = fd self.closefd = bool(closefd) else: self.closefd = True if not closefd: raise oefmt(space.w_ValueError, "Cannot use closefd=False with file name") if space.is_none(w_opener): from pypy.module.posix.interp_posix import dispatch_filename, fspath w_path = fspath(space, w_name) while True: try: self.fd = dispatch_filename(rposix.open)( space, w_path, flags, 0666) fd_is_own = True break except OSError as e: wrap_oserror2(space, e, w_name, w_exception_class=space.w_IOError, eintr_retry=True) try: _open_inhcache.set_non_inheritable(self.fd) except OSError as e: raise wrap_oserror2(space, e, w_name, eintr_retry=False) else: w_fd = space.call_function(w_opener, w_name, space.newint(flags)) try: self.fd = space.int_w(w_fd) if self.fd < 0: # The opener returned a negative result instead # of raising an exception raise oefmt(space.w_ValueError, "opener returned %d", self.fd) fd_is_own = True except OperationError as e: if not e.match(space, space.w_TypeError): raise raise oefmt(space.w_TypeError, "expected integer from opener") if not rposix._WIN32: try: rposix.set_inheritable(self.fd, False) except OSError as e: raise wrap_oserror2(space, e, w_name, eintr_retry=False) try: st = os.fstat(self.fd) except OSError as e: raise wrap_oserror(space, e, eintr_retry=False) # On Unix, fopen will succeed for directories. # In Python, there should be no file objects referring to # directories, so we need a check. if stat.S_ISDIR(st.st_mode): raise wrap_oserror2(space, OSError(errno.EISDIR, "fstat"), w_name, w_exception_class=space.w_IOError, eintr_retry=False) self.blksize = DEFAULT_BUFFER_SIZE if HAS_BLKSIZE and st.st_blksize > 1: self.blksize = st.st_blksize _setfd_binary(self.fd) space.setattr(self, space.newtext("name"), w_name) if self.appending: # For consistent behaviour, we explicitly seek to the end of file # (otherwise, it might be done only on the first write()). try: os.lseek(self.fd, 0, os.SEEK_END) except OSError as e: raise wrap_oserror(space, e, w_exception_class=space.w_IOError, eintr_retry=False) except: if not fd_is_own: self.fd = -1 self._close(space) raise