1ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle/*
2ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * Copyright (C) 2014 The Android Open Source Project
3ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * All rights reserved.
4ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle *
5ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * Redistribution and use in source and binary forms, with or without
6ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * modification, are permitted provided that the following conditions
7ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * are met:
8ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle *  * Redistributions of source code must retain the above copyright
9ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle *    notice, this list of conditions and the following disclaimer.
10ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle *  * Redistributions in binary form must reproduce the above copyright
11ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle *    notice, this list of conditions and the following disclaimer in
12ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle *    the documentation and/or other materials provided with the
13ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle *    distribution.
14ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle *
15ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle * SUCH DAMAGE.
27ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle */
28ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle
29ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle#include <sys/socket.h>
30ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle
31096b4eb752aa7a5392875cb2f2faf0d67c676ac1Calin Juravlecmsghdr* __cmsg_nxthdr(msghdr* msg, cmsghdr* cmsg) {
32ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle  cmsghdr* ptr;
33ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle  ptr = reinterpret_cast<cmsghdr*>(reinterpret_cast<char*>(cmsg) + CMSG_ALIGN(cmsg->cmsg_len));
34ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle  size_t len = reinterpret_cast<char*>(ptr+1) - reinterpret_cast<char*>(msg->msg_control);
35ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle  if (len > msg->msg_controllen) {
36ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle    return NULL;
37ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle  }
38ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle  return ptr;
39ff64831b0965c16c95c9f81a148f30a6ef3a6c64Calin Juravle}
40