]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/gpg.py
Add obsolete_lintian_tags.pl tool to recognize obsolete tags
[dak.git] / daklib / gpg.py
index 5c396ec24a4a7274818b3e0f7acb71db734d78e0..865e9bd6dccc13b9b47354c510fa9c5503f2ab8c 100644 (file)
@@ -23,7 +23,6 @@ import errno
 import fcntl
 import os
 import select
-import sys
 
 try:
     _MAXFD = os.sysconf("SC_OPEN_MAX")
@@ -69,7 +68,7 @@ class SignedFile(object):
     def __init__(self, data, keyrings, require_signature=True, gpg="/usr/bin/gpg"):
         """
         @param data: string containing the message
-        @param keyrings: seqeuence of keyrings
+        @param keyrings: sequence of keyrings
         @param require_signature: if True (the default), will raise an exception if no valid signature was found
         @param gpg: location of the gpg binary
         """
@@ -86,32 +85,39 @@ class SignedFile(object):
         with _Pipe() as stdin:
          with _Pipe() as contents:
           with _Pipe() as status:
+           with _Pipe() as stderr:
             pid = os.fork()
             if pid == 0:
-                self._exec_gpg(stdin.r, contents.w, sys.stderr.fileno(), status.w)
+                self._exec_gpg(stdin.r, contents.w, stderr.w, status.w)
             else:
                 stdin.close_r()
                 contents.close_w()
+                stderr.close_w()
                 status.close_w()
 
-                read = self._do_io([contents.r, status.r], {stdin.w: data})
+                read = self._do_io([contents.r, stderr.r, status.r], {stdin.w: data})
                 stdin.w = None # was closed by _do_io
 
                 (pid_, exit_code, usage_) = os.wait4(pid, 0)
 
                 self.contents = read[contents.r]
                 self.status   = read[status.r]
+                self.stderr   = read[stderr.r]
 
                 if self.status == "":
-                    raise GpgException("No status output from GPG. (GPG exited with status code %s)" % exit_code)
+                    raise GpgException("No status output from GPG. (GPG exited with status code %s)\n%s" % (exit_code, self.stderr))
 
                 for line in self.status.splitlines():
                     self._parse_status(line)
 
                 if require_signature and not self.valid:
-                    raise GpgException("No valid signature found. (GPG exited with status code %s)" % exit_code)
+                    raise GpgException("No valid signature found. (GPG exited with status code %s)\n%s" % (exit_code, self.stderr))
 
     def _do_io(self, read, write):
+        for fd in write.keys():
+            old = fcntl.fcntl(fd, fcntl.F_GETFL)
+            fcntl.fcntl(fd, fcntl.F_SETFL, old | os.O_NONBLOCK)
+
         read_lines = dict( (fd, []) for fd in read )
         write_pos = dict( (fd, 0) for fd in write )
 
@@ -182,6 +188,6 @@ class SignedFile(object):
 
             os.execvp(self.gpg, args)
         finally:
-            sys.exit(1)
+            os._exit(1)
 
 # vim: set sw=4 et: