Esempio n. 1
0
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);
}
Esempio n. 2
0
File: gpg.c Progetto: zixia/wmail
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);
}