提交 bb1a915c 编写于 作者: R Richard Levitte

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.
上级 b94f886b
...@@ -68,23 +68,25 @@ ...@@ -68,23 +68,25 @@
#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];
int i,j,rows,trc; int i,j,rows,trc;
unsigned char ch; unsigned char ch;
int dump_width; int dump_width;
trc=0; trc=0;
#ifdef TRUNCATE #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++; trc++;
#endif #endif
...@@ -96,7 +98,7 @@ int BIO_dump_indent(BIO *bio, const char *s, int len, int indent) ...@@ -96,7 +98,7 @@ int BIO_dump_indent(BIO *bio, const char *s, int len, int indent)
memset(str,' ',indent); memset(str,' ',indent);
} }
str[indent]='\0'; str[indent]='\0';
dump_width=DUMP_WIDTH_LESS_INDENT(indent); dump_width=DUMP_WIDTH_LESS_INDENT(indent);
rows=(len/dump_width); rows=(len/dump_width);
if ((rows*dump_width)<len) if ((rows*dump_width)<len)
...@@ -117,7 +119,7 @@ int BIO_dump_indent(BIO *bio, const char *s, int len, int indent) ...@@ -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; ch=((unsigned char)*(s+i*dump_width+j)) & 0xff;
BIO_snprintf(tmp,sizeof tmp,"%02x%c",ch, BIO_snprintf(tmp,sizeof tmp,"%02x%c",ch,
j==7?'-':' '); j==7?'-':' ');
BUF_strlcat(buf,tmp,sizeof buf); BUF_strlcat(buf,tmp,sizeof buf);
} }
} }
...@@ -129,28 +131,57 @@ int BIO_dump_indent(BIO *bio, const char *s, int len, int indent) ...@@ -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; ch=((unsigned char)*(s+i*dump_width+j)) & 0xff;
#ifndef CHARSET_EBCDIC #ifndef CHARSET_EBCDIC
BIO_snprintf(tmp,sizeof tmp,"%c", BIO_snprintf(tmp,sizeof tmp,"%c",
((ch>=' ')&&(ch<='~'))?ch:'.'); ((ch>=' ')&&(ch<='~'))?ch:'.');
#else #else
BIO_snprintf(tmp,sizeof tmp,"%c", BIO_snprintf(tmp,sizeof tmp,"%c",
((ch>=os_toascii[' '])&&(ch<=os_toascii['~'])) ((ch>=os_toascii[' '])&&(ch<=os_toascii['~']))
? os_toebcdic[ch] ? os_toebcdic[ch]
: '.'); : '.');
#endif #endif
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);
}
...@@ -573,9 +573,16 @@ int BIO_sock_should_retry(int i); ...@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册