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 <wk@gnupg.org>
This commit is contained in:
Werner Koch 2018-04-18 09:26:33 +02:00
parent 01435da498
commit e69b175e8e
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B

View File

@ -33,6 +33,7 @@
#include <locale.h> #include <locale.h>
#endif #endif
#include <stdint.h> #include <stdint.h>
#include <sys/stat.h>
#define GPGRT_ENABLE_ES_MACROS 1 #define GPGRT_ENABLE_ES_MACROS 1
#define GPGRT_ENABLE_LOG_MACROS 1 #define GPGRT_ENABLE_LOG_MACROS 1
@ -842,7 +843,6 @@ process_request (const char *request)
xjson_AddStringToObject (response, "op", op); xjson_AddStringToObject (response, "op", op);
} }
} }
} }
else /* Operation not supported. */ else /* Operation not supported. */
@ -869,6 +869,48 @@ process_request (const char *request)
* Driver code * 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 /* Return a malloced line or NULL on EOF. Terminate on read
* error. */ * error. */
static char * static char *
@ -935,11 +977,26 @@ process_meta_commands (const char *request)
result = process_request ("{ \"op\": \"help\"," result = process_request ("{ \"op\": \"help\","
" \"interactive_help\": " " \"interactive_help\": "
"\"\\nMeta commands:\\n" "\"\\nMeta commands:\\n"
" ,read FNAME Process data from FILE\\n"
" ,help This help\\n" " ,help This help\\n"
" ,quit Terminate process\"" " ,quit Terminate process\""
"}"); "}");
else if (!strncmp (request, "quit", 4) && (spacep (request+4) || !request[4])) else if (!strncmp (request, "quit", 4) && (spacep (request+4) || !request[4]))
exit (0); 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 else
log_info ("invalid meta command\n"); log_info ("invalid meta command\n");