summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2018-04-18 09:26:33 +0200
committerWerner Koch <wk@gnupg.org>2018-04-18 09:26:33 +0200
commite69b175e8ed5430b56e2e8f3d68c16a45f0fed17 (patch)
tree5a2070321970acd95ed6b0f5901467f99d0f6ae6
parent01435da498af9f7538d7ee810392d7eaa407957e (diff)
downloadgpgme-e69b175e8ed5430b56e2e8f3d68c16a45f0fed17.tar.gz
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>
-rw-r--r--src/gpgme-json.c59
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");