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:
parent
01435da498
commit
e69b175e8e
@ -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");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user