diff options
Diffstat (limited to 'gpgme/rungpg.c')
-rw-r--r-- | gpgme/rungpg.c | 189 |
1 files changed, 82 insertions, 107 deletions
diff --git a/gpgme/rungpg.c b/gpgme/rungpg.c index f67f68fd..fb797edf 100644 --- a/gpgme/rungpg.c +++ b/gpgme/rungpg.c @@ -44,14 +44,16 @@ #include "status-table.h" -/* This type is used to build a list of gpg arguments and - * data sources/sinks */ -struct arg_and_data_s { - struct arg_and_data_s *next; - GpgmeData data; /* If this is not NULL .. */ - int dup_to; - int print_fd; /* print the fd number and not the special form of it */ - char arg[1]; /* .. this is used */ +/* This type is used to build a list of gpg arguments and data + sources/sinks. */ +struct arg_and_data_s +{ + struct arg_and_data_s *next; + GpgmeData data; /* If this is not NULL, use arg below. */ + 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. */ + char arg[1]; /* Used if data above is not used. */ }; struct fd_data_map_s @@ -378,33 +380,37 @@ _gpgme_gpg_add_arg ( GpgObject gpg, const char *arg ) } GpgmeError -_gpgme_gpg_add_data ( GpgObject gpg, GpgmeData data, int dup_to ) +_gpgme_gpg_add_data (GpgObject gpg, GpgmeData data, int dup_to, int inbound) { - struct arg_and_data_s *a; + struct arg_and_data_s *a; - assert (gpg); - assert (data); - if (gpg->pm.active) - return 0; + assert (gpg); + assert (data); + if (gpg->pm.active) + return 0; - a = xtrymalloc ( sizeof *a - 1 ); - if ( !a ) { - gpg->arg_error = 1; - return mk_error(Out_Of_Core); + a = xtrymalloc (sizeof *a - 1); + if (!a) + { + gpg->arg_error = 1; + return mk_error(Out_Of_Core); } - a->next = NULL; - a->data = data; - if ( dup_to == -2 ) { - a->print_fd = 1; - a->dup_to = -1; + a->next = NULL; + a->data = data; + a->inbound = inbound; + if (dup_to == -2) + { + a->print_fd = 1; + a->dup_to = -1; } - else { - a->print_fd = 0; - a->dup_to = dup_to; + else + { + a->print_fd = 0; + a->dup_to = dup_to; } - *gpg->argtail = a; - gpg->argtail = &a->next; - return 0; + *gpg->argtail = a; + gpg->argtail = &a->next; + return 0; } GpgmeError @@ -435,7 +441,7 @@ _gpgme_gpg_add_pm_data ( GpgObject gpg, GpgmeData data, int what ) rc = gpgme_data_new_with_read_cb ( &tmp, pipemode_cb, gpg ); if (!rc ) - rc = _gpgme_gpg_add_data (gpg, tmp, 0); + rc = _gpgme_gpg_add_data (gpg, tmp, 0, 0); } if ( !rc ) { /* here we can reset the handler stuff */ @@ -532,8 +538,8 @@ _gpgme_gpg_set_command_handler (GpgObject gpg, if (err) return err; - _gpgme_gpg_add_arg ( gpg, "--command-fd" ); - _gpgme_gpg_add_data (gpg, tmp, -2); + _gpgme_gpg_add_arg (gpg, "--command-fd"); + _gpgme_gpg_add_data (gpg, tmp, -2, 0); gpg->cmd.cb_data = tmp; gpg->cmd.fnc = fnc; gpg->cmd.fnc_value = fnc_value; @@ -696,41 +702,9 @@ build_argv (GpgObject gpg) { if (a->data) { - switch (_gpgme_data_get_mode (a->data)) - { - case GPGME_DATA_MODE_NONE: - case GPGME_DATA_MODE_INOUT: - xfree (fd_data_map); - free_argv (argv); - return mk_error (Invalid_Mode); - case GPGME_DATA_MODE_IN: - /* Create a pipe to read from gpg. */ - fd_data_map[datac].inbound = 1; - break; - case GPGME_DATA_MODE_OUT: - /* Create a pipe to pass it down to gpg. */ - fd_data_map[datac].inbound = 0; - break; - } + /* Create a pipe to pass it down to gpg. */ + fd_data_map[datac].inbound = a->inbound; - switch (gpgme_data_get_type (a->data)) - { - case GPGME_DATA_TYPE_NONE: - if (fd_data_map[datac].inbound) - break; /* Allowed. */ - xfree (fd_data_map); - free_argv (argv); - return mk_error (Invalid_Type); - case GPGME_DATA_TYPE_MEM: - case GPGME_DATA_TYPE_CB: - break; - case GPGME_DATA_TYPE_FD: - case GPGME_DATA_TYPE_FILE: - xfree (fd_data_map); - free_argv (argv); - return mk_error (Not_Implemented); - } - /* Create a pipe. */ { int fds[2]; @@ -1256,29 +1230,30 @@ read_colon_line ( GpgObject gpg ) } static GpgmeError -pipemode_copy (char *buffer, size_t length, size_t *nread, GpgmeData data ) +pipemode_copy (char *buffer, size_t length, size_t *nread, GpgmeData data) { - GpgmeError err; - size_t nbytes; - char tmp[1000], *s, *d; - - /* we can optimize this whole thing but for now we just - * return after each escape character */ - if (length > 990) - length = 990; - - err = gpgme_data_read ( data, tmp, length, &nbytes ); - if (err) - return err; - for (s=tmp, d=buffer; nbytes; s++, nbytes--) { - *d++ = *s; - if (*s == '@' ) { - *d++ = '@'; - break; - } + size_t nbytes; + char tmp[1000], *src, *dst; + + /* We can optimize this whole thing but for now we just return after + each escape character. */ + if (length > 990) + length = 990; + + nbytes = gpgme_data_read (data, tmp, length); + if (nbytes < 0) + return mk_error (File_Error); + for (src = tmp, dst = buffer; nbytes; src++, nbytes--) + { + *dst++ = *src; + if (*src == '@') + { + *dst++ = '@'; + break; + } } - *nread = d - buffer; - return 0; + *nread = dst - buffer; + return 0; } @@ -1409,9 +1384,9 @@ _gpgme_gpg_op_decrypt (GpgObject gpg, GpgmeData ciph, GpgmeData plain) if (!err) err = _gpgme_gpg_add_arg (gpg, "-"); if (!err) - err = _gpgme_gpg_add_data (gpg, plain, 1); + err = _gpgme_gpg_add_data (gpg, plain, 1, 1); if (!err) - err = _gpgme_gpg_add_data (gpg, ciph, 0); + err = _gpgme_gpg_add_data (gpg, ciph, 0, 0); return err; } @@ -1477,7 +1452,7 @@ _gpgme_gpg_op_edit (GpgObject gpg, GpgmeKey key, GpgmeData out, if (!err) err = _gpgme_gpg_add_arg (gpg, "--edit-key"); if (!err) - err = _gpgme_gpg_add_data (gpg, out, 1); + err = _gpgme_gpg_add_data (gpg, out, 1, 1); if (!err) err = _gpgme_gpg_add_arg (gpg, "--"); if (!err) @@ -1542,11 +1517,11 @@ _gpgme_gpg_op_encrypt (GpgObject gpg, GpgmeRecipients recp, if (!err) err = _gpgme_gpg_add_arg (gpg, "-"); if (!err) - err = _gpgme_gpg_add_data (gpg, ciph, 1); + err = _gpgme_gpg_add_data (gpg, ciph, 1, 1); if (!err) err = _gpgme_gpg_add_arg (gpg, "--"); if (!err) - err = _gpgme_gpg_add_data (gpg, plain, 0); + err = _gpgme_gpg_add_data (gpg, plain, 0, 0); return err; } @@ -1581,11 +1556,11 @@ _gpgme_gpg_op_encrypt_sign (GpgObject gpg, GpgmeRecipients recp, if (!err) err = _gpgme_gpg_add_arg (gpg, "-"); if (!err) - err = _gpgme_gpg_add_data (gpg, ciph, 1); + err = _gpgme_gpg_add_data (gpg, ciph, 1, 1); if (!err) err = _gpgme_gpg_add_arg (gpg, "--"); if (!err) - err = _gpgme_gpg_add_data (gpg, plain, 0); + err = _gpgme_gpg_add_data (gpg, plain, 0, 0); return err; } @@ -1600,7 +1575,7 @@ _gpgme_gpg_op_export (GpgObject gpg, GpgmeRecipients recp, if (!err && use_armor) err = _gpgme_gpg_add_arg (gpg, "--armor"); if (!err) - err = _gpgme_gpg_add_data (gpg, keydata, 1); + err = _gpgme_gpg_add_data (gpg, keydata, 1, 1); if (!err) err = _gpgme_gpg_add_arg (gpg, "--"); @@ -1639,7 +1614,7 @@ _gpgme_gpg_op_genkey (GpgObject gpg, GpgmeData help_data, int use_armor, if (!err && use_armor) err = _gpgme_gpg_add_arg (gpg, "--armor"); if (!err) - err = _gpgme_gpg_add_data (gpg, help_data, 0); + err = _gpgme_gpg_add_data (gpg, help_data, 0, 0); return err; } @@ -1651,7 +1626,7 @@ _gpgme_gpg_op_import (GpgObject gpg, GpgmeData keydata) err = _gpgme_gpg_add_arg (gpg, "--import"); if (!err) - err = _gpgme_gpg_add_data (gpg, keydata, 0); + err = _gpgme_gpg_add_data (gpg, keydata, 0, 0); return err; } @@ -1741,9 +1716,9 @@ _gpgme_gpg_op_sign (GpgObject gpg, GpgmeData in, GpgmeData out, /* Tell the gpg object about the data. */ if (!err) - err = _gpgme_gpg_add_data (gpg, in, 0); + err = _gpgme_gpg_add_data (gpg, in, 0, 0); if (!err) - err = _gpgme_gpg_add_data (gpg, out, 1); + err = _gpgme_gpg_add_data (gpg, out, 1, 1); return err; } @@ -1767,11 +1742,11 @@ _gpgme_gpg_op_trustlist (GpgObject gpg, const char *pattern) } GpgmeError -_gpgme_gpg_op_verify (GpgObject gpg, GpgmeData sig, GpgmeData text) +_gpgme_gpg_op_verify (GpgObject gpg, GpgmeData sig, GpgmeData signed_text, GpgmeData plaintext) { GpgmeError err = 0; - if (_gpgme_data_get_mode (text) == GPGME_DATA_MODE_IN) + if (plaintext) { /* Normal or cleartext signature. */ @@ -1781,9 +1756,9 @@ _gpgme_gpg_op_verify (GpgObject gpg, GpgmeData sig, GpgmeData text) if (!err) err = _gpgme_gpg_add_arg (gpg, "--"); if (!err) - err = _gpgme_gpg_add_data (gpg, sig, 0); + err = _gpgme_gpg_add_data (gpg, sig, 0, 0); if (!err) - err = _gpgme_gpg_add_data (gpg, text, 1); + err = _gpgme_gpg_add_data (gpg, plaintext, 1, 1); } else { @@ -1795,7 +1770,7 @@ _gpgme_gpg_op_verify (GpgObject gpg, GpgmeData sig, GpgmeData text) if (!err) err = _gpgme_gpg_add_pm_data (gpg, sig, 0); if (!err) - err = _gpgme_gpg_add_pm_data (gpg, text, 1); + err = _gpgme_gpg_add_pm_data (gpg, signed_text, 1); } else { @@ -1803,13 +1778,13 @@ _gpgme_gpg_op_verify (GpgObject gpg, GpgmeData sig, GpgmeData text) if (!err) err = _gpgme_gpg_add_arg (gpg, "--"); if (!err) - err = _gpgme_gpg_add_data (gpg, sig, -1); - if (text) + err = _gpgme_gpg_add_data (gpg, sig, -1, 0); + if (signed_text) { if (!err) err = _gpgme_gpg_add_arg (gpg, "-"); if (!err) - err = _gpgme_gpg_add_data (gpg, text, 0); + err = _gpgme_gpg_add_data (gpg, signed_text, 0, 0); } } } |