diff options
| author | Werner Koch <[email protected]> | 2013-08-09 17:19:26 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2013-08-09 17:19:26 +0000 | 
| commit | 8579091c4f6a36e6bb06fcfbd147a776166fd3ea (patch) | |
| tree | bf1e746416e7c1378832a65329cdcbffd6070df2 /src/gpgme-tool.c | |
| parent | Prefer GnuPG-2 engines over GnuPG-1. (diff) | |
| download | gpgme-8579091c4f6a36e6bb06fcfbd147a776166fd3ea.tar.gz gpgme-8579091c4f6a36e6bb06fcfbd147a776166fd3ea.zip | |
Add function gpgme_data_identify.
* src/gpgme.h.in (gpgme_data_type_t): New.
(gpgme_data_identify): New prototype.
* src/data-identify.c: New.
* src/parsetlv.c, src/parsetlv.h: New.  Take from gpa.
* src/libgpgme.vers, src/gpgme.def: Add gpgme_data_identify.
* src/gpgme-tool.c (status): Add STATUS_IDENTIFY_RESULT.
(gt_identify): New.
(cmd_identify): New.
(hlp_passwd): Move close to cmd_passwd.
--
It is often useful to have a way to identify the data which needs
processing.  This is such a common task that it makes sense to
implement this in gpgme to avoid diverging implementations.
Diffstat (limited to 'src/gpgme-tool.c')
| -rw-r--r-- | src/gpgme-tool.c | 73 | 
1 files changed, 66 insertions, 7 deletions
| diff --git a/src/gpgme-tool.c b/src/gpgme-tool.c index 0ebababb..2bf7654a 100644 --- a/src/gpgme-tool.c +++ b/src/gpgme-tool.c @@ -1435,7 +1435,8 @@ typedef enum status      STATUS_INCLUDE_CERTS,      STATUS_KEYLIST_MODE,      STATUS_RECIPIENT, -    STATUS_ENCRYPT_RESULT +    STATUS_ENCRYPT_RESULT, +    STATUS_IDENTIFY_RESULT    } status_t;  const char *status_string[] = @@ -1448,7 +1449,8 @@ const char *status_string[] =      "INCLUDE_CERTS",      "KEYLIST_MODE",      "RECIPIENT", -    "ENCRYPT_RESULT" +    "ENCRYPT_RESULT", +    "IDENTIFY_RESULT"    };  struct gpgme_tool @@ -2065,11 +2067,6 @@ gt_vfs_create (gpgme_tool_t gt, const char *container_file, int flags)  } -static const char hlp_passwd[] = -  "PASSWD <user-id>\n" -  "\n" -  "Ask the backend to change the passphrase for the key\n" -  "specified by USER-ID.";  gpg_error_t  gt_passwd (gpgme_tool_t gt, char *fpr)  { @@ -2086,6 +2083,29 @@ gt_passwd (gpgme_tool_t gt, char *fpr)  } +gpg_error_t +gt_identify (gpgme_tool_t gt, gpgme_data_t data) +{ +  const char *s = "?"; + +  switch (gpgme_data_identify (data, 0)) +    { +    case GPGME_DATA_TYPE_INVALID: return gpg_error (GPG_ERR_GENERAL); +    case GPGME_DATA_TYPE_UNKNOWN      : s = "unknown"; break; +    case GPGME_DATA_TYPE_PGP_SIGNED   : s = "PGP-signed"; break; +    case GPGME_DATA_TYPE_PGP_OTHER    : s = "PGP"; break; +    case GPGME_DATA_TYPE_PGP_KEY      : s = "PGP-key"; break; +    case GPGME_DATA_TYPE_CMS_SIGNED   : s = "CMS-signed"; break; +    case GPGME_DATA_TYPE_CMS_ENCRYPTED: s = "CMS-encrypted"; break; +    case GPGME_DATA_TYPE_CMS_OTHER    : s = "CMS"; break; +    case GPGME_DATA_TYPE_X509_CERT    : s = "X.509"; break; +    case GPGME_DATA_TYPE_PKCS12       : s = "PKCS12"; break; +    } +  gt_write_status (gt, STATUS_IDENTIFY_RESULT, s, NULL); +  return 0; +} + +  #define GT_RESULT_ENCRYPT 0x1  #define GT_RESULT_DECRYPT 0x2  #define GT_RESULT_SIGN 0x4 @@ -3374,6 +3394,11 @@ cmd_vfs_create (assuan_context_t ctx, char *line)  } +static const char hlp_passwd[] = +  "PASSWD <user-id>\n" +  "\n" +  "Ask the backend to change the passphrase for the key\n" +  "specified by USER-ID.";  static gpg_error_t  cmd_passwd (assuan_context_t ctx, char *line)  { @@ -3430,6 +3455,39 @@ cmd_hash_algo_name (assuan_context_t ctx, char *line)  } +static const char hlp_identify[] = +  "IDENTIY\n" +  "\n" +  "Identify the type of data set with the INPUT command."; +static gpg_error_t +cmd_identify (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; +  gpgme_data_t inp_data; + +  inp_fd = server->input_fd; +  inp_fn = server->input_filename; +  if (inp_fd == ASSUAN_INVALID_FD && !inp_fn) +    return GPG_ERR_ASS_NO_INPUT; + +  err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data, +                         &server->input_stream); +  if (err) +    return err; + +  err = gt_identify (server->gt, inp_data); + +  gpgme_data_release (inp_data); +  server_reset_fds (server); + +  return err; +} + + +  /* Tell the assuan library about our commands.  */  static gpg_error_t  register_commands (assuan_context_t ctx) @@ -3488,6 +3546,7 @@ register_commands (assuan_context_t ctx)      { "PUBKEY_ALGO_NAME", cmd_pubkey_algo_name },      { "HASH_ALGO_NAME", cmd_hash_algo_name },      { "PASSWD", cmd_passwd, hlp_passwd }, +    { "IDENTIFY", cmd_identify, hlp_identify },      { NULL }    };    int idx; | 
