46
46
int passPhrasePipe[2];
51
51
if (passPhrase == NULL)
54
54
passPhrasePipe[0] = passPhrasePipe[1] = 0;
55
xx = pipe(passPhrasePipe);
56
if (!(pid = fork())) {
55
if (pipe(passPhrasePipe))
60
close(passPhrasePipe[0]);
61
close(passPhrasePipe[1]);
57
66
char * cmd, * gpg_path;
61
xx = close(STDIN_FILENO);
62
xx = close(STDOUT_FILENO);
63
xx = close(passPhrasePipe[1]);
72
close(passPhrasePipe[1]);
64
73
if ((fdno = open("/dev/null", O_RDONLY)) != STDIN_FILENO) {
65
74
xx = dup2(fdno, STDIN_FILENO);
68
77
if ((fdno = open("/dev/null", O_WRONLY)) != STDOUT_FILENO) {
69
78
xx = dup2(fdno, STDOUT_FILENO);
72
81
xx = dup2(passPhrasePipe[0], 3);
80
89
cmd = rpmExpand("%{?__gpg_check_password_cmd}", NULL);
81
90
rc = poptParseArgvString(cmd, NULL, (const char ***)&av);
91
if (xx >= 0 && rc == 0) {
83
92
rc = execve(av[0], av+1, environ);
85
fprintf(stderr, _("Could not exec %s: %s\n"), "gpg",
93
fprintf(stderr, _("Could not exec %s: %s\n"), "gpg",
87
96
_exit(EXIT_FAILURE);
90
xx = close(passPhrasePipe[0]);
99
close(passPhrasePipe[0]);
91
100
xx = write(passPhrasePipe[1], passPhrase, strlen(passPhrase));
92
101
xx = write(passPhrasePipe[1], "\n", 1);
93
xx = close(passPhrasePipe[1]);
95
(void) waitpid(pid, &status, 0);
97
return ((WIFEXITED(status) && WEXITSTATUS(status) == 0)) ? 0 : 1;
102
close(passPhrasePipe[1]);
104
if (xx >= 0 && waitpid(pid, &status, 0) >= 0)
105
rc = (WIFEXITED(status) && WEXITSTATUS(status) == 0) ? 0 : 1;
100
110
/* TODO: permit overriding macro setup on the command line */