- else
- {
-//#define UNLINK_EXIT(X) exit(X)
-#define UNLINK_EXIT(X) unlink(sig);unlink(data);exit(X)
-
- // for clear-signed files we have created tempfiles we have to clean up
- // and we do an additional check, so fork yet another time …
- pid_t pid = ExecFork();
- if(pid < 0) {
- ioprintf(std::cerr, "Fork failed for %s to check %s", Args[0], File.c_str());
- UNLINK_EXIT(EINTERNAL);
- }
- if(pid == 0)
- {
- if (statusfd != -1)
- dup2(fd[1], statusfd);
- execvp(gpgvpath.c_str(), (char **) &Args[0]);
- ioprintf(std::cerr, "Couldn't execute %s to check %s", Args[0], File.c_str());
- UNLINK_EXIT(EINTERNAL);
- }
-
- // Wait and collect the error code - taken from WaitPid as we need the exact Status
- int Status;
- while (waitpid(pid,&Status,0) != pid)
- {
- if (errno == EINTR)
- continue;
- ioprintf(std::cerr, _("Waited for %s but it wasn't there"), "gpgv");
- UNLINK_EXIT(EINTERNAL);
- }
-#undef UNLINK_EXIT
- // we don't need the files any longer as we have the filedescriptors still open
- unlink(sig);
- unlink(data);
- free(sig);
- free(data);
-
- // check if it exit'ed normally …
- if (WIFEXITED(Status) == false)
- {
- ioprintf(std::cerr, _("Sub-process %s exited unexpectedly"), "gpgv");
- exit(EINTERNAL);
- }
-
- // … and with a good exit code
- if (WEXITSTATUS(Status) != 0)
- {
- ioprintf(std::cerr, _("Sub-process %s returned an error code (%u)"), "gpgv", WEXITSTATUS(Status));
- exit(WEXITSTATUS(Status));
- }