Changeset 332

Show
Ignore:
Timestamp:
01/10/06 18:28:47
Author:
ben
Message:

Add memory reader. Closes #31.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • openpgpsdk/trunk/Makefile

    r329 r332  
    3535tags: 
    3636        rm -f TAGS 
    37         find . -name *.[ch] | xargs etags 
     37        find . -name '*.[ch]' | xargs etags 
    3838 
    3939test:: 
  • openpgpsdk/trunk/examples/packet-dump.c

    r331 r332  
    871871    fprintf(stderr,"%s [-a] [-b] <file name>\n\n",pname); 
    872872    fprintf(stderr,"-a\tRead armoured data\n" 
    873             "-b\tDon't buffer stdout/stderr\n"); 
     873            "-b\tDon't buffer stdout/stderr\n" 
     874            "-B\tRead via a memory buffer\n"); 
    874875    exit(1); 
    875876    } 
     
    882883    int ch; 
    883884    int fd; 
     885    ops_boolean_t buffer_read=ops_false; 
     886    unsigned char buffer[10240]; 
    884887 
    885888    pname=argv[0]; 
    886889 
    887     while((ch=getopt(argc,argv,"ab")) != -1) 
     890    while((ch=getopt(argc,argv,"abB")) != -1) 
    888891        switch(ch) 
    889892            { 
     
    895898            setvbuf(stdout,NULL,_IONBF,0); 
    896899            setvbuf(stderr,NULL,_IONBF,0); 
     900            break; 
     901 
     902        case 'B': 
     903            buffer_read=ops_true; 
    897904            break; 
    898905 
     
    919926    ops_parse_cb_set(pinfo,callback,NULL); 
    920927 
    921     ops_reader_set_fd(pinfo,fd); 
     928    if(buffer_read) 
     929        { 
     930        int n; 
     931 
     932        n=read(fd,buffer,sizeof buffer); 
     933        if(n < 0) 
     934            { 
     935            perror(argv[0]); 
     936            exit(3); 
     937            } 
     938        ops_reader_set_memory(pinfo,buffer,n); 
     939        } 
     940    else 
     941        ops_reader_set_fd(pinfo,fd); 
    922942 
    923943    if(armour) 
  • openpgpsdk/trunk/include/openpgpsdk/errors.h

    r320 r332  
    5555 
    5656#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) 
     57#define OPS_ERROR(err,code,fmt) do { ops_push_error(err,code,0,__FILE__,__LINE__,fmt); } while(0) 
    5758#define OPS_ERROR_1(err,code,fmt,arg)   do { ops_push_error(err,code,0,__FILE__,__LINE__,fmt,arg); } while(0) 
    5859 
  • openpgpsdk/trunk/include/openpgpsdk/util.h

    r320 r332  
    1515void hexdump(const unsigned char *src,size_t length); 
    1616void ops_reader_set_fd(ops_parse_info_t *pinfo,int fd); 
     17void ops_reader_set_memory(ops_parse_info_t *pinfo,const void *buffer, 
     18                           size_t length); 
    1719 
    1820/* typesafe deconstification */ 
  • openpgpsdk/trunk/src/util.c

    r320 r332  
    160160    } 
    161161 
     162typedef struct 
     163    { 
     164    const unsigned char *buffer; 
     165    size_t length; 
     166    size_t offset; 
     167    } reader_mem_arg_t; 
     168 
     169static ops_reader_ret_t reader_mem(unsigned char *dest,unsigned *plength, 
     170                                   ops_reader_flags_t flags, 
     171                                   ops_error_t **errors, 
     172                                   ops_reader_info_t *rinfo, 
     173                                   ops_parse_cb_info_t *cbinfo) 
     174    { 
     175    reader_mem_arg_t *arg=ops_reader_get_arg(rinfo); 
     176    unsigned n; 
     177 
     178    OPS_USED(cbinfo); 
     179 
     180    if(arg->offset+*plength > arg->length) 
     181        n=arg->length-arg->offset; 
     182    else 
     183        n=*plength; 
     184 
     185    if(n == 0) 
     186        return OPS_R_EOF; 
     187 
     188    memcpy(dest,arg->buffer+arg->offset,n); 
     189    arg->offset+=n; 
     190 
     191    if(n != *plength) 
     192        { 
     193        if(flags&OPS_RETURN_LENGTH) 
     194            { 
     195            *plength=n; 
     196            return OPS_R_PARTIAL_READ; 
     197            } 
     198        else 
     199            { 
     200            OPS_ERROR(errors,OPS_E_R_EARLY_EOF,"memory block"); 
     201            return OPS_R_EARLY_EOF; 
     202            } 
     203        } 
     204 
     205    return OPS_R_OK; 
     206    } 
     207 
     208// Note that its the caller's responsibility to ensure buffer continues to 
     209// exist 
     210void ops_reader_set_memory(ops_parse_info_t *pinfo,const void *buffer, 
     211                           size_t length) 
     212    { 
     213    reader_mem_arg_t *arg=malloc(sizeof *arg); 
     214 
     215    arg->buffer=buffer; 
     216    arg->length=length; 
     217    ops_reader_set(pinfo,reader_mem,arg); 
     218    } 
     219 
    162220void *ops_mallocz(size_t n) 
    163221    { 
     
    168226    return m; 
    169227    } 
     228