diff options
Diffstat (limited to 'gpglib/sign.c')
| -rw-r--r-- | gpglib/sign.c | 109 | 
1 files changed, 109 insertions, 0 deletions
| diff --git a/gpglib/sign.c b/gpglib/sign.c new file mode 100644 index 0000000..a92a504 --- /dev/null +++ b/gpglib/sign.c @@ -0,0 +1,109 @@ +/* +** Copyright 2001-2003 Double Precision, Inc.  See COPYING for +** distribution information. +*/ + + +#include	"config.h" +#include	<stdio.h> +#include	<stdlib.h> +#include	<string.h> +#include	<unistd.h> +#include	<sys/types.h> +#include	<sys/stat.h> +#include	<sys/time.h> +#if HAVE_FCNTL_H +#include	<fcntl.h> +#endif +#include	"gpg.h" +#include	"gpglib.h" + +#include	"unicode/unicode.h" +#include	"numlib/numlib.h" + +extern int libmail_gpg_stdin, libmail_gpg_stdout, libmail_gpg_stderr; +extern pid_t libmail_gpg_pid; + + +/* +** Sign a key. +*/ + +static int dosignkey(int (*)(const char *, size_t, void *), +		     const char *cmdstr, +		     void *); + +int libmail_gpg_signkey(const char *gpgdir, const char *signthis, const char *signwith, +		int passphrase_fd, +		int (*dump_func)(const char *, size_t, void *), +		int trust_level, +		void *voidarg) +{ +	char *argvec[12]; +	int rc; +	char passphrase_fd_buf[NUMBUFSIZE]; +	int i; + +	argvec[0]="gpg"; +	argvec[1]="--command-fd"; +	argvec[2]="0"; +	argvec[3]="--default-key"; +	argvec[4]=(char *)signwith; +	argvec[5]="-q"; +	argvec[6]="--no-tty"; + +	i=7; +	if (passphrase_fd >= 0 && fcntl(passphrase_fd, F_SETFD, 0) >= 0) +	{ +		GPGARGV_PASSPHRASE_FD(argvec, i, passphrase_fd, +				      passphrase_fd_buf); +	} + +	argvec[i++]="--sign-key"; +	argvec[i++]=(char *)signthis; +	argvec[i]=0; + +	if (libmail_gpg_fork(&libmail_gpg_stdin, &libmail_gpg_stdout, NULL, gpgdir, argvec) < 0) +		rc= -1; +	else +	{ +		int rc2; + +		char cmdstr[10]; + +#if GPG_HAS_CERT_CHECK_LEVEL + +		cmdstr[0]='0'; + +		if (trust_level > 0 && trust_level <= 9) +			cmdstr[0]='0' + trust_level; + +		strcpy(cmdstr+1, "\nY\n"); + +#else +		strcpy(cmdstr, "Y\n"); +#endif + +		rc=dosignkey(dump_func, cmdstr, voidarg); +		rc2=libmail_gpg_cleanup(); +		if (rc2) +			rc=rc2; +	} +	return (rc); +} + +static int dosignkey(int (*dump_func)(const char *, size_t, void *), +		     const char *cmdstr, +		     void *voidarg) +{ +	int rc=libmail_gpg_write( cmdstr, strlen(cmdstr), +			 dump_func, NULL, NULL, 0, voidarg); +	int rc2; + +	if (rc == 0) +		rc=libmail_gpg_read(dump_func, NULL, NULL, 0, voidarg); +	rc2=libmail_gpg_cleanup(); +	if (rc == 0) +		rc=rc2; +	return (rc); +} | 
