# nn_cmsg(3compat) Manual Page

## NAME

nn_cmsg - message control data (compatible API)

## SYNOPSIS

    #include <nanomsg/nn.h>

    struct nn_cmsghdr {
        size_t cmsg_len;
        int    cmsg_level;
        int    cmsg_type;
    };

## DESCRIPTION

The `nn_cmsghdr` structure describes a block of control data that is associated with a message either sent by `nn_sendmsg()` or received by `nn_recvmsg()`.

| This structure and supporting macros are provided for API compatibility with legacy libnanomsg. Consider using the relevant modern API instead.

Each header is followed by `cmsg_len` bytes of data, plus any padding required to align the structure.

The only defined ancillary data at this time is the protocol headers used by the protocols. This uses `cmsg_level` set to `PROTO_SP` and the `cmsg_type` set to `SP_HDR`. The actual data for this will vary from depending on the protocol used.

Convenience macros are provided to make working with these fields easier.

`struct nn_cmsghdr *NN_CMSG_FIRSTHDR(struct nn_msghdr *hdr)`

  This macro returns the first `struct nn_cmsghdr` header in hdr.

`struct nn_cmsghdr *NN_CMSG_NXTHDR(struct nn_msghdr *hdr, struct nn_cmsghdr *ch)`

  This macro returns a pointer to the next `struct nn_cmsghdr` in hdr after ch.

`void *NN_CMSG_DATA(struct nn_cmsghdr *ch)`

  This macro returns a pointer to the header-specific data for ch.

`size_t NN_CMSG_ALIGN(size_t len)`

  This macro returns the length specified by len, plus any padding required to provide the necessary alignment for another structure.

`size_t NN_CMSG_SPACE(size_t len)`

  This macro returns the amount of space required for a header, with len bytes of following data, and any necessary padding.

`size_t NN_CMSG_LEN(size_t len)`

  This macro evaluates to the length of the header (including alignment), and the associated data of length len, but without any trailing padding to align for another header.

## SEE ALSO

nn_recvmsg(3compat), nn_sendmsg(3compat), nng_compat(3compat), nng(7)