Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
btwise
openssl
提交
c1082a90
O
openssl
项目概览
btwise
/
openssl
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
openssl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c1082a90
编写于
9月 07, 1999
作者:
B
Bodo Möller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Non-copying interface to BIO pairs.
It's still totally untested ...
上级
b7d7440c
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
239 addition
and
2 deletion
+239
-2
CHANGES
CHANGES
+4
-0
crypto/bio/bio.h
crypto/bio/bio.h
+0
-2
crypto/bio/bss_bio.c
crypto/bio/bss_bio.c
+232
-0
ssl/ssltest.c
ssl/ssltest.c
+3
-0
未找到文件。
CHANGES
浏览文件 @
c1082a90
...
...
@@ -4,6 +4,10 @@
Changes between 0.9.4 and 0.9.5 [xx XXX 1999]
*) Non-copying interface to BIO pairs.
(still totally untested)
[Bodo Moeller]
*) New function ANS1_tag2str() to convert an ASN1 tag to a descriptive
ASCII string. This was handled independently in various places before.
[Steve Henson]
...
...
crypto/bio/bio.h
浏览文件 @
c1082a90
...
...
@@ -517,12 +517,10 @@ BIO * BIO_get_retry_BIO(BIO *bio, int *reason);
int
BIO_get_retry_reason
(
BIO
*
bio
);
BIO
*
BIO_dup_chain
(
BIO
*
in
);
#if 0 /* not yet */
int
BIO_nread0
(
BIO
*
bio
,
char
**
buf
);
int
BIO_nread
(
BIO
*
bio
,
char
**
buf
,
int
num
);
int
BIO_nwrite0
(
BIO
*
bio
,
char
**
buf
);
int
BIO_nwrite
(
BIO
*
bio
,
char
**
buf
,
int
num
);
#endif
#ifndef WIN16
long
BIO_debug_callback
(
BIO
*
bio
,
int
cmd
,
const
char
*
argp
,
int
argi
,
...
...
crypto/bio/bss_bio.c
浏览文件 @
c1082a90
...
...
@@ -13,6 +13,7 @@
#endif
#include <assert.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
...
...
@@ -195,6 +196,82 @@ static int bio_read(BIO *bio, char *buf, int size_)
return
size
;
}
/* non-copying interface: provide pointer to available data in buffer
* bio_nread0: return number of available bytes
* bio_nread: also advance index
* (example usage: bio_nread0(), read from buffer, bio_nread()
* or just bio_nread(), read from buffer)
*/
/* WARNING: The non-copying interface is totally untested as of yet --
* I wrote it, but have not yet read it; and surely it still is full
* of bugs. */
static
size_t
bio_nread0
(
BIO
*
bio
,
char
**
buf
)
{
struct
bio_bio_st
*
b
,
*
peer_b
;
size_t
num
;
BIO_clear_retry_flags
(
bio
);
if
(
!
bio
->
init
)
return
0
;
b
=
bio
->
ptr
;
assert
(
b
!=
NULL
);
assert
(
b
->
peer
!=
NULL
);
peer_b
=
b
->
peer
->
ptr
;
assert
(
peer_b
!=
NULL
);
assert
(
peer_b
->
buf
!=
NULL
);
peer_b
->
request
=
0
;
if
(
peer_b
->
len
==
0
)
{
char
dummy
;
/* avoid code duplication -- nothing available for reading */
return
bio_read
(
bio
,
&
dummy
,
num
);
/* returns 0 or -1 */
}
num
=
peer_b
->
len
;
if
(
peer_b
->
size
<
peer_b
->
offset
+
num
)
/* no ring buffer wrap-around for non-copying interface */
num
=
peer_b
->
size
-
peer_b
->
offset
;
assert
(
num
>
0
);
if
(
buf
!=
NULL
)
*
buf
=
peer_b
->
buf
+
peer_b
->
offset
;
return
num
;
}
static
size_t
bio_nread
(
BIO
*
bio
,
char
**
buf
,
size_t
num
)
{
struct
bio_bio_st
*
b
,
*
peer_b
;
size_t
available
;
available
=
bio_nread0
(
bio
,
buf
);
if
(
num
>
available
)
num
=
available
;
if
(
num
<=
0
)
return
num
;
b
=
bio
->
ptr
;
peer_b
=
b
->
peer
->
ptr
;
peer_b
->
len
-=
num
;
if
(
peer_b
->
len
)
{
peer_b
->
offset
+=
num
;
assert
(
peer_b
->
offset
<=
peer_b
->
size
);
if
(
peer_b
->
offset
==
peer_b
->
size
)
peer_b
->
offset
=
0
;
}
else
peer_b
->
offset
=
0
;
return
num
;
}
static
int
bio_write
(
BIO
*
bio
,
char
*
buf
,
int
num_
)
{
size_t
num
=
num_
;
...
...
@@ -268,6 +345,76 @@ static int bio_write(BIO *bio, char *buf, int num_)
return
num
;
}
/* non-copying interface: provide pointer to region to write to
* bio_nwrite0: check how much space is available
* bio_nwrite: also increase length
* (example usage: bio_nwrite0(), write to buffer, bio_nwrite()
* or just bio_nwrite(), write to buffer)
*/
static
size_t
bio_nwrite0
(
BIO
*
bio
,
char
**
buf
)
{
struct
bio_bio_st
*
b
;
size_t
num
;
size_t
write_offset
;
BIO_clear_retry_flags
(
bio
);
if
(
!
bio
->
init
)
return
0
;
b
=
bio
->
ptr
;
assert
(
b
!=
NULL
);
assert
(
b
->
peer
!=
NULL
);
assert
(
b
->
buf
!=
NULL
);
b
->
request
=
0
;
if
(
b
->
closed
)
{
BIOerr
(
BIO_F_BIO_NWRITE0
,
BIO_R_BROKEN_PIPE
);
return
-
1
;
}
assert
(
b
->
len
<=
b
->
size
);
if
(
b
->
len
==
b
->
size
)
{
BIO_set_retry_write
(
bio
);
return
-
1
;
}
num
=
b
->
size
-
b
->
len
;
write_offset
=
b
->
offset
+
b
->
len
;
if
(
write_offset
>=
b
->
size
)
write_offset
-=
b
->
size
;
if
(
write_offset
+
num
>
b
->
size
)
/* no ring buffer wrap-around for non-copying interface
* (to fulfil the promise by BIO_ctrl_get_write_guarantee,
* BIO_nwrite may have to be called twice) */
num
=
b
->
size
-
write_offset
;
if
(
buf
!=
NULL
)
*
buf
=
b
->
buf
+
write_offset
;
assert
(
write_offset
+
num
<=
b
->
size
);
return
num
;
}
static
size_t
bio_nwrite
(
BIO
*
bio
,
char
**
buf
,
size_t
num
)
{
struct
bio_bio_st
*
b
;
size_t
space
;
space
=
bio_nwrite0
(
bio
,
buf
);
if
(
num
>
space
)
num
=
space
;
if
(
num
<=
0
)
return
num
;
b
->
len
+=
num
;
assert
(
b
->
len
<=
b
->
size
);
return
num
;
}
static
long
bio_ctrl
(
BIO
*
bio
,
int
cmd
,
long
num
,
void
*
ptr
)
{
...
...
@@ -351,6 +498,21 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
ret
=
1
;
break
;
case
BIO_C_NREAD
:
/* non-copying read */
ret
=
(
long
)
bio_nread
(
bio
,
ptr
,
(
size_t
)
num
);
break
;
case
BIO_C_NWRITE0
:
/* prepare for non-copying write */
ret
=
(
long
)
bio_nwrite0
(
bio
,
ptr
);
break
;
case
BIO_C_NWRITE
:
/* non-copying write */
ret
=
(
long
)
bio_nwrite
(
bio
,
ptr
,
(
size_t
)
num
);
break
;
/* standard CTRL codes follow */
...
...
@@ -586,3 +748,73 @@ size_t BIO_ctrl_get_read_request(BIO *bio)
{
return
BIO_ctrl
(
bio
,
BIO_C_GET_READ_REQUEST
,
0
,
NULL
);
}
/* BIO_nread0/nread/nwrite0/nwrite are availabe only for BIO pairs for now
* (conceivably some other BIOs could allow non-copying reads and writes too.)
*/
int
BIO_nread0
(
BIO
*
bio
,
char
**
buf
)
{
long
ret
;
if
(
!
bio
->
init
)
{
BIOerr
(
BIO_F_BIO_NREAD0
,
BIO_R_UNINITIALIZED
);
return
-
2
;
}
ret
=
BIO_ctrl
(
bio
,
BIO_C_NREAD0
,
0
,
buf
);
if
(
ret
>
INT_MAX
)
return
INT_MAX
;
else
return
(
int
)
ret
;
}
int
BIO_nread
(
BIO
*
bio
,
char
**
buf
,
int
num
)
{
int
ret
;
if
(
!
bio
->
init
)
{
BIOerr
(
BIO_F_BIO_NREAD
,
BIO_R_UNINITIALIZED
);
return
-
2
;
}
ret
=
(
int
)
BIO_ctrl
(
bio
,
BIO_C_NREAD
,
num
,
buf
);
if
(
ret
>
0
)
bio
->
num_read
+=
ret
;
return
ret
;
}
int
BIO_nwrite0
(
BIO
*
bio
,
char
**
buf
)
{
long
ret
;
if
(
!
bio
->
init
)
{
BIOerr
(
BIO_F_BIO_NWRITE0
,
BIO_R_UNINITIALIZED
);
return
-
2
;
}
ret
=
BIO_ctrl
(
bio
,
BIO_C_NWRITE0
,
0
,
buf
);
if
(
ret
>
INT_MAX
)
return
INT_MAX
;
else
return
(
int
)
ret
;
}
int
BIO_nwrite
(
BIO
*
bio
,
char
**
buf
,
int
num
)
{
int
ret
;
if
(
!
bio
->
init
)
{
BIOerr
(
BIO_F_BIO_NWRITE
,
BIO_R_UNINITIALIZED
);
return
-
2
;
}
ret
=
BIO_ctrl
(
bio
,
BIO_C_NWRITE
,
num
,
buf
);
if
(
ret
>
0
)
bio
->
num_read
+=
ret
;
return
ret
;
}
ssl/ssltest.c
浏览文件 @
c1082a90
...
...
@@ -653,6 +653,9 @@ int doit_biopair(SSL *s_ssl, SSL *c_ssl, long count)
{
/* "I/O" BETWEEN CLIENT AND SERVER. */
/* TODO: use non-blocking BIO interface for (say) the client
* to illustrate its use and to test it. */
#define RELAYBUFSIZ 200
static
char
buf
[
RELAYBUFSIZ
];
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录