mirror of
https://github.com/samba-team/samba.git
synced 2025-03-20 22:50:26 +03:00
lib: Move some routines around in msghdr.c
This way we only need one #ifdef for ACCRIGHTS BUG: https://bugzilla.samba.org/show_bug.cgi?id=11053 Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Michael Adam <obnox@samba.org> (cherry picked from commit f4e06a9bce42d60f6c96a21307266a99d2785ae9)
This commit is contained in:
parent
d4db166f25
commit
088b7e237a
@ -58,6 +58,54 @@ ssize_t msghdr_prep_fds(struct msghdr *msg, uint8_t *buf, size_t bufsize,
|
||||
return cmsg_space;
|
||||
}
|
||||
|
||||
size_t msghdr_prep_recv_fds(struct msghdr *msg, uint8_t *buf, size_t bufsize,
|
||||
size_t num_fds)
|
||||
{
|
||||
size_t ret = CMSG_SPACE(sizeof(int) * num_fds);
|
||||
|
||||
if (bufsize < ret) {
|
||||
return ret;
|
||||
}
|
||||
if (msg != NULL) {
|
||||
if (num_fds != 0) {
|
||||
msg->msg_control = buf;
|
||||
msg->msg_controllen = ret;
|
||||
} else {
|
||||
msg->msg_control = NULL;
|
||||
msg->msg_controllen = 0;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
size_t msghdr_extract_fds(struct msghdr *msg, int *fds, size_t fds_size)
|
||||
{
|
||||
struct cmsghdr *cmsg;
|
||||
size_t num_fds;
|
||||
|
||||
for(cmsg = CMSG_FIRSTHDR(msg);
|
||||
cmsg != NULL;
|
||||
cmsg = CMSG_NXTHDR(msg, cmsg))
|
||||
{
|
||||
if ((cmsg->cmsg_type == SCM_RIGHTS) &&
|
||||
(cmsg->cmsg_level == SOL_SOCKET)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cmsg == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
num_fds = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
|
||||
|
||||
if ((num_fds != 0) && (fds != NULL) && (fds_size >= num_fds)) {
|
||||
memcpy(fds, CMSG_DATA(cmsg), num_fds * sizeof(int));
|
||||
}
|
||||
|
||||
return num_fds;
|
||||
}
|
||||
|
||||
struct msghdr_buf {
|
||||
struct msghdr msg;
|
||||
struct sockaddr_storage addr;
|
||||
@ -130,51 +178,3 @@ struct msghdr *msghdr_buf_msghdr(struct msghdr_buf *msg)
|
||||
{
|
||||
return &msg->msg;
|
||||
}
|
||||
|
||||
size_t msghdr_prep_recv_fds(struct msghdr *msg, uint8_t *buf, size_t bufsize,
|
||||
size_t num_fds)
|
||||
{
|
||||
size_t ret = CMSG_SPACE(sizeof(int) * num_fds);
|
||||
|
||||
if (bufsize < ret) {
|
||||
return ret;
|
||||
}
|
||||
if (msg != NULL) {
|
||||
if (num_fds != 0) {
|
||||
msg->msg_control = buf;
|
||||
msg->msg_controllen = ret;
|
||||
} else {
|
||||
msg->msg_control = NULL;
|
||||
msg->msg_controllen = 0;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
size_t msghdr_extract_fds(struct msghdr *msg, int *fds, size_t fds_size)
|
||||
{
|
||||
struct cmsghdr *cmsg;
|
||||
size_t num_fds;
|
||||
|
||||
for(cmsg = CMSG_FIRSTHDR(msg);
|
||||
cmsg != NULL;
|
||||
cmsg = CMSG_NXTHDR(msg, cmsg))
|
||||
{
|
||||
if ((cmsg->cmsg_type == SCM_RIGHTS) &&
|
||||
(cmsg->cmsg_level == SOL_SOCKET)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cmsg == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
num_fds = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
|
||||
|
||||
if ((num_fds != 0) && (fds != NULL) && (fds_size >= num_fds)) {
|
||||
memcpy(fds, CMSG_DATA(cmsg), num_fds * sizeof(int));
|
||||
}
|
||||
|
||||
return num_fds;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user