diff options
author | Richard Levitte <levitte@openssl.org> | 2004-08-11 21:13:57 +0000 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2004-08-11 21:13:57 +0000 |
commit | bb1a915c24121e5278d7feeab7c96d06197999b9 (patch) | |
tree | 7cf4e031acbd5d86885b1ca2b085fd81e386aca0 /crypto/bio | |
parent | b94f886b22db1da9154bbe236957379fc783c176 (diff) |
Basically, I wanted to be able to make a dump to a FILE*, and not have
to bother creating a BIO around it. So here's a few more functions to
make it possible to make the dump using a printing callback, and to
print to a FILE* (based on the callback variant), done in the same
style as the functions in crypto/err/err_prn.c.
Diffstat (limited to 'crypto/bio')
-rw-r--r-- | crypto/bio/b_dump.c | 65 | ||||
-rw-r--r-- | crypto/bio/bio.h | 9 |
2 files changed, 56 insertions, 18 deletions
diff --git a/crypto/bio/b_dump.c b/crypto/bio/b_dump.c index 76fee2db4f..a07b79437f 100644 --- a/crypto/bio/b_dump.c +++ b/crypto/bio/b_dump.c @@ -68,23 +68,25 @@ #define DUMP_WIDTH 16 #define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH-((i-(i>6?6:i)+3)/4)) -int BIO_dump(BIO *bio, const char *s, int len) +int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), + void *u, const char *s, int len) { - return BIO_dump_indent(bio, s, len, 0); + return BIO_dump_indent_cb(cb, u, s, len, 0); } -int BIO_dump_indent(BIO *bio, const char *s, int len, int indent) +int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), + void *u, const char *s, int len, int indent) { int ret=0; char buf[288+1],tmp[20],str[128+1]; int i,j,rows,trc; unsigned char ch; int dump_width; - + trc=0; - + #ifdef TRUNCATE - for(; (len > 0) && ((s[len-1] == ' ') || (s[len-1] == '\0')); len--) + for(; (len > 0) && ((s[len-1] == ' ') || (s[len-1] == '\0')); len--) trc++; #endif @@ -96,7 +98,7 @@ int BIO_dump_indent(BIO *bio, const char *s, int len, int indent) memset(str,' ',indent); } str[indent]='\0'; - + dump_width=DUMP_WIDTH_LESS_INDENT(indent); rows=(len/dump_width); if ((rows*dump_width)<len) @@ -117,7 +119,7 @@ int BIO_dump_indent(BIO *bio, const char *s, int len, int indent) { ch=((unsigned char)*(s+i*dump_width+j)) & 0xff; BIO_snprintf(tmp,sizeof tmp,"%02x%c",ch, - j==7?'-':' '); + j==7?'-':' '); BUF_strlcat(buf,tmp,sizeof buf); } } @@ -129,28 +131,57 @@ int BIO_dump_indent(BIO *bio, const char *s, int len, int indent) ch=((unsigned char)*(s+i*dump_width+j)) & 0xff; #ifndef CHARSET_EBCDIC BIO_snprintf(tmp,sizeof tmp,"%c", - ((ch>=' ')&&(ch<='~'))?ch:'.'); + ((ch>=' ')&&(ch<='~'))?ch:'.'); #else BIO_snprintf(tmp,sizeof tmp,"%c", - ((ch>=os_toascii[' '])&&(ch<=os_toascii['~'])) - ? os_toebcdic[ch] - : '.'); + ((ch>=os_toascii[' '])&&(ch<=os_toascii['~'])) + ? os_toebcdic[ch] + : '.'); #endif BUF_strlcat(buf,tmp,sizeof buf); } BUF_strlcat(buf,"\n",sizeof buf); - /* if this is the last call then update the ddt_dump thing so that - * we will move the selection point in the debug window + /* if this is the last call then update the ddt_dump thing so + * that we will move the selection point in the debug window */ - ret+=BIO_write(bio,(char *)buf,strlen(buf)); + ret+=cb((void *)buf,strlen(buf),u); } #ifdef TRUNCATE if (trc > 0) { BIO_snprintf(buf,sizeof buf,"%s%04x - <SPACES/NULS>\n",str, - len+trc); - ret+=BIO_write(bio,(char *)buf,strlen(buf)); + len+trc); + ret+=cb((void *)buf,strlen(buf),u); } #endif return(ret); } + +#ifndef OPENSSL_NO_FP_API +static int write_fp(const void *data, size_t len, void *fp) + { + return fwrite(data, len, 1, (FILE *)fp); + } +int BIO_dump_fp(FILE *fp, const char *s, int len) + { + return BIO_dump_cb(write_fp, fp, s, len); + } +int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent) + { + return BIO_dump_indent_cb(write_fp, fp, s, len, indent); + } +#endif + +static int write_bio(const void *data, size_t len, void *bp) + { + return BIO_write((BIO *)bp, (const char *)data, len); + } +int BIO_dump(BIO *bp, const char *s, int len) + { + return BIO_dump_cb(write_bio, bp, s, len); + } +int BIO_dump_indent(BIO *bp, const char *s, int len, int indent) + { + return BIO_dump_indent_cb(write_bio, bp, s, len, indent); + } + diff --git a/crypto/bio/bio.h b/crypto/bio/bio.h index e8bb8aa4de..7068b18ffa 100644 --- a/crypto/bio/bio.h +++ b/crypto/bio/bio.h @@ -573,9 +573,16 @@ int BIO_sock_should_retry(int i); int BIO_sock_non_fatal_error(int error); int BIO_fd_should_retry(int i); int BIO_fd_non_fatal_error(int error); +int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u), + void *u, const char *s, int len); +int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u), + void *u, const char *s, int len, int indent); int BIO_dump(BIO *b,const char *bytes,int len); int BIO_dump_indent(BIO *b,const char *bytes,int len,int indent); - +#ifndef OPENSSL_NO_FP_API +int BIO_dump_fp(FILE *fp, const char *s, int len); +int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent); +#endif struct hostent *BIO_gethostbyname(const char *name); /* We might want a thread-safe interface too: * struct hostent *BIO_gethostbyname_r(const char *name, |