diff options
| author | Werner Koch <[email protected]> | 2018-04-18 07:26:33 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2018-04-18 07:26:33 +0000 | 
| commit | e69b175e8ed5430b56e2e8f3d68c16a45f0fed17 (patch) | |
| tree | 5a2070321970acd95ed6b0f5901467f99d0f6ae6 /src | |
| parent | core: Extend decryption result with symkey_algo. (diff) | |
| download | gpgme-e69b175e8ed5430b56e2e8f3d68c16a45f0fed17.tar.gz gpgme-e69b175e8ed5430b56e2e8f3d68c16a45f0fed17.zip | |
json: Add meta command ,read to gpgme-json.
* src/gpgme-json.c: Include stat.h.
(get_file): New.
(process_meta_commands): Implement ",read".
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src')
| -rw-r--r-- | src/gpgme-json.c | 59 | 
1 files changed, 58 insertions, 1 deletions
| diff --git a/src/gpgme-json.c b/src/gpgme-json.c index c73bebdb..56d69469 100644 --- a/src/gpgme-json.c +++ b/src/gpgme-json.c @@ -33,6 +33,7 @@  #include <locale.h>  #endif  #include <stdint.h> +#include <sys/stat.h>  #define GPGRT_ENABLE_ES_MACROS 1  #define GPGRT_ENABLE_LOG_MACROS 1 @@ -842,7 +843,6 @@ process_request (const char *request)                xjson_AddStringToObject (response, "op", op);              } -          }      }    else  /* Operation not supported.  */ @@ -869,6 +869,48 @@ process_request (const char *request)   *  Driver code   */ +static char * +get_file (const char *fname) +{ +  gpg_error_t err; +  estream_t fp; +  struct stat st; +  char *buf; +  size_t buflen; + +  fp = es_fopen (fname, "r"); +  if (!fp) +    { +      err = gpg_error_from_syserror (); +      log_error ("can't open '%s': %s\n", fname, gpg_strerror (err)); +      return NULL; +    } + +  if (fstat (es_fileno(fp), &st)) +    { +      err = gpg_error_from_syserror (); +      log_error ("can't stat '%s': %s\n", fname, gpg_strerror (err)); +      es_fclose (fp); +      return NULL; +    } + +  buflen = st.st_size; +  buf = xmalloc (buflen+1); +  if (es_fread (buf, buflen, 1, fp) != 1) +    { +      err = gpg_error_from_syserror (); +      log_error ("error reading '%s': %s\n", fname, gpg_strerror (err)); +      es_fclose (fp); +      xfree (buf); +      return NULL; +    } +  buf[buflen] = 0; +  es_fclose (fp); + +  return buf; +} + +  /* Return a malloced line or NULL on EOF.  Terminate on read   * error.  */  static char * @@ -935,11 +977,26 @@ process_meta_commands (const char *request)      result = process_request ("{ \"op\": \"help\","                                " \"interactive_help\": "                                "\"\\nMeta commands:\\n" +                              "  ,read FNAME Process data from FILE\\n"                                "  ,help       This help\\n"                                "  ,quit       Terminate process\""                                "}");    else if (!strncmp (request, "quit", 4) && (spacep (request+4) || !request[4]))      exit (0); +  else if (!strncmp (request, "read", 4) && (spacep (request+4) || !request[4])) +    { +      if (!request[4]) +        log_info ("usage: ,read FILENAME\n"); +      else +        { +          char *buffer = get_file (request + 5); +          if (buffer) +            { +              result = process_request (buffer); +              xfree (buffer); +            } +        } +    }    else      log_info ("invalid meta command\n"); | 
