summaryrefslogtreecommitdiffstats
path: root/crypto/bio
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2004-08-11 21:13:57 +0000
committerRichard Levitte <levitte@openssl.org>2004-08-11 21:13:57 +0000
commitbb1a915c24121e5278d7feeab7c96d06197999b9 (patch)
tree7cf4e031acbd5d86885b1ca2b085fd81e386aca0 /crypto/bio
parentb94f886b22db1da9154bbe236957379fc783c176 (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.c65
-rw-r--r--crypto/bio/bio.h9
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,