Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
libnice
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
cpp-libs
libnice
Commits
fe420909
Commit
fe420909
authored
Feb 09, 2012
by
Youness Alaoui
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
stund: Use recvfrom/sendto instead of recvmsg/sendmsg
parent
dba31d4d
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
15 additions
and
67 deletions
+15
-67
stun/tools/stund.c
stun/tools/stund.c
+15
-67
No files found.
stun/tools/stund.c
View file @
fe420909
...
...
@@ -166,74 +166,22 @@ error:
return
-
1
;
}
/** Dequeue error from a socket if applicable */
static
int
recv_err
(
int
fd
)
{
#ifdef MSG_ERRQUEUE
struct
msghdr
hdr
;
memset
(
&
hdr
,
0
,
sizeof
(
hdr
));
return
recvmsg
(
fd
,
&
hdr
,
MSG_ERRQUEUE
)
>=
0
;
#else
(
void
)
fd
;
return
0
;
#endif
}
/** Receives a message or dequeues an error from a socket */
ssize_t
recv_safe
(
int
fd
,
struct
msghdr
*
msg
)
{
ssize_t
len
=
recvmsg
(
fd
,
msg
,
0
);
if
(
len
==
-
1
)
recv_err
(
fd
);
else
if
(
msg
->
msg_flags
&
MSG_TRUNC
)
{
errno
=
EMSGSIZE
;
return
-
1
;
}
return
len
;
}
/** Sends a message through a socket */
ssize_t
send_safe
(
int
fd
,
const
struct
msghdr
*
msg
)
{
ssize_t
len
;
do
len
=
sendmsg
(
fd
,
msg
,
0
);
while
((
len
==
-
1
)
&&
(
recv_err
(
fd
)
==
0
));
return
len
;
}
static
int
dgram_process
(
int
sock
,
StunAgent
*
oldagent
,
StunAgent
*
newagent
)
{
struct
sockaddr_storage
addr
;
socklen_t
addr_len
;
uint8_t
buf
[
STUN_MAX_MESSAGE_SIZE
];
char
ctlbuf
[
CMSG_SPACE
(
sizeof
(
struct
in6_pktinfo
))]
;
s
truct
iovec
iov
=
{
buf
,
sizeof
(
buf
)
}
;
size_t
buf_len
=
0
;
s
ize_t
len
=
0
;
StunMessage
request
;
StunMessage
response
;
StunValidationStatus
validation
;
StunAgent
*
agent
=
NULL
;
struct
msghdr
mh
=
{
.
msg_name
=
(
struct
sockaddr
*
)
&
addr
,
.
msg_namelen
=
sizeof
(
struct
sockaddr_in
),
.
msg_iov
=
&
iov
,
.
msg_iovlen
=
1
,
.
msg_control
=
ctlbuf
,
.
msg_controllen
=
sizeof
(
ctlbuf
)
};
size_t
len
=
recv_safe
(
sock
,
&
mh
);
if
(
len
==
(
size_t
)
-
1
)
addr_len
=
sizeof
(
struct
sockaddr_in
);
len
=
recvfrom
(
sock
,
buf
,
sizeof
(
buf
),
0
,
(
struct
sockaddr
*
)
&
addr
,
&
addr_len
);
if
(
buf_len
==
(
size_t
)
-
1
)
return
-
1
;
validation
=
stun_agent_validate
(
newagent
,
&
request
,
buf
,
len
,
NULL
,
0
);
...
...
@@ -249,7 +197,7 @@ static int dgram_process (int sock, StunAgent *oldagent, StunAgent *newagent)
/* Unknown attributes */
if
(
validation
==
STUN_VALIDATION_UNKNOWN_REQUEST_ATTRIBUTE
)
{
iov
.
iov
_len
=
stun_agent_build_unknown_attributes_error
(
agent
,
&
response
,
buf
,
buf
_len
=
stun_agent_build_unknown_attributes_error
(
agent
,
&
response
,
buf
,
sizeof
(
buf
),
&
request
);
goto
send_buf
;
}
...
...
@@ -267,10 +215,10 @@ static int dgram_process (int sock, StunAgent *oldagent, StunAgent *newagent)
if
(
stun_message_has_cookie
(
&
request
))
stun_message_append_xor_addr
(
&
response
,
STUN_ATTRIBUTE_XOR_MAPPED_ADDRESS
,
mh
.
msg_name
,
mh
.
msg_name
len
);
(
struct
sockaddr
*
)
&
addr
,
addr_
len
);
else
stun_message_append_addr
(
&
response
,
STUN_ATTRIBUTE_MAPPED_ADDRESS
,
mh
.
msg_name
,
mh
.
msg_name
len
);
(
struct
sockaddr
*
)
&
addr
,
addr_
len
);
break
;
default:
...
...
@@ -279,11 +227,11 @@ static int dgram_process (int sock, StunAgent *oldagent, StunAgent *newagent)
return
-
1
;
}
iov
.
iov
_len
=
stun_agent_finish_message
(
agent
,
&
response
,
NULL
,
0
);
buf
_len
=
stun_agent_finish_message
(
agent
,
&
response
,
NULL
,
0
);
send_buf:
len
=
send_safe
(
sock
,
&
mh
);
return
(
len
<
iov
.
iov
_len
)
?
-
1
:
0
;
len
=
sendto
(
sock
,
buf
,
buf_len
,
0
,
(
struct
sockaddr
*
)
&
addr
,
addr_len
);
return
(
len
<
buf
_len
)
?
-
1
:
0
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment