Commit bb1a915c authored by Richard Levitte's avatar Richard Levitte
Browse files

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.
parent b94f886b
Loading
Loading
Loading
Loading
+48 −17
Original line number Diff line number Diff line
@@ -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];
@@ -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,"\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));
		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);
	}
+8 −1
Original line number Diff line number Diff line
@@ -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,