1
0
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:
Volker Lendecke 2015-09-27 00:46:33 +02:00 committed by Karolin Seeger
parent d4db166f25
commit 088b7e237a

View File

@ -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;
}