From: David Shea dshea@redhat.com
--- anaconda | 2 +- pyanaconda/anaconda.py | 2 +- pyanaconda/bootloader.py | 10 +++++----- pyanaconda/exception.py | 10 +++++----- pyanaconda/iutil.py | 14 +++++++++++++- pyanaconda/kickstart.py | 2 +- pyanaconda/vnc.py | 4 ++-- tests/gui/outside/__init__.py | 1 + 8 files changed, 29 insertions(+), 16 deletions(-)
diff --git a/anaconda b/anaconda index 65a3d53..fcafcd6 100755 --- a/anaconda +++ b/anaconda @@ -969,7 +969,7 @@ if __name__ == "__main__": pidfile_created = True pid_string = "%s\n" % os.getpid() iutil.eintr_retry_call(os.write, pidfile, pid_string.encode("utf-8")) - os.close(pidfile) + iutil.eintr_ignore(os.close, pidfile) except FileExistsError: log.error("%s already exists, exiting", pidfile_path)
diff --git a/pyanaconda/anaconda.py b/pyanaconda/anaconda.py index 89c28b2..8b75d62 100644 --- a/pyanaconda/anaconda.py +++ b/pyanaconda/anaconda.py @@ -203,7 +203,7 @@ def dumpState(self): dump_text += threads dump_text = dump_text.encode("utf-8") iutil.eintr_retry_call(os.write, fd, dump_text) - os.close(fd) + iutil.eintr_ignore(os.close, fd)
# append to a given file with open("/tmp/anaconda-tb-all.log", "a+") as f: diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py index 4d3fa39..4819bd6 100644 --- a/pyanaconda/bootloader.py +++ b/pyanaconda/bootloader.py @@ -61,7 +61,7 @@ def get_boot_block(device, seek_blocks=0): if seek_blocks: os.lseek(fd, seek_blocks * block_size, 0) block = iutil.eintr_retry_call(os.read, fd, 512) - os.close(fd) + iutil.eintr_ignore(os.close, fd) if not status: try: device.teardown(recursive=True) @@ -1347,11 +1347,11 @@ def install(self, args=None): "stage2dev": self.grub_device_name(stage2dev)}) (pread, pwrite) = os.pipe() iutil.eintr_retry_call(os.write, pwrite, cmd.encode("utf-8")) - os.close(pwrite) + iutil.eintr_ignore(os.close, pwrite) args = ["--batch", "--no-floppy", "--device-map=%s" % self.device_map_file] rc = iutil.execInSysroot("grub", args, stdin=pread) - os.close(pread) + iutil.eintr_ignore(os.close, pread) if rc: raise BootLoaderError("boot loader install failed")
@@ -1540,11 +1540,11 @@ def _encrypt_password(self): (pread, pwrite) = os.pipe() passwords = "%s\n%s\n" % (self.password, self.password) iutil.eintr_retry_call(os.write, pwrite, passwords.encode("utf-8")) - os.close(pwrite) + iutil.eintr_ignore(os.close, pwrite) buf = iutil.execWithCapture("grub2-mkpasswd-pbkdf2", [], stdin=pread, root=iutil.getSysroot()) - os.close(pread) + iutil.eintr_ignore(os.close, pread) self.encrypted_password = buf.split()[-1].strip() if not self.encrypted_password.startswith("grub.pbkdf2."): raise BootLoaderError("failed to encrypt boot loader password") diff --git a/pyanaconda/exception.py b/pyanaconda/exception.py index 2fa3661..ab6b1e1 100644 --- a/pyanaconda/exception.py +++ b/pyanaconda/exception.py @@ -196,11 +196,11 @@ def runDebug(self, exc_info): iutil.vtActivate(1)
iutil.eintr_retry_call(os.open, "/dev/console", os.O_RDWR) # reclaim stdin - os.dup2(0, 1) # reclaim stdout - os.dup2(0, 2) # reclaim stderr - # ^ - # | - # +------ dup2 is magic, I tells ya! + iutil.eintr_ignore(os.dup2, 0, 1) # reclaim stdout + iutil.eintr_ignore(os.dup2, 0, 2) # reclaim stderr + # ^ + # | + # +------ dup2 is magic, I tells ya!
# bring back the echo import termios diff --git a/pyanaconda/iutil.py b/pyanaconda/iutil.py index ecd089a..fafa593 100644 --- a/pyanaconda/iutil.py +++ b/pyanaconda/iutil.py @@ -1287,7 +1287,7 @@ def ipmi_report(event): # Event data 2 & 3 - always 0x0 for us event_string = "0x4 0x1F 0x0 0x6f %#x 0x0 0x0\n" % event eintr_retry_call(os.write, fd, event_string.encode("utf-8")) - os.close(fd) + eintr_ignore(os.close, fd)
execWithCapture("ipmitool", ["sel", "add", path])
@@ -1302,6 +1302,18 @@ def eintr_retry_call(func, *args, **kwargs): except InterruptedError: continue
+def eintr_ignore(func, *args, **kwargs): + """Call a function and ignore EINTR. + + This is useful for calls to close() and dup2(), which can return EINTR + but which should *not* be retried, since by the time the return the + file descriptor is already closed. + """ + try: + return func(*args, **kwargs) + except InterruptedError: + pass + def parent_dir(directory): """Return the parent's path""" return "/".join(os.path.normpath(directory).split("/")[:-1]) diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py index 8dcad54..804f729 100644 --- a/pyanaconda/kickstart.py +++ b/pyanaconda/kickstart.py @@ -105,7 +105,7 @@ def run(self, chroot): (fd, path) = tempfile.mkstemp("", "ks-script-", scriptRoot + "/tmp")
iutil.eintr_retry_call(os.write, fd, self.script.encode("utf-8")) - os.close(fd) + iutil.eintr_ignore(os.close, fd) iutil.eintr_retry_call(os.chmod, path, 0o700)
# Always log stdout/stderr from scripts. Using --log just lets you diff --git a/pyanaconda/vnc.py b/pyanaconda/vnc.py index 7f1a7d3..0248f45 100644 --- a/pyanaconda/vnc.py +++ b/pyanaconda/vnc.py @@ -88,8 +88,8 @@ def setVNCPassword(self): rc = iutil.execWithRedirect("vncpasswd", ["-f"], stdin=r, stdout=pw_file, binary_output=True, log_output=False)
- os.close(r) - os.close(w) + iutil.eintr_ignore(os.close, r) + iutil.eintr_ignore(os.close, w)
return rc
diff --git a/tests/gui/outside/__init__.py b/tests/gui/outside/__init__.py index 3eba8d9..7b18cbf 100644 --- a/tests/gui/outside/__init__.py +++ b/tests/gui/outside/__init__.py @@ -19,6 +19,7 @@
# Ignore any interruptible calls # pylint: disable=interruptible-system-call +# pylint: disable=ignorable-system-call
__all__ = ["Creator", "OutsideMixin"]
Added label: ACK.
Closed.
Pushed
anaconda-patches@lists.fedorahosted.org