aboutsummaryrefslogtreecommitdiffstats
path: root/src/gpgme-tool.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/gpgme-tool.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/gpgme-tool.c b/src/gpgme-tool.c
index 2bf7654a..a980347c 100644
--- a/src/gpgme-tool.c
+++ b/src/gpgme-tool.c
@@ -1742,6 +1742,8 @@ gt_protocol_from_name (const char *name)
return GPGME_PROTOCOL_G13;
if (! strcasecmp (name, gpgme_get_protocol_name (GPGME_PROTOCOL_UISERVER)))
return GPGME_PROTOCOL_UISERVER;
+ if (! strcasecmp (name, gpgme_get_protocol_name (GPGME_PROTOCOL_SPAWN)))
+ return GPGME_PROTOCOL_SPAWN;
if (! strcasecmp (name, gpgme_get_protocol_name (GPGME_PROTOCOL_DEFAULT)))
return GPGME_PROTOCOL_DEFAULT;
return GPGME_PROTOCOL_UNKNOWN;
@@ -2106,6 +2108,18 @@ gt_identify (gpgme_tool_t gt, gpgme_data_t data)
}
+gpg_error_t
+gt_spawn (gpgme_tool_t gt, const char *pgm,
+ gpgme_data_t inp, gpgme_data_t outp)
+{
+ gpg_error_t err;
+
+ err = gpgme_op_spawn (gt->ctx, pgm, NULL, inp, outp, outp, 0);
+
+ return err;
+}
+
+
#define GT_RESULT_ENCRYPT 0x1
#define GT_RESULT_DECRYPT 0x2
#define GT_RESULT_SIGN 0x4
@@ -3487,6 +3501,55 @@ cmd_identify (assuan_context_t ctx, char *line)
}
+static const char hlp_spawn[] =
+ "SPAWN PGM [args]\n"
+ "\n"
+ "Run program PGM with stdin connected to the INPUT source;\n"
+ "stdout and stderr to the OUTPUT source.";
+static gpg_error_t
+cmd_spawn (assuan_context_t ctx, char *line)
+{
+ struct server *server = assuan_get_pointer (ctx);
+ gpg_error_t err;
+ assuan_fd_t inp_fd;
+ char *inp_fn;
+ assuan_fd_t out_fd;
+ char *out_fn;
+ gpgme_data_t inp_data = NULL;
+ gpgme_data_t out_data = NULL;
+
+ inp_fd = server->input_fd;
+ inp_fn = server->input_filename;
+ out_fd = server->output_fd;
+ out_fn = server->output_filename;
+ if (inp_fd != ASSUAN_INVALID_FD || inp_fn)
+ {
+ err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data,
+ &server->input_stream);
+ if (err)
+ return err;
+ }
+ if (out_fd != ASSUAN_INVALID_FD || out_fn)
+ {
+ err = server_data_obj (out_fd, out_fn, 1, server->output_enc, &out_data,
+ &server->output_stream);
+ if (err)
+ {
+ gpgme_data_release (inp_data);
+ return err;
+ }
+ }
+
+ err = gt_spawn (server->gt, line, inp_data, out_data);
+
+ gpgme_data_release (inp_data);
+ gpgme_data_release (out_data);
+
+ server_reset_fds (server);
+
+ return err;
+}
+
/* Tell the assuan library about our commands. */
static gpg_error_t
@@ -3547,6 +3610,7 @@ register_commands (assuan_context_t ctx)
{ "HASH_ALGO_NAME", cmd_hash_algo_name },
{ "PASSWD", cmd_passwd, hlp_passwd },
{ "IDENTIFY", cmd_identify, hlp_identify },
+ { "SPAWN", cmd_spawn, hlp_spawn },
{ NULL }
};
int idx;