aboutsummaryrefslogtreecommitdiffstats
path: root/gpgme/rungpg.c
diff options
context:
space:
mode:
Diffstat (limited to 'gpgme/rungpg.c')
-rw-r--r--gpgme/rungpg.c130
1 files changed, 70 insertions, 60 deletions
diff --git a/gpgme/rungpg.c b/gpgme/rungpg.c
index f4ca2ad5..51ca545b 100644
--- a/gpgme/rungpg.c
+++ b/gpgme/rungpg.c
@@ -52,6 +52,8 @@ struct arg_and_data_s
int inbound; /* True if this is used for reading from gpg. */
int dup_to;
int print_fd; /* Print the fd number and not the special form of it. */
+ int *arg_locp; /* Write back the argv idx of this argument when
+ building command line to this location. */
char arg[1]; /* Used if data above is not used. */
};
@@ -62,7 +64,8 @@ struct fd_data_map_s
int inbound; /* true if this is used for reading from gpg */
int dup_to;
int fd; /* the fd to use */
- int peer_fd; /* the outher side of the pipe */
+ int peer_fd; /* the other side of the pipe */
+ int arg_loc; /* The index into the argv for translation purposes. */
void *tag;
};
@@ -82,6 +85,7 @@ struct engine_gpg
struct
{
int fd[2];
+ int arg_loc;
size_t bufsize;
char *buffer;
size_t readpos;
@@ -95,6 +99,7 @@ struct engine_gpg
struct
{
int fd[2];
+ int arg_loc;
size_t bufsize;
char *buffer;
size_t readpos;
@@ -191,7 +196,7 @@ close_notify_handler (int fd, void *opaque)
/* If FRONT is true, push at the front of the list. Use this for
options added late in the process. */
static gpgme_error_t
-add_arg_ext (engine_gpg_t gpg, const char *arg, int front)
+_add_arg (engine_gpg_t gpg, const char *arg, int front, int *arg_locp)
{
struct arg_and_data_s *a;
@@ -204,6 +209,8 @@ add_arg_ext (engine_gpg_t gpg, const char *arg, int front)
a->data = NULL;
a->dup_to = -1;
+ a->arg_locp = arg_locp;
+
strcpy (a->arg, arg);
if (front)
{
@@ -227,11 +234,26 @@ add_arg_ext (engine_gpg_t gpg, const char *arg, int front)
}
static gpgme_error_t
+add_arg_ext (engine_gpg_t gpg, const char *arg, int front)
+{
+ return _add_arg (gpg, arg, front, NULL);
+}
+
+
+static gpgme_error_t
+add_arg_with_locp (engine_gpg_t gpg, const char *arg, int *locp)
+{
+ return _add_arg (gpg, arg, 0, locp);
+}
+
+
+static gpgme_error_t
add_arg (engine_gpg_t gpg, const char *arg)
{
return add_arg_ext (gpg, arg, 0);
}
+
static gpgme_error_t
add_data (engine_gpg_t gpg, gpgme_data_t data, int dup_to, int inbound)
{
@@ -246,6 +268,8 @@ add_data (engine_gpg_t gpg, gpgme_data_t data, int dup_to, int inbound)
a->next = NULL;
a->data = data;
a->inbound = inbound;
+ a->arg_locp = NULL;
+
if (dup_to == -2)
{
a->print_fd = 1;
@@ -450,7 +474,7 @@ gpg_new (void **engine, const char *file_name, const char *home_dir)
{
char buf[25];
_gpgme_io_fd2str (buf, sizeof (buf), gpg->status.fd[1]);
- rc = add_arg (gpg, buf);
+ rc = add_arg_with_locp (gpg, buf, &gpg->status.arg_loc);
if (rc)
goto leave;
}
@@ -798,6 +822,9 @@ build_argv (engine_gpg_t gpg)
argc++;
for (a = gpg->arglist; a; a = a->next)
{
+ if (a->arg_locp)
+ *(a->arg_locp) = argc;
+
if (a->data)
{
/* Create a pipe to pass it down to gpg. */
@@ -853,6 +880,7 @@ build_argv (engine_gpg_t gpg)
fd_data_map[datac].data = a->data;
fd_data_map[datac].dup_to = a->dup_to;
+
if (a->dup_to == -1)
{
char *ptr;
@@ -874,8 +902,9 @@ build_argv (engine_gpg_t gpg)
*(ptr++) = '&';
buflen -= 2;
}
-
+
_gpgme_io_fd2str (ptr, buflen, fd_data_map[datac].peer_fd);
+ fd_data_map[datac].arg_loc = argc;
argc++;
}
datac++;
@@ -1225,7 +1254,7 @@ start (engine_gpg_t gpg)
int saved_errno;
int i, n;
int status;
- struct spawn_fd_item_s *fd_child_list, *fd_parent_list;
+ struct spawn_fd_item_s *fd_list;
pid_t pid;
if (!gpg)
@@ -1256,63 +1285,41 @@ start (engine_gpg_t gpg)
if (rc)
return rc;
- n = 3; /* status_fd, colon_fd and end of list */
+ /* status_fd, colon_fd and end of list. */
+ n = 3;
for (i = 0; gpg->fd_data_map[i].data; i++)
n++;
- fd_child_list = calloc (n + n, sizeof *fd_child_list);
- if (!fd_child_list)
+ fd_list = calloc (n, sizeof *fd_list);
+ if (! fd_list)
return gpg_error_from_errno (errno);
- fd_parent_list = fd_child_list + n;
- /* build the fd list for the child */
+ /* Build the fd list for the child. */
n = 0;
- /* The status fd is never dup'ed, so do not include it in the list. */
+ fd_list[n].fd = gpg->status.fd[1];
+ fd_list[n].dup_to = -1;
+ fd_list[n].arg_loc = gpg->status.arg_loc;
+ n++;
if (gpg->colon.fnc)
{
- fd_child_list[n].fd = gpg->colon.fd[1];
- fd_child_list[n].dup_to = 1; /* dup to stdout */
+ fd_list[n].fd = gpg->colon.fd[1];
+ fd_list[n].dup_to = 1;
n++;
}
for (i = 0; gpg->fd_data_map[i].data; i++)
{
- if (gpg->fd_data_map[i].dup_to != -1)
- {
- fd_child_list[n].fd = gpg->fd_data_map[i].peer_fd;
- fd_child_list[n].dup_to = gpg->fd_data_map[i].dup_to;
- n++;
- }
- }
- fd_child_list[n].fd = -1;
- fd_child_list[n].dup_to = -1;
-
- /* Build the fd list for the parent. */
- n = 0;
- if (gpg->status.fd[1] != -1)
- {
- fd_parent_list[n].fd = gpg->status.fd[1];
- fd_parent_list[n].dup_to = -1;
- n++;
- }
- if (gpg->colon.fd[1] != -1)
- {
- fd_parent_list[n].fd = gpg->colon.fd[1];
- fd_parent_list[n].dup_to = -1;
+ fd_list[n].fd = gpg->fd_data_map[i].peer_fd;
+ fd_list[n].dup_to = gpg->fd_data_map[i].dup_to;
+ fd_list[n].arg_loc = gpg->fd_data_map[i].arg_loc;
n++;
}
- for (i = 0; gpg->fd_data_map[i].data; i++)
- {
- fd_parent_list[n].fd = gpg->fd_data_map[i].peer_fd;
- fd_parent_list[n].dup_to = -1;
- n++;
- }
- fd_parent_list[n].fd = -1;
- fd_parent_list[n].dup_to = -1;
+ fd_list[n].fd = -1;
+ fd_list[n].dup_to = -1;
status = _gpgme_io_spawn (gpg->file_name ? gpg->file_name :
- _gpgme_get_gpg_path (),
- gpg->argv, fd_child_list, fd_parent_list, &pid);
+ _gpgme_get_gpg_path (), gpg->argv, fd_list, &pid);
saved_errno = errno;
- free (fd_child_list);
+
+ free (fd_list);
if (status == -1)
return gpg_error_from_errno (saved_errno);
@@ -1382,7 +1389,9 @@ gpg_decrypt (void *engine, gpgme_data_t ciph, gpgme_data_t plain)
if (!err)
err = add_data (gpg, plain, 1, 1);
if (!err)
- err = add_data (gpg, ciph, 0, 0);
+ err = add_arg (gpg, "--");
+ if (!err)
+ err = add_data (gpg, ciph, -1, 0);
if (!err)
start (gpg);
@@ -1616,7 +1625,7 @@ gpg_encrypt (void *engine, gpgme_key_t recp[], gpgme_encrypt_flags_t flags,
if (!err)
err = add_arg (gpg, "--");
if (!err)
- err = add_data (gpg, plain, 0, 0);
+ err = add_data (gpg, plain, -1, 0);
if (!err)
err = start (gpg);
@@ -1670,7 +1679,7 @@ gpg_encrypt_sign (void *engine, gpgme_key_t recp[],
if (!err)
err = add_arg (gpg, "--");
if (!err)
- err = add_data (gpg, plain, 0, 0);
+ err = add_data (gpg, plain, -1, 0);
if (!err)
err = start (gpg);
@@ -1759,7 +1768,9 @@ gpg_genkey (void *engine, gpgme_data_t help_data, int use_armor,
if (!err && use_armor)
err = add_arg (gpg, "--armor");
if (!err)
- err = add_data (gpg, help_data, 0, 0);
+ err = add_arg (gpg, "--");
+ if (!err)
+ err = add_data (gpg, help_data, -1, 0);
if (!err)
err = start (gpg);
@@ -1776,7 +1787,9 @@ gpg_import (void *engine, gpgme_data_t keydata)
err = add_arg (gpg, "--import");
if (!err)
- err = add_data (gpg, keydata, 0, 0);
+ err = add_arg (gpg, "--");
+ if (!err)
+ err = add_data (gpg, keydata, -1, 0);
if (!err)
err = start (gpg);
@@ -2011,7 +2024,9 @@ gpg_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
/* Tell the gpg object about the data. */
if (!err)
- err = add_data (gpg, in, 0, 0);
+ err = add_arg (gpg, "--");
+ if (!err)
+ err = add_data (gpg, in, -1, 0);
if (!err)
err = add_data (gpg, out, 1, 1);
@@ -2061,7 +2076,7 @@ gpg_verify (void *engine, gpgme_data_t sig, gpgme_data_t signed_text,
if (!err)
err = add_arg (gpg, "--");
if (!err)
- err = add_data (gpg, sig, 0, 0);
+ err = add_data (gpg, sig, -1, 0);
if (!err)
err = add_data (gpg, plaintext, 1, 1);
}
@@ -2072,13 +2087,8 @@ gpg_verify (void *engine, gpgme_data_t sig, gpgme_data_t signed_text,
err = add_arg (gpg, "--");
if (!err)
err = add_data (gpg, sig, -1, 0);
- if (signed_text)
- {
- if (!err)
- err = add_arg (gpg, "-");
- if (!err)
- err = add_data (gpg, signed_text, 0, 0);
- }
+ if (!err && signed_text)
+ err = add_data (gpg, signed_text, -1, 0);
}
if (!err)