[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