- ExecGPGV is a method which should never return, so mark it as such
    and fix the inconsistency of returning in error cases
 // ---------------------------------------------------------------------
 /* Generating the commandline for calling gpgv is somehow complicated as
    we need to add multiple keyrings and user supplied options. */
 // ---------------------------------------------------------------------
 /* Generating the commandline for calling gpgv is somehow complicated as
    we need to add multiple keyrings and user supplied options. */
-bool ExecGPGV(std::string const &File, std::string const &FileGPG,
+void ExecGPGV(std::string const &File, std::string const &FileGPG,
                        int const &statusfd, int fd[2])
 {
                        int const &statusfd, int fd[2])
 {
+   #define EINTERNAL 111
+
    if (File == FileGPG)
    {
       #define SIGMSG "-----BEGIN PGP SIGNED MESSAGE-----\n"
       char buffer[sizeof(SIGMSG)];
       FILE* gpg = fopen(File.c_str(), "r");
       if (gpg == NULL)
    if (File == FileGPG)
    {
       #define SIGMSG "-----BEGIN PGP SIGNED MESSAGE-----\n"
       char buffer[sizeof(SIGMSG)];
       FILE* gpg = fopen(File.c_str(), "r");
       if (gpg == NULL)
-        return _error->Errno("RunGPGV", _("Could not open file %s"), File.c_str());
+      {
+        ioprintf(std::cerr, _("Could not open file %s"), File.c_str());
+        exit(EINTERNAL);
+      }
       char const * const test = fgets(buffer, sizeof(buffer), gpg);
       fclose(gpg);
       if (test == NULL || strcmp(buffer, SIGMSG) != 0)
       char const * const test = fgets(buffer, sizeof(buffer), gpg);
       fclose(gpg);
       if (test == NULL || strcmp(buffer, SIGMSG) != 0)
-        return _error->Error(_("File %s doesn't start with a clearsigned message"), File.c_str());
+      {
+        ioprintf(std::cerr, _("File %s doesn't start with a clearsigned message"), File.c_str());
+        exit(EINTERNAL);
+      }
    if (keyrings.empty() == true)
    {
       // TRANSLATOR: %s is the trusted keyring parts directory
    if (keyrings.empty() == true)
    {
       // TRANSLATOR: %s is the trusted keyring parts directory
-      return _error->Error(_("No keyring installed in %s."),
-                          _config->FindDir("Dir::Etc::TrustedParts").c_str());
+      ioprintf(std::cerr, _("No keyring installed in %s."),
+           _config->FindDir("Dir::Etc::TrustedParts").c_str());
+      exit(EINTERNAL);
    }
 
    Args.push_back(gpgvpath.c_str());
    }
 
    Args.push_back(gpgvpath.c_str());
    }
 
    execvp(gpgvpath.c_str(), (char **) &Args[0]);
    }
 
    execvp(gpgvpath.c_str(), (char **) &Args[0]);
+   ioprintf(std::cerr, "Couldn't execute %s to check %s", Args[0], File.c_str());
+   exit(EINTERNAL);
 
-/** \brief generates and run the command to verify a file with gpgv */
-bool ExecGPGV(std::string const &File, std::string const &FileOut,
-      int const &statusfd, int fd[2]);
+#if __GNUC__ >= 4
+       #define APT_noreturn    __attribute__ ((noreturn))
+#else
+       #define APT_noreturn    /* no support */
+#endif
-inline bool ExecGPGV(std::string const &File, std::string const &FileOut,
+/** \brief generates and run the command to verify a file with gpgv
+ *
+ * If File and FileSig specify the same file it is assumed that we
+ * deal with a clear-signed message.
+ *
+ * @param File is the message (unsigned or clear-signed)
+ * @param FileSig is the signature (detached or clear-signed)
+ */
+void ExecGPGV(std::string const &File, std::string const &FileSig,
+      int const &statusfd, int fd[2]) APT_noreturn;
+inline void ExecGPGV(std::string const &File, std::string const &FileSig,
       int const &statusfd = -1) {
    int fd[2];
       int const &statusfd = -1) {
    int fd[2];
-   return ExecGPGV(File, FileOut, statusfd, fd);
-}
+   ExecGPGV(File, FileSig, statusfd, fd);
+};
+
+#undef APT_noreturn
 
 
    __deprecated static bool RunGPGV(std::string const &File, std::string const &FileOut,
                       int const &statusfd, int fd[2]) {
 
    __deprecated static bool RunGPGV(std::string const &File, std::string const &FileOut,
                       int const &statusfd, int fd[2]) {
-      return ExecGPGV(File, FileOut, statusfd, fd);
+      ExecGPGV(File, FileOut, statusfd, fd);
+      return false;
    };
    __deprecated static bool RunGPGV(std::string const &File, std::string const &FileOut,
                              int const &statusfd = -1) {
    };
    __deprecated static bool RunGPGV(std::string const &File, std::string const &FileOut,
                              int const &statusfd = -1) {
-      return ExecGPGV(File, FileOut, statusfd);
+      ExecGPGV(File, FileOut, statusfd);
+      return false;
 
   [ David Kalnischkies ]
   * apt-pkg/indexcopy.cc:
     - rename RunGPGV to ExecGPGV and move it to apt-pkg/contrib/gpgv.cc
   [ David Kalnischkies ]
   * apt-pkg/indexcopy.cc:
     - rename RunGPGV to ExecGPGV and move it to apt-pkg/contrib/gpgv.cc
+  * apt-pkg/contrib/gpgv.cc:
+    - ExecGPGV is a method which should never return, so mark it as such
+      and fix the inconsistency of returning in error cases
 
  -- David Kalnischkies <kalnischkies@gmail.com>  Fri, 15 Mar 2013 14:15:43 +0100
 
 
  -- David Kalnischkies <kalnischkies@gmail.com>  Fri, 15 Mar 2013 14:15:43 +0100
 
 
    if (pid < 0)
       return string("Couldn't spawn new process") + strerror(errno);
    else if (pid == 0)
    if (pid < 0)
       return string("Couldn't spawn new process") + strerror(errno);
    else if (pid == 0)
-   {
-      _error->PushToStack();
-      bool const success = ExecGPGV(outfile, file, 3, fd);
-      if (success == false)
-      {
-        string errmsg;
-        _error->PopMessage(errmsg);
-        _error->RevertToStack();
-        return errmsg;
-      }
-      _error->RevertToStack();
-      exit(111);
-   }
+      ExecGPGV(outfile, file, 3, fd);
    close(fd[1]);
 
    FILE *pipein = fdopen(fd[0], "r");
    close(fd[1]);
 
    FILE *pipein = fdopen(fd[0], "r");