Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ISC Open Source Projects
BIND
Commits
4556681e
Commit
4556681e
authored
Sep 02, 1999
by
Michael Graff
Browse files
snapshot socket.[ch] code and commit dynbuf_t -> buffer_t changes
parent
45a16841
Changes
9
Hide whitespace changes
Inline
Side-by-side
bin/named/include/named/query.h
View file @
4556681e
...
...
@@ -36,7 +36,7 @@ struct ns_query {
dns_name_t
*
qname
;
dns_name_t
*
origqname
;
unsigned
int
dboptions
;
ISC_LIST
(
isc_
dyn
buffer_t
)
namebufs
;
isc_buffer
list
_t
namebufs
;
ISC_LIST
(
dns_name_t
)
tmpnames
;
ISC_LIST
(
dns_rdataset_t
)
tmprdatasets
;
ISC_LIST
(
ns_dbversion_t
)
activeversions
;
...
...
bin/named/query.c
View file @
4556681e
...
...
@@ -50,7 +50,7 @@
static
inline
void
query_reset
(
ns_client_t
*
client
,
isc_boolean_t
everything
)
{
isc_
dyn
buffer_t
*
dbuf
,
*
dbuf_next
;
isc_buffer_t
*
dbuf
,
*
dbuf_next
;
ns_dbversion_t
*
dbversion
,
*
dbversion_next
;
unsigned
int
i
;
...
...
@@ -97,7 +97,7 @@ query_reset(ns_client_t *client, isc_boolean_t everything) {
dbuf_next
=
ISC_LIST_NEXT
(
dbuf
,
link
);
if
(
dbuf_next
!=
NULL
||
everything
)
{
ISC_LIST_UNLINK
(
client
->
query
.
namebufs
,
dbuf
,
link
);
isc_
dyn
buffer_free
(
client
->
mctx
,
&
dbuf
);
isc_buffer_free
(
&
dbuf
);
}
}
/*
...
...
@@ -126,7 +126,7 @@ ns_query_free(ns_client_t *client) {
static
inline
isc_result_t
query_newnamebuf
(
ns_client_t
*
client
)
{
isc_
dyn
buffer_t
*
dbuf
;
isc_buffer_t
*
dbuf
;
isc_result_t
result
;
/*
...
...
@@ -134,8 +134,8 @@ query_newnamebuf(ns_client_t *client) {
*/
dbuf
=
NULL
;
result
=
isc_
dyn
buffer_allocate
(
client
->
mctx
,
&
dbuf
,
1024
,
ISC_BUFFERTYPE_BINARY
);
result
=
isc_buffer_allocate
(
client
->
mctx
,
&
dbuf
,
1024
,
ISC_BUFFERTYPE_BINARY
);
if
(
result
!=
ISC_R_SUCCESS
)
return
(
result
);
ISC_LIST_APPEND
(
client
->
query
.
namebufs
,
dbuf
,
link
);
...
...
@@ -143,9 +143,9 @@ query_newnamebuf(ns_client_t *client) {
return
(
ISC_R_SUCCESS
);
}
static
inline
isc_
dyn
buffer_t
*
static
inline
isc_buffer_t
*
query_getnamebuf
(
ns_client_t
*
client
)
{
isc_
dyn
buffer_t
*
dbuf
;
isc_buffer_t
*
dbuf
;
isc_result_t
result
;
isc_region_t
r
;
...
...
@@ -162,20 +162,20 @@ query_getnamebuf(ns_client_t *client) {
dbuf
=
ISC_LIST_TAIL
(
client
->
query
.
namebufs
);
INSIST
(
dbuf
!=
NULL
);
isc_buffer_available
(
&
dbuf
->
buffer
,
&
r
);
isc_buffer_available
(
dbuf
,
&
r
);
if
(
r
.
length
<
255
)
{
result
=
query_newnamebuf
(
client
);
if
(
result
!=
ISC_R_SUCCESS
)
return
(
NULL
);
dbuf
=
ISC_LIST_TAIL
(
client
->
query
.
namebufs
);
isc_buffer_available
(
&
dbuf
->
buffer
,
&
r
);
isc_buffer_available
(
dbuf
,
&
r
);
INSIST
(
r
.
length
>=
255
);
}
return
(
dbuf
);
}
static
inline
void
query_keepname
(
ns_client_t
*
client
,
dns_name_t
*
name
,
isc_
dyn
buffer_t
*
dbuf
)
{
query_keepname
(
ns_client_t
*
client
,
dns_name_t
*
name
,
isc_buffer_t
*
dbuf
)
{
isc_region_t
r
;
/*
...
...
@@ -186,7 +186,7 @@ query_keepname(ns_client_t *client, dns_name_t *name, isc_dynbuffer_t *dbuf) {
REQUIRE
((
client
->
query
.
attributes
&
NS_QUERYATTR_NAMEBUFUSED
)
!=
0
);
dns_name_toregion
(
name
,
&
r
);
isc_buffer_add
(
&
dbuf
->
buffer
,
r
.
length
);
isc_buffer_add
(
dbuf
,
r
.
length
);
dns_name_setbuffer
(
name
,
NULL
);
client
->
query
.
attributes
&=
~
NS_QUERYATTR_NAMEBUFUSED
;
}
...
...
@@ -211,7 +211,7 @@ query_releasename(ns_client_t *client, dns_name_t **namep) {
}
static
inline
dns_name_t
*
query_newname
(
ns_client_t
*
client
,
isc_
dyn
buffer_t
*
dbuf
,
query_newname
(
ns_client_t
*
client
,
isc_buffer_t
*
dbuf
,
isc_buffer_t
*
nbuf
)
{
dns_name_t
*
name
;
...
...
@@ -227,7 +227,7 @@ query_newname(ns_client_t *client, isc_dynbuffer_t *dbuf,
return
(
NULL
);
}
else
ISC_LIST_UNLINK
(
client
->
query
.
tmpnames
,
name
,
link
);
isc_buffer_available
(
&
dbuf
->
buffer
,
&
r
);
isc_buffer_available
(
dbuf
,
&
r
);
isc_buffer_init
(
nbuf
,
r
.
base
,
r
.
length
,
ISC_BUFFERTYPE_BINARY
);
dns_name_init
(
name
,
NULL
);
dns_name_setbuffer
(
name
,
nbuf
);
...
...
@@ -353,7 +353,7 @@ query_addadditional(void *arg, dns_name_t *name, dns_rdatatype_t type) {
dns_name_t
*
fname
,
*
mname
;
dns_rdataset_t
*
rdataset
,
*
sigrdataset
;
dns_section_t
section
;
isc_
dyn
buffer_t
*
dbuf
;
isc_buffer_t
*
dbuf
;
isc_buffer_t
b
;
dns_dbversion_t
*
version
;
...
...
@@ -544,7 +544,7 @@ query_addrdataset(ns_client_t *client, dns_name_t *fname,
static
inline
void
query_addrrset
(
ns_client_t
*
client
,
dns_name_t
**
namep
,
dns_rdataset_t
**
rdatasetp
,
dns_rdataset_t
**
sigrdatasetp
,
isc_
dyn
buffer_t
*
dbuf
,
dns_section_t
section
)
isc_buffer_t
*
dbuf
,
dns_section_t
section
)
{
dns_name_t
*
name
,
*
mname
;
dns_rdataset_t
*
rdataset
,
*
mrdataset
,
*
sigrdataset
;
...
...
@@ -767,7 +767,7 @@ query_find(ns_client_t *client) {
unsigned
int
restarts
,
qcount
,
n
,
nlabels
,
nbits
;
dns_namereln_t
namereln
;
int
order
;
isc_
dyn
buffer_t
*
dbuf
;
isc_buffer_t
*
dbuf
;
isc_region_t
r
;
isc_buffer_t
b
;
isc_result_t
result
,
eresult
;
...
...
lib/dns/include/dns/message.h
View file @
4556681e
...
...
@@ -130,7 +130,7 @@ struct dns_message {
dns_compress_t
cctx
;
isc_mem_t
*
mctx
;
ISC_LIST
(
isc_
dyn
buffer_t
)
scratchpad
;
isc_buffer
list
_t
scratchpad
;
ISC_LIST
(
dns_msgblock_t
)
names
;
ISC_LIST
(
dns_msgblock_t
)
rdatas
;
ISC_LIST
(
dns_msgblock_t
)
rdatasets
;
...
...
lib/dns/message.c
View file @
4556681e
...
...
@@ -164,10 +164,10 @@ static inline dns_result_t
newbuffer
(
dns_message_t
*
msg
,
unsigned
int
size
)
{
isc_result_t
result
;
isc_
dyn
buffer_t
*
dynbuf
;
isc_buffer_t
*
dynbuf
;
dynbuf
=
NULL
;
result
=
isc_
dyn
buffer_allocate
(
msg
->
mctx
,
&
dynbuf
,
size
,
result
=
isc_buffer_allocate
(
msg
->
mctx
,
&
dynbuf
,
size
,
ISC_BUFFERTYPE_BINARY
);
if
(
result
!=
ISC_R_SUCCESS
)
return
(
DNS_R_NOMEMORY
);
...
...
@@ -179,12 +179,12 @@ newbuffer(dns_message_t *msg, unsigned int size)
static
inline
isc_buffer_t
*
currentbuffer
(
dns_message_t
*
msg
)
{
isc_
dyn
buffer_t
*
dynbuf
;
isc_buffer_t
*
dynbuf
;
dynbuf
=
ISC_LIST_TAIL
(
msg
->
scratchpad
);
INSIST
(
dynbuf
!=
NULL
);
return
(
&
dynbuf
->
buffer
);
return
(
dynbuf
);
}
static
inline
void
...
...
@@ -409,7 +409,7 @@ static void
msgreset
(
dns_message_t
*
msg
,
isc_boolean_t
everything
)
{
dns_msgblock_t
*
msgblock
,
*
next_msgblock
;
isc_
dyn
buffer_t
*
dynbuf
,
*
next_dynbuf
;
isc_buffer_t
*
dynbuf
,
*
next_dynbuf
;
dns_rdataset_t
*
rds
;
dns_name_t
*
name
;
dns_rdata_t
*
rdata
;
...
...
@@ -454,13 +454,13 @@ msgreset(dns_message_t *msg, isc_boolean_t everything)
dynbuf
=
ISC_LIST_HEAD
(
msg
->
scratchpad
);
INSIST
(
dynbuf
!=
NULL
);
if
(
!
everything
)
{
isc_
dyn
buffer_
reset
(
dynbuf
);
isc_buffer_
clear
(
dynbuf
);
dynbuf
=
ISC_LIST_NEXT
(
dynbuf
,
link
);
}
while
(
dynbuf
!=
NULL
)
{
next_dynbuf
=
ISC_LIST_NEXT
(
dynbuf
,
link
);
ISC_LIST_UNLINK
(
msg
->
scratchpad
,
dynbuf
,
link
);
isc_
dyn
buffer_free
(
msg
->
mctx
,
&
dynbuf
);
isc_buffer_free
(
&
dynbuf
);
dynbuf
=
next_dynbuf
;
}
...
...
@@ -550,7 +550,7 @@ dns_message_create(isc_mem_t *mctx, unsigned int intent, dns_message_t **msgp)
dns_message_t
*
m
;
isc_result_t
iresult
;
dns_msgblock_t
*
msgblock
;
isc_
dyn
buffer_t
*
dynbuf
;
isc_buffer_t
*
dynbuf
;
unsigned
int
i
;
REQUIRE
(
mctx
!=
NULL
);
...
...
@@ -580,8 +580,8 @@ dns_message_create(isc_mem_t *mctx, unsigned int intent, dns_message_t **msgp)
ISC_LIST_INIT
(
m
->
freerdatalist
);
dynbuf
=
NULL
;
iresult
=
isc_
dyn
buffer_allocate
(
mctx
,
&
dynbuf
,
SCRATCHPAD_SIZE
,
ISC_BUFFERTYPE_BINARY
);
iresult
=
isc_buffer_allocate
(
mctx
,
&
dynbuf
,
SCRATCHPAD_SIZE
,
ISC_BUFFERTYPE_BINARY
);
if
(
iresult
!=
ISC_R_SUCCESS
)
goto
cleanup1
;
ISC_LIST_APPEND
(
m
->
scratchpad
,
dynbuf
,
link
);
...
...
@@ -629,7 +629,7 @@ dns_message_create(isc_mem_t *mctx, unsigned int intent, dns_message_t **msgp)
msgblock_free
(
mctx
,
msgblock
,
sizeof
(
dns_name_t
));
cleanup2:
dynbuf
=
ISC_LIST_HEAD
(
m
->
scratchpad
);
isc_
dyn
buffer_free
(
mctx
,
&
dynbuf
);
isc_buffer_free
(
&
dynbuf
);
cleanup1:
m
->
magic
=
0
;
isc_mem_put
(
mctx
,
m
,
sizeof
(
dns_message_t
));
...
...
lib/dns/tsig.c
View file @
4556681e
...
...
@@ -16,7 +16,7 @@
*/
/*
* $Id: tsig.c,v 1.
6
1999/09/0
1 18:56:18 bwelling
Exp $
* $Id: tsig.c,v 1.
7
1999/09/0
2 02:10:43 explorer
Exp $
* Principal Author: Brian Wellington
*/
...
...
@@ -166,7 +166,7 @@ dns_tsig_sign(dns_message_t *msg) {
dns_rdata_any_tsig_t
*
tsig
;
unsigned
char
data
[
128
];
isc_buffer_t
databuf
,
sigbuf
,
rdatabuf
;
isc_
dyn
buffer_t
*
dynbuf
;
isc_buffer_t
*
dynbuf
;
dns_name_t
*
owner
;
dns_rdata_t
*
rdata
;
dns_rdatalist_t
*
datalist
;
...
...
@@ -356,7 +356,7 @@ dns_tsig_sign(dns_message_t *msg) {
tries
=
0
;
dynbuf
=
ISC_LIST_TAIL
(
msg
->
scratchpad
);
INSIST
(
dynbuf
!=
NULL
);
rdatabuf
=
dynbuf
->
buffer
;
rdatabuf
=
*
dynbuf
;
while
(
tries
<
2
)
{
ret
=
dns_rdata_fromstruct
(
rdata
,
dns_rdataclass_any
,
dns_rdatatype_tsig
,
tsig
,
&
rdatabuf
);
...
...
@@ -365,12 +365,12 @@ dns_tsig_sign(dns_message_t *msg) {
else
if
(
ret
==
ISC_R_NOSPACE
)
{
if
(
++
tries
==
2
)
return
(
ISC_R_NOMEMORY
);
ret
=
isc_
dyn
buffer_allocate
(
msg
->
mctx
,
&
dynbuf
,
512
,
ISC_BUFFERTYPE_BINARY
);
ret
=
isc_buffer_allocate
(
msg
->
mctx
,
&
dynbuf
,
512
,
ISC_BUFFERTYPE_BINARY
);
if
(
ret
!=
ISC_R_SUCCESS
)
goto
cleanup_signature
;
ISC_LIST_APPEND
(
msg
->
scratchpad
,
dynbuf
,
link
);
rdatabuf
=
dynbuf
->
buffer
;
rdatabuf
=
*
dynbuf
;
}
else
goto
cleanup_signature
;
...
...
lib/isc/buffer.c
View file @
4556681e
...
...
@@ -23,17 +23,14 @@
#include <isc/buffer.h>
#define BUFFER_MAGIC 0x42756621U
/* Buf!. */
#define DYNBUFFER_MAGIC 0x64427566U
/* dBuf. */
#define VALID_BUFFER(b) ((b) != NULL && \
(b)->magic == BUFFER_MAGIC)
#define VALID_DYNBUFFER(b) ((b) != NULL && \
(b)->magic == DYNBUFFER_MAGIC)
void
isc_buffer_init
(
isc_buffer_t
*
b
,
void
*
base
,
unsigned
int
length
,
unsigned
int
type
)
{
unsigned
int
type
)
{
/*
* Make 'b' refer to the 'length'-byte region starting at base.
*/
...
...
@@ -47,6 +44,8 @@ isc_buffer_init(isc_buffer_t *b, void *base, unsigned int length,
b
->
used
=
0
;
b
->
current
=
0
;
b
->
active
=
0
;
b
->
mctx
=
NULL
;
ISC_LINK_INIT
(
b
,
link
);
}
void
...
...
@@ -56,6 +55,8 @@ isc_buffer_invalidate(isc_buffer_t *b) {
*/
REQUIRE
(
VALID_BUFFER
(
b
));
REQUIRE
(
!
ISC_LINK_LINKED
(
b
,
link
));
REQUIRE
(
b
->
mctx
==
NULL
);
b
->
magic
=
0
;
b
->
type
=
0
;
...
...
@@ -390,23 +391,21 @@ isc_buffer_putuint32(isc_buffer_t *b, isc_uint32_t val)
}
isc_result_t
isc_
dyn
buffer_allocate
(
isc_mem_t
*
mctx
,
isc_
dyn
buffer_t
**
dynbuffer
,
unsigned
int
length
,
unsigned
int
type
)
isc_buffer_allocate
(
isc_mem_t
*
mctx
,
isc_buffer_t
**
dynbuffer
,
unsigned
int
length
,
unsigned
int
type
)
{
isc_
dyn
buffer_t
*
dbuf
;
isc_buffer_t
*
dbuf
;
REQUIRE
(
dynbuffer
!=
NULL
);
REQUIRE
(
*
dynbuffer
==
NULL
);
dbuf
=
isc_mem_get
(
mctx
,
length
+
sizeof
(
isc_
dyn
buffer_t
));
dbuf
=
isc_mem_get
(
mctx
,
length
+
sizeof
(
isc_buffer_t
));
if
(
dbuf
==
NULL
)
return
(
ISC_R_NOMEMORY
);
dbuf
->
magic
=
DYNBUFFER_MAGIC
;
ISC_LINK_INIT
(
dbuf
,
link
);
isc_buffer_init
(
&
dbuf
->
buffer
,
((
unsigned
char
*
)
dbuf
)
+
sizeof
(
isc_dynbuffer_t
),
isc_buffer_init
(
dbuf
,
((
unsigned
char
*
)
dbuf
)
+
sizeof
(
isc_buffer_t
),
length
,
type
);
dbuf
->
mctx
=
mctx
;
*
dynbuffer
=
dbuf
;
...
...
@@ -414,28 +413,23 @@ isc_dynbuffer_allocate(isc_mem_t *mctx, isc_dynbuffer_t **dynbuffer,
}
void
isc_dynbuffer_reset
(
isc_dynbuffer_t
*
dynbuffer
)
{
REQUIRE
(
VALID_DYNBUFFER
(
dynbuffer
));
isc_buffer_clear
(
&
dynbuffer
->
buffer
);
}
void
isc_dynbuffer_free
(
isc_mem_t
*
mctx
,
isc_dynbuffer_t
**
dynbuffer
)
isc_buffer_free
(
isc_buffer_t
**
dynbuffer
)
{
unsigned
int
real_length
;
isc_dynbuffer_t
*
dbuf
;
isc_buffer_t
*
dbuf
;
isc_mem_t
*
mctx
;
REQUIRE
(
dynbuffer
!=
NULL
);
REQUIRE
(
VALID_DYNBUFFER
(
*
dynbuffer
));
REQUIRE
(
VALID_BUFFER
(
*
dynbuffer
));
REQUIRE
((
*
dynbuffer
)
->
mctx
!=
NULL
);
dbuf
=
*
dynbuffer
;
*
dynbuffer
=
NULL
;
/* destroy external reference */
real_length
=
dbuf
->
buffer
.
length
+
sizeof
(
isc_dynbuffer_t
);
isc_buffer_invalidate
(
&
dbuf
->
buffer
);
dbuf
->
magic
=
0
;
real_length
=
dbuf
->
length
+
sizeof
(
isc_buffer_t
);
mctx
=
dbuf
->
mctx
;
dbuf
->
mctx
=
NULL
;
isc_buffer_invalidate
(
dbuf
);
isc_mem_put
(
mctx
,
dbuf
,
real_length
);
}
lib/isc/include/isc/buffer.h
View file @
4556681e
...
...
@@ -125,38 +125,31 @@ ISC_LANG_BEGINDECLS
* discouraged from directly manipulating the structure.
*/
typedef
struct
isc_buffer
{
unsigned
int
magic
;
unsigned
int
type
;
void
*
base
;
typedef
struct
isc_buffer
isc_buffer_t
;
struct
isc_buffer
{
unsigned
int
magic
;
unsigned
int
type
;
void
*
base
;
/* The following integers are byte offsets from 'base'. */
unsigned
int
length
;
unsigned
int
used
;
unsigned
int
current
;
unsigned
int
active
;
}
isc_buffer_t
;
/*
* A handy thing to have, linkable buffers with built-in storage. These
* are allocated and freed with the isc_dynbuffer_alloc() and _free()
* functions below. These function should _ALWAYS_ be used to create these
* dynbuffers. The link is initialized on allocation and is solely for the
* caller to use.
*/
typedef
struct
isc_dynbuffer
isc_dynbuffer_t
;
struct
isc_dynbuffer
{
unsigned
int
magic
;
isc_buffer_t
buffer
;
ISC_LINK
(
isc_dynbuffer_t
)
link
;
};
/* variable sized */
unsigned
int
length
;
unsigned
int
used
;
unsigned
int
current
;
unsigned
int
active
;
/* linkable */
ISC_LINK
(
isc_buffer_t
)
link
;
/* private internal elements */
isc_mem_t
*
mctx
;
};
typedef
ISC_LIST
(
isc_buffer_t
)
isc_bufferlist_t
;
/***
*** Functions
***/
isc_result_t
isc_
dyn
buffer_allocate
(
isc_mem_t
*
mctx
,
isc_
dyn
buffer_t
**
dynbuffer
,
unsigned
int
length
,
unsigned
int
type
);
isc_buffer_allocate
(
isc_mem_t
*
mctx
,
isc_buffer_t
**
dynbuffer
,
unsigned
int
length
,
unsigned
int
type
);
/*
* Allocate a dynamic linkable buffer which has "length" bytes in the
* data region.
...
...
@@ -169,17 +162,13 @@ isc_dynbuffer_allocate(isc_mem_t *mctx, isc_dynbuffer_t **dynbuffer,
* Returns:
* ISC_R_SUCCESS - success
* ISC_R_NOMEMORY - no memory available
*
* Note:
* Changing the buffer's length field is not permitted.
*/
void
isc_dynbuffer_reset
(
isc_dynbuffer_t
*
dynbuffer
);
/*
* Reset the dynamic buffer to the initial state
*/
void
isc_dynbuffer_free
(
isc_mem_t
*
mctx
,
isc_dynbuffer_t
**
dynbuffer
);
isc_buffer_free
(
isc_buffer_t
**
dynbuffer
);
/*
* Release resources allocated for a dynamic buffer.
*
...
...
@@ -188,11 +177,10 @@ isc_dynbuffer_free(isc_mem_t *mctx, isc_dynbuffer_t **dynbuffer);
*
* "*dynbuffer" is a valid dynamic buffer.
*
* "mctx" is valid.
*
* Ensures:
* "*dynbuffer" will be NULL on return, and all memory associated with
* the dynamic buffer is returned to memory context "mctx".
* the dynamic buffer is returned to the memory context used in
* isc_buffer_allocate().
*/
void
...
...
lib/isc/include/isc/socket.h
View file @
4556681e
...
...
@@ -61,16 +61,27 @@
#include <isc/lang.h>
#include <isc/boolean.h>
#include <isc/buffer.h>
#include <isc/result.h>
#include <isc/event.h>
#include <isc/eventclass.h>
#include <isc/task.h>
#include <isc/region.h>
#include <isc/mem.h>
#include <isc/net.h>
#include <isc/sockaddr.h>
ISC_LANG_BEGINDECLS
/***
*** Constants
***/
/*
* Maximum number of buffers in a scatter/gather read/write
*/
#define ISC_SOCKET_MAXSCATTERGATHER 8
/***
*** Types
***/
...
...
@@ -84,7 +95,9 @@ struct isc_socketevent {
isc_result_t
result
;
/* OK, EOF, whatever else */
unsigned
int
minimum
;
/* minimum i/o for event */
unsigned
int
n
;
/* bytes read or written */
isc_region_t
region
;
/* the region info */
unsigned
int
offset
;
/* offset into buffer list */
isc_region_t
region
;
/* for single-buffer i/o */
ISC_LIST
(
isc_buffer_t
)
bufferlist
;
/* list of buffers */
isc_sockaddr_t
address
;
/* source address */
};
...
...
lib/isc/unix/socket.c
View file @
4556681e
...
...
@@ -28,13 +28,15 @@
#include <fcntl.h>
#include <isc/assertions.h>
#include <isc/buffer.h>
#include <isc/condition.h>
#include <isc/error.h>
#include <isc/
thread
.h>
#include <isc/
list
.h>
#include <isc/mutex.h>
#include <isc/net.h>
#include <isc/
condit
ion.h>
#include <isc/
reg
ion.h>
#include <isc/socket.h>
#include <isc/
list
.h>
#include <isc/
thread
.h>
#include "util.h"
...
...
@@ -186,6 +188,10 @@ static void internal_connect(isc_task_t *, isc_event_t *);
static
void
internal_recv
(
isc_task_t
*
,
isc_event_t
*
);
static
void
internal_send
(
isc_task_t
*
,
isc_event_t
*
);
static
void
process_cmsg
(
isc_socket_t
*
,
struct
msghdr
*
,
isc_socketevent_t
*
);
static
int
build_msghdr_send
(
isc_socketevent_t
*
,
struct
msghdr
*
,
struct
iovec
*
,
unsigned
int
maxiov
);
static
int
build_msghdr_recv
(
isc_socketevent_t
*
,
struct
msghdr
*
,
struct
iovec
*
,
unsigned
int
maxiov
);
#define SELECT_POKE_SHUTDOWN (-1)
#define SELECT_POKE_NOTHING (-2)
...
...
@@ -287,6 +293,47 @@ process_cmsg(isc_socket_t *sock, struct msghdr *msg, isc_socketevent_t *dev)
}
/*
* Construct an iov array and attach it to the msghdr passed in. Return
* 0 on success, non-zero on failure. This is the SEND constructor, which
* will used the used region of the buffer.
*
* Nothing can be NULL, and the done event must list at least one buffer
* on the buffer linked list for this function to be meaningful.
*/
static
int
build_msghdr_send
(
isc_socketevent_t
*
dev
,
struct
msghdr
*
msg
,
struct
iovec
*
iov
,
unsigned
int
maxiov
)
{
unsigned
int
iovcount
;
isc_buffer_t
*
buffer
;
isc_region_t
used
;
iovcount
=
0
;
buffer
=
ISC_LIST_HEAD
(
dev
->
bufferlist
);
for
(;;)
{
if
(
buffer
==
NULL
)
break
;
if
(
iovcount
==
maxiov
)
return
(
-
1
);
isc_buffer_used
(
buffer
,
&
used
);
if
(
used
.
length
>
0
)
{
iov
[
iovcount
].
iov_base
=
(
void
*
)
used
.
base
;
iov
[
iovcount
].
iov_len
=
used
.
length
;
iovcount
++
;
}
buffer
=
ISC_LIST_NEXT
(
buffer
,
link
);
}
msg
->
msg_iov
=
iov
;
msg
->
msg_iovlen
=
iovcount
;
return
(
0
);
}
/*
* Kill.
*
...
...
@@ -870,7 +917,7 @@ internal_recv(isc_task_t *me, isc_event_t *ev)
int
cc
;
size_t
read_count
;
struct
msghdr
msghdr
;
struct
iovec
iov
;
struct
iovec
iov
[
ISC_SOCKET_MAXSCATTERGATHER
]
;
(
void
)
me
;
...
...
@@ -920,8 +967,8 @@ internal_recv(isc_task_t *me, isc_event_t *ev)
* we can.
*/
read_count
=
dev
->
region
.
length
-
dev
->
n
;
iov
.
iov_base
=
(
void
*
)(
dev
->
region
.
base
+
dev
->
n
);
iov
.
iov_len
=
read_count
;
iov
[
0
]
.
iov_base
=
(
void
*
)(
dev
->
region
.
base
+
dev
->
n
);
iov
[
0
]
.
iov_len
=
read_count
;
memset
(
&
msghdr
,
0
,
sizeof
(
msghdr
));
if
(
sock
->
type
==
isc_sockettype_udp
)
{
...
...
@@ -933,7 +980,7 @@ internal_recv(isc_task_t *me, isc_event_t *ev)
msghdr
.
msg_namelen
=
0
;
dev
->
address
=
sock
->
address
;
}
msghdr
.
msg_iov
=
&
iov
;
msghdr
.
msg_iov
=
iov
;
msghdr
.
msg_iovlen
=
1
;
#ifdef ISC_NET_BSD44MSGHDR
...
...
@@ -1068,7 +1115,7 @@ internal_send(isc_task_t *me, isc_event_t *ev)
int
cc
;
size_t
write_count
;
struct
msghdr
msghdr
;
struct
iovec
iov
;
struct
iovec
iov
[
ISC_SOCKET_MAXSCATTERGATHER
]
;
(
void
)
me
;
...
...
@@ -1121,8 +1168,8 @@ internal_send(isc_task_t *me, isc_event_t *ev)
* we can.
*/
write_count
=
dev
->
region
.
length
-
dev
->
n
;
iov
.
iov_base
=
(
void
*
)(
dev
->
region
.
base
+
dev
->
n
);
iov
.
iov_len
=
write_count
;
iov
[
0
]
.
iov_base
=
(
void
*
)(
dev
->
region
.
base
+
dev
->
n
);
iov
[
0
]
.
iov_len
=
write_count
;
memset
(
&
msghdr
,
0
,
sizeof
(
msghdr
));
if
(
sock
->
type
==
isc_sockettype_udp
)
{
...
...
@@ -1130,7 +1177,7 @@ internal_send(isc_task_t *me, isc_event_t *ev)
msghdr
.
msg_namelen
=
dev
->
address
.
length
;
}
msghdr
.
msg_iov
=
&
iov
;
msghdr
.
msg_iov
=
iov
;
msghdr
.
msg_iovlen
=
1
;
#ifdef ISC_NET_BSD44MSGHDR
...
...
@@ -1618,6 +1665,13 @@ isc_socketmgr_destroy(isc_socketmgr_t **managerp)