int gpgdecode(int in_fd, int out_fd) { char passfd_buf[NUMBUFSIZE]; FILE *fp=passphrasefp(); int in_dup, out_dup; FILE *in_fp, *out_fp; struct libmail_gpg_info gi; char *argvec[2]; int i; gpginiterr(); if ((in_dup=dup(in_fd)) < 0 || (in_fp=fdopen(in_dup, "r")) == NULL) { if (in_dup >= 0) close(in_dup); fclose(fp); enomem(); return 1; } if ((out_dup=dup(out_fd)) < 0 || (out_fp=fdopen(out_dup, "w")) == NULL) { if (out_dup >= 0) close(out_dup); fclose(in_fp); close(in_dup); fclose(fp); enomem(); return 1; } memset(&gi, 0, sizeof(gi)); gi.gnupghome=GPGDIR; if (fp) { gi.passphrase_fd=libmail_str_size_t(fileno(fp), passfd_buf); } gi.input_func= read_fd; gi.input_func_arg= in_fp; gi.output_func= write_fd; gi.output_func_arg= out_fp; gi.errhandler_func= gpg_error_save; gi.errhandler_arg= NULL; argvec[0] = "--no-tty"; argvec[1]=NULL; gi.argc=1; gi.argv=argvec; i=libmail_gpg_decode(LIBMAIL_GPG_UNENCRYPT|LIBMAIL_GPG_CHECKSIGN, &gi); fclose(out_fp); close(out_dup); fclose(in_fp); close(in_dup); if (fp) fclose(fp); if (i) { printf("<div class=\"indent\"><pre style=\"color: red;\">"); sent_gpgerrtxt(); printf("</pre></div>\n"); } return (i); }
int gpgdecode(int in_fd, int out_fd) { pid_t pid; int stderrfd[2]; int rc; if (pipe(stderrfd)) { enomem(); } pid=fork(); if (pid < 0) { close(stderrfd[0]); close(stderrfd[1]); enomem(); } if (pid == 0) { FILE *fp=passphrasefp(); char *argvec[20]; int i; char passfd_buf[NUMBUFSIZE]; close(0); dup(in_fd); close(1); dup(out_fd); close(in_fd); close(out_fd); close(2); dup(stderrfd[1]); close(stderrfd[1]); close(stderrfd[0]); argvec[0]=MIMEGPG; argvec[1]="-c"; argvec[2]="-d"; i=3; if (fp) { argvec[i++]="-p"; argvec[i++]=libmail_str_size_t(fileno(fp), passfd_buf); } argvec[i++]="--"; argvec[i++]="--no-tty"; argvec[i]=0; putenv("GNUPGHOME=" GPGDIR); execv(MIMEGPG, argvec); perror(MIMEGPG); exit(1); } close (stderrfd[1]); rc=wait_mimegpg(pid, stderrfd[0]); if (rc) { printf("<blockquote><pre style=\"color: red;\">"); sent_gpgerrtxt(); printf("</pre></blockquote>\n"); } return (rc); }