nuttx/net/utils/net_cmsg.c

89 lines
3.1 KiB
C
Raw Permalink Normal View History

/****************************************************************************
* net/utils/net_cmsg.c
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <sys/socket.h>
#include "utils/utils.h"
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: cmsg_append
*
* Description:
* Append specified data into the control message, msg_control and
* msg_controllen will be changed to the appropriate value when success
*
* Input Parameters:
* msg - Buffer to receive the message.
* level - The level of control message.
* type - The type of control message.
* value - If the value is not NULL, this interface copies the data
* to the appropriate location in msg_control, and modify
* msg_control and msg_controllen.
* If the value is NULL, just modify the corresponding value
* of msg.
* value_len - The value length of control message.
*
* Returned Value:
* On success, a pointer to the start address of control message data,
* the caller can copy the data in.
* On failure, return NULL, because of msg_controllen is not enough
*
****************************************************************************/
FAR void *cmsg_append(FAR struct msghdr *msg, int level, int type,
FAR void *value, int value_len)
{
FAR struct cmsghdr *cmsg;
unsigned long cmsgspace = CMSG_SPACE(value_len);
FAR void *cmsgdata;
if (msg->msg_controllen < cmsgspace)
{
return NULL;
}
cmsg = CMSG_FIRSTHDR(msg);
cmsg->cmsg_level = level;
cmsg->cmsg_type = type;
cmsg->cmsg_len = CMSG_LEN(value_len);
cmsgdata = CMSG_DATA(cmsg);
if (value)
{
memcpy(cmsgdata, value, value_len);
}
msg->msg_control = (FAR char *)msg->msg_control + cmsgspace;
msg->msg_controllen -= cmsgspace;
return cmsgdata;
}