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:
Richard Levitte 2004-08-11 21:13:57 +00:00
parent b94f886b22
commit bb1a915c24
2 changed files with 56 additions and 18 deletions

View File

@ -68,12 +68,14 @@
#define DUMP_WIDTH 16 #define DUMP_WIDTH 16
#define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH-((i-(i>6?6:i)+3)/4)) #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; int ret=0;
char buf[288+1],tmp[20],str[128+1]; char buf[288+1],tmp[20],str[128+1];
@ -139,18 +141,47 @@ int BIO_dump_indent(BIO *bio, const char *s, int len, int indent)
BUF_strlcat(buf,tmp,sizeof buf); BUF_strlcat(buf,tmp,sizeof buf);
} }
BUF_strlcat(buf,"\n",sizeof buf); BUF_strlcat(buf,"\n",sizeof buf);
/* if this is the last call then update the ddt_dump thing so that /* if this is the last call then update the ddt_dump thing so
* we will move the selection point in the debug window * 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 #ifdef TRUNCATE
if (trc > 0) if (trc > 0)
{ {
BIO_snprintf(buf,sizeof buf,"%s%04x - <SPACES/NULS>\n",str, BIO_snprintf(buf,sizeof buf,"%s%04x - <SPACES/NULS>\n",str,
len+trc); len+trc);
ret+=BIO_write(bio,(char *)buf,strlen(buf)); ret+=cb((void *)buf,strlen(buf),u);
} }
#endif #endif
return(ret); 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);
}

View File

@ -573,9 +573,16 @@ int BIO_sock_should_retry(int i);
int BIO_sock_non_fatal_error(int error); int BIO_sock_non_fatal_error(int error);
int BIO_fd_should_retry(int i); int BIO_fd_should_retry(int i);
int BIO_fd_non_fatal_error(int error); 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(BIO *b,const char *bytes,int len);
int BIO_dump_indent(BIO *b,const char *bytes,int len,int indent); 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); struct hostent *BIO_gethostbyname(const char *name);
/* We might want a thread-safe interface too: /* We might want a thread-safe interface too:
* struct hostent *BIO_gethostbyname_r(const char *name, * struct hostent *BIO_gethostbyname_r(const char *name,