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.
This commit is contained in:
parent
b94f886b22
commit
bb1a915c24
@ -68,12 +68,14 @@
|
||||
#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];
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user