[OpenPGP:SDK svn] r332 - in openpgpsdk/trunk: . examples include/openpgpsdk src
Subversion
ben at algroup.co.uk
Tue Jan 10 18:28:47 GMT 2006
Author: ben
Date: 2006-01-10 18:28:47 +0000 (Tue, 10 Jan 2006)
New Revision: 332
Modified:
openpgpsdk/trunk/Makefile
openpgpsdk/trunk/examples/packet-dump.c
openpgpsdk/trunk/include/openpgpsdk/errors.h
openpgpsdk/trunk/include/openpgpsdk/util.h
openpgpsdk/trunk/src/util.c
Log:
Add memory reader. Closes #31.
Modified: openpgpsdk/trunk/Makefile
===================================================================
--- openpgpsdk/trunk/Makefile 2006-01-10 17:24:13 UTC (rev 331)
+++ openpgpsdk/trunk/Makefile 2006-01-10 18:28:47 UTC (rev 332)
@@ -34,7 +34,7 @@
tags:
rm -f TAGS
- find . -name *.[ch] | xargs etags
+ find . -name '*.[ch]' | xargs etags
test::
cd examples && make test
Modified: openpgpsdk/trunk/examples/packet-dump.c
===================================================================
--- openpgpsdk/trunk/examples/packet-dump.c 2006-01-10 17:24:13 UTC (rev 331)
+++ openpgpsdk/trunk/examples/packet-dump.c 2006-01-10 18:28:47 UTC (rev 332)
@@ -870,7 +870,8 @@
{
fprintf(stderr,"%s [-a] [-b] <file name>\n\n",pname);
fprintf(stderr,"-a\tRead armoured data\n"
- "-b\tDon't buffer stdout/stderr\n");
+ "-b\tDon't buffer stdout/stderr\n"
+ "-B\tRead via a memory buffer\n");
exit(1);
}
@@ -881,10 +882,12 @@
int ret;
int ch;
int fd;
+ ops_boolean_t buffer_read=ops_false;
+ unsigned char buffer[10240];
pname=argv[0];
- while((ch=getopt(argc,argv,"ab")) != -1)
+ while((ch=getopt(argc,argv,"abB")) != -1)
switch(ch)
{
case 'a':
@@ -896,6 +899,10 @@
setvbuf(stderr,NULL,_IONBF,0);
break;
+ case 'B':
+ buffer_read=ops_true;
+ break;
+
default:
usage();
}
@@ -918,8 +925,21 @@
ops_parse_cb_set(pinfo,callback,NULL);
- ops_reader_set_fd(pinfo,fd);
+ if(buffer_read)
+ {
+ int n;
+ n=read(fd,buffer,sizeof buffer);
+ if(n < 0)
+ {
+ perror(argv[0]);
+ exit(3);
+ }
+ ops_reader_set_memory(pinfo,buffer,n);
+ }
+ else
+ ops_reader_set_fd(pinfo,fd);
+
if(armour)
ops_reader_push_dearmour(pinfo,ops_true,ops_true,ops_true);
Modified: openpgpsdk/trunk/include/openpgpsdk/errors.h
===================================================================
--- openpgpsdk/trunk/include/openpgpsdk/errors.h 2006-01-10 17:24:13 UTC (rev 331)
+++ openpgpsdk/trunk/include/openpgpsdk/errors.h 2006-01-10 18:28:47 UTC (rev 332)
@@ -54,6 +54,7 @@
void ops_print_errors(ops_error_t *errstack);
#define OPS_SYSTEM_ERROR_1(err,code,syscall,fmt,arg) do { ops_push_error(err,OPS_E_SYSTEM_ERROR,errno,__FILE__,__LINE__,syscall); ops_push_error(err,code,0,__FILE__,__LINE__,fmt,arg); } while(0)
+#define OPS_ERROR(err,code,fmt) do { ops_push_error(err,code,0,__FILE__,__LINE__,fmt); } while(0)
#define OPS_ERROR_1(err,code,fmt,arg) do { ops_push_error(err,code,0,__FILE__,__LINE__,fmt,arg); } while(0)
#endif /* OPS_ERRORS */
Modified: openpgpsdk/trunk/include/openpgpsdk/util.h
===================================================================
--- openpgpsdk/trunk/include/openpgpsdk/util.h 2006-01-10 17:24:13 UTC (rev 331)
+++ openpgpsdk/trunk/include/openpgpsdk/util.h 2006-01-10 18:28:47 UTC (rev 332)
@@ -14,6 +14,8 @@
void hexdump(const unsigned char *src,size_t length);
void ops_reader_set_fd(ops_parse_info_t *pinfo,int fd);
+void ops_reader_set_memory(ops_parse_info_t *pinfo,const void *buffer,
+ size_t length);
/* typesafe deconstification */
static inline void *_deconst(const void *p)
Modified: openpgpsdk/trunk/src/util.c
===================================================================
--- openpgpsdk/trunk/src/util.c 2006-01-10 17:24:13 UTC (rev 331)
+++ openpgpsdk/trunk/src/util.c 2006-01-10 18:28:47 UTC (rev 332)
@@ -159,6 +159,64 @@
ops_reader_set(pinfo,reader_fd,arg);
}
+typedef struct
+ {
+ const unsigned char *buffer;
+ size_t length;
+ size_t offset;
+ } reader_mem_arg_t;
+
+static ops_reader_ret_t reader_mem(unsigned char *dest,unsigned *plength,
+ ops_reader_flags_t flags,
+ ops_error_t **errors,
+ ops_reader_info_t *rinfo,
+ ops_parse_cb_info_t *cbinfo)
+ {
+ reader_mem_arg_t *arg=ops_reader_get_arg(rinfo);
+ unsigned n;
+
+ OPS_USED(cbinfo);
+
+ if(arg->offset+*plength > arg->length)
+ n=arg->length-arg->offset;
+ else
+ n=*plength;
+
+ if(n == 0)
+ return OPS_R_EOF;
+
+ memcpy(dest,arg->buffer+arg->offset,n);
+ arg->offset+=n;
+
+ if(n != *plength)
+ {
+ if(flags&OPS_RETURN_LENGTH)
+ {
+ *plength=n;
+ return OPS_R_PARTIAL_READ;
+ }
+ else
+ {
+ OPS_ERROR(errors,OPS_E_R_EARLY_EOF,"memory block");
+ return OPS_R_EARLY_EOF;
+ }
+ }
+
+ return OPS_R_OK;
+ }
+
+// Note that its the caller's responsibility to ensure buffer continues to
+// exist
+void ops_reader_set_memory(ops_parse_info_t *pinfo,const void *buffer,
+ size_t length)
+ {
+ reader_mem_arg_t *arg=malloc(sizeof *arg);
+
+ arg->buffer=buffer;
+ arg->length=length;
+ ops_reader_set(pinfo,reader_mem,arg);
+ }
+
void *ops_mallocz(size_t n)
{
void *m=malloc(n);
@@ -167,3 +225,4 @@
return m;
}
+
More information about the OpenPGPsdk-svn
mailing list