11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved.
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met:
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *  * Redistributions of source code must retain the above copyright
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *  * Redistributions in binary form must reproduce the above copyright
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer in
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    the documentation and/or other materials provided with the
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    distribution.
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE.
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
2843d2137af0e2f65b7febf4414e10b979aa0007bfAndrei Emeltchenko
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _SYS_SOCKET_H_
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _SYS_SOCKET_H_
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h>
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h>
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <linux/socket.h>
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3643d2137af0e2f65b7febf4414e10b979aa0007bfAndrei Emeltchenko#include <asm/fcntl.h>
3786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#include <asm/socket.h>
3886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#include <linux/sockios.h>
3986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#include <linux/uio.h>
4086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#include <linux/types.h>
4186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#include <linux/compiler.h>
4286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
43508d292f8deb2933914b0ceef56908cdd4ee589fElliott Hughes#include <bits/sa_family_t.h>
44508d292f8deb2933914b0ceef56908cdd4ee589fElliott Hughes
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define sockaddr_storage __kernel_sockaddr_storage
4886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
49a8b1eb3fcf13fab029a16fa3b6636218a64c4583Elliott Hughesstruct timespec;
50a8b1eb3fcf13fab029a16fa3b6636218a64c4583Elliott Hughes
516437eac15a5b595ab26ef51834509c44695eb7e4Raghu Gandham#ifdef __mips__
526437eac15a5b595ab26ef51834509c44695eb7e4Raghu Gandham#define SOCK_DGRAM      1
536437eac15a5b595ab26ef51834509c44695eb7e4Raghu Gandham#define SOCK_STREAM     2
54d75abb9614b04c3da3104099752726f9d1c6d8c7Greg Hackmann#else
55d75abb9614b04c3da3104099752726f9d1c6d8c7Greg Hackmann#define SOCK_STREAM     1
56d75abb9614b04c3da3104099752726f9d1c6d8c7Greg Hackmann#define SOCK_DGRAM      2
57d75abb9614b04c3da3104099752726f9d1c6d8c7Greg Hackmann#endif
586437eac15a5b595ab26ef51834509c44695eb7e4Raghu Gandham#define SOCK_RAW        3
596437eac15a5b595ab26ef51834509c44695eb7e4Raghu Gandham#define SOCK_RDM        4
606437eac15a5b595ab26ef51834509c44695eb7e4Raghu Gandham#define SOCK_SEQPACKET  5
616437eac15a5b595ab26ef51834509c44695eb7e4Raghu Gandham#define SOCK_DCCP       6
626437eac15a5b595ab26ef51834509c44695eb7e4Raghu Gandham#define SOCK_PACKET     10
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
6443d2137af0e2f65b7febf4414e10b979aa0007bfAndrei Emeltchenko#define SOCK_CLOEXEC O_CLOEXEC
6543d2137af0e2f65b7febf4414e10b979aa0007bfAndrei Emeltchenko#define SOCK_NONBLOCK O_NONBLOCK
6643d2137af0e2f65b7febf4414e10b979aa0007bfAndrei Emeltchenko
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectenum {
6843d2137af0e2f65b7febf4414e10b979aa0007bfAndrei Emeltchenko  SHUT_RD = 0,
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SHUT_RD         SHUT_RD
7043d2137af0e2f65b7febf4414e10b979aa0007bfAndrei Emeltchenko  SHUT_WR,
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SHUT_WR         SHUT_WR
7243d2137af0e2f65b7febf4414e10b979aa0007bfAndrei Emeltchenko  SHUT_RDWR
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SHUT_RDWR       SHUT_RDWR
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughesstruct sockaddr {
776ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  sa_family_t sa_family;
786ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  char sa_data[14];
7986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes};
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
8186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughesstruct linger {
826ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  int l_onoff;
836ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  int l_linger;
8486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes};
8586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
8686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughesstruct msghdr {
876ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  void* msg_name;
886ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  socklen_t msg_namelen;
896ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  struct iovec* msg_iov;
906ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  size_t msg_iovlen;
916ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  void* msg_control;
926ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  size_t msg_controllen;
936ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  int msg_flags;
946ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet};
956ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet
966ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquetstruct mmsghdr {
976ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  struct msghdr msg_hdr;
986ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  unsigned int msg_len;
9986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes};
10086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
10186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughesstruct cmsghdr {
1026ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  size_t cmsg_len;
1036ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  int cmsg_level;
1046ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  int cmsg_type;
10586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes};
10686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
107096b4eb752aa7a5392875cb2f2faf0d67c676ac1Calin Juravle#define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr((mhdr), (cmsg))
10886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
109268af26359c8f1c87585e26d2763e3a3a63f8714Dan Albert#define CMSG_DATA(cmsg) (((unsigned char*)(cmsg) + CMSG_ALIGN(sizeof(struct cmsghdr))))
11086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len))
11186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
112f1de90b3a26d6ec46c0f1c741ef93509fe69f942Calin Juravle#define CMSG_FIRSTHDR(msg) \
113f1de90b3a26d6ec46c0f1c741ef93509fe69f942Calin Juravle  ((msg)->msg_controllen >= sizeof(struct cmsghdr) \
114f1de90b3a26d6ec46c0f1c741ef93509fe69f942Calin Juravle   ? (struct cmsghdr*) (msg)->msg_control : (struct cmsghdr*) NULL)
1156ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet#define CMSG_OK(mhdr, cmsg) ((cmsg)->cmsg_len >= sizeof(struct cmsghdr) &&   (cmsg)->cmsg_len <= (unsigned long)   ((mhdr)->msg_controllen -   ((char*)(cmsg) - (char*)(mhdr)->msg_control)))
11686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
1175bc78c8bcd0c1e634c04029309ede3ec05f2d424Elliott Hughes#if __ANDROID_API__ >= __ANDROID_API_L__
11814adff1cfa06a3d4d3281a9bf7848b556d84c20dJosh Gaostruct cmsghdr* __cmsg_nxthdr(struct msghdr*, struct cmsghdr*) __INTRODUCED_IN(21);
11911f0e10c4911e39733145194ee78bb65d684fff4Dan Albert#else
12011f0e10c4911e39733145194ee78bb65d684fff4Dan Albert/* TODO(danalbert): Move this into libandroid_support. */
12111f0e10c4911e39733145194ee78bb65d684fff4Dan Albertstatic inline struct cmsghdr* __cmsg_nxthdr(struct msghdr* msg, struct cmsghdr* cmsg) {
12211f0e10c4911e39733145194ee78bb65d684fff4Dan Albert  struct cmsghdr* ptr =
12311f0e10c4911e39733145194ee78bb65d684fff4Dan Albert      __BIONIC_CAST(reinterpret_cast, struct cmsghdr*,
12411f0e10c4911e39733145194ee78bb65d684fff4Dan Albert                    (__BIONIC_CAST(reinterpret_cast, char*, cmsg) + CMSG_ALIGN(cmsg->cmsg_len)));
12511f0e10c4911e39733145194ee78bb65d684fff4Dan Albert  size_t len = __BIONIC_CAST(reinterpret_cast, char*, ptr + 1) -
12611f0e10c4911e39733145194ee78bb65d684fff4Dan Albert               __BIONIC_CAST(reinterpret_cast, char*, msg->msg_control);
12711f0e10c4911e39733145194ee78bb65d684fff4Dan Albert  if (len > msg->msg_controllen) {
12811f0e10c4911e39733145194ee78bb65d684fff4Dan Albert    return NULL;
12911f0e10c4911e39733145194ee78bb65d684fff4Dan Albert  }
13011f0e10c4911e39733145194ee78bb65d684fff4Dan Albert  return ptr;
13111f0e10c4911e39733145194ee78bb65d684fff4Dan Albert}
1325bc78c8bcd0c1e634c04029309ede3ec05f2d424Elliott Hughes#endif /* __ANDROID_API__ >= __ANDROID_API_L__ */
13386ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
13486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SCM_RIGHTS 0x01
13586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SCM_CREDENTIALS 0x02
13686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SCM_SECURITY 0x03
13786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
13886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughesstruct ucred {
1396ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  pid_t pid;
1406ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  uid_t uid;
1416ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet  gid_t gid;
14286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes};
14386ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
14486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_UNSPEC 0
14586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_UNIX 1
14686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_LOCAL 1
14786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_INET 2
14886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_AX25 3
14986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_IPX 4
15086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_APPLETALK 5
15186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_NETROM 6
15286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_BRIDGE 7
15386ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_ATMPVC 8
15486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_X25 9
15586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_INET6 10
15686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_ROSE 11
15786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_DECnet 12
15886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_NETBEUI 13
15986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_SECURITY 14
16086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_KEY 15
16186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_NETLINK 16
16286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_ROUTE AF_NETLINK
16386ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_PACKET 17
16486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_ASH 18
16586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_ECONET 19
16686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_ATMSVC 20
167d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define AF_RDS 21
16886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_SNA 22
16986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_IRDA 23
17086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_PPPOX 24
17186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_WANPIPE 25
17286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_LLC 26
173d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define AF_CAN 29
17486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_TIPC 30
17586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define AF_BLUETOOTH 31
176d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define AF_IUCV 32
177d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define AF_RXRPC 33
178d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define AF_ISDN 34
179d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define AF_PHONET 35
180d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define AF_IEEE802154 36
181d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define AF_CAIF 37
182d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define AF_ALG 38
183c7ca8f3a6332638021b9ae99e1ce15739350ee98Greg Hackmann#define AF_NFC 39
184c7ca8f3a6332638021b9ae99e1ce15739350ee98Greg Hackmann#define AF_VSOCK 40
1858d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define AF_KCM 41
1868d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define AF_QIPCRTR 42
1878d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define AF_MAX 43
18886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
18986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_UNSPEC AF_UNSPEC
19086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_UNIX AF_UNIX
19186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_LOCAL AF_LOCAL
19286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_INET AF_INET
19386ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_AX25 AF_AX25
19486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_IPX AF_IPX
19586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_APPLETALK AF_APPLETALK
19686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_NETROM AF_NETROM
19786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_BRIDGE AF_BRIDGE
19886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_ATMPVC AF_ATMPVC
19986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_X25 AF_X25
20086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_INET6 AF_INET6
20186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_ROSE AF_ROSE
20286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_DECnet AF_DECnet
20386ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_NETBEUI AF_NETBEUI
20486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_SECURITY AF_SECURITY
20586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_KEY AF_KEY
20686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_NETLINK AF_NETLINK
20786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_ROUTE AF_ROUTE
20886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_PACKET AF_PACKET
20986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_ASH AF_ASH
21086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_ECONET AF_ECONET
21186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_ATMSVC AF_ATMSVC
212d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define PF_RDS AF_RDS
21386ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_SNA AF_SNA
21486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_IRDA AF_IRDA
21586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_PPPOX AF_PPPOX
21686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_WANPIPE AF_WANPIPE
21786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_LLC AF_LLC
218d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define PF_CAN AF_CAN
21986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_TIPC AF_TIPC
22086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_BLUETOOTH AF_BLUETOOTH
221d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define PF_IUCV AF_IUCV
222d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define PF_RXRPC AF_RXRPC
223d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define PF_ISDN AF_ISDN
224d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define PF_PHONET AF_PHONET
225d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define PF_IEEE802154 AF_IEEE802154
22686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_CAIF AF_CAIF
227d73c0b300e2dbaa4cc59f87fc1435661e5e1c736Elliott Hughes#define PF_ALG AF_ALG
228c7ca8f3a6332638021b9ae99e1ce15739350ee98Greg Hackmann#define PF_NFC AF_NFC
229c7ca8f3a6332638021b9ae99e1ce15739350ee98Greg Hackmann#define PF_VSOCK AF_VSOCK
2308d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define PF_KCM AF_KCM
2318d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define PF_QIPCRTR AF_QIPCRTR
23286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define PF_MAX AF_MAX
23386ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
23486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOMAXCONN 128
23586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
23686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_OOB 1
23786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_PEEK 2
23886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_DONTROUTE 4
23986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_TRYHARD 4
24086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_CTRUNC 8
24186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_PROBE 0x10
24286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_TRUNC 0x20
24386ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_DONTWAIT 0x40
24486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_EOR 0x80
24586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_WAITALL 0x100
24686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_FIN 0x200
24786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_SYN 0x400
24886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_CONFIRM 0x800
24986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_RST 0x1000
25086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_ERRQUEUE 0x2000
25186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_NOSIGNAL 0x4000
25286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_MORE 0x8000
2536ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet#define MSG_WAITFORONE 0x10000
2548d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define MSG_BATCH 0x40000
2556ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet#define MSG_FASTOPEN 0x20000000
2566ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet#define MSG_CMSG_CLOEXEC 0x40000000
25786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_EOF MSG_FIN
25886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define MSG_CMSG_COMPAT 0
25986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
26086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_IP 0
26186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_TCP 6
26286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_UDP 17
26386ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_IPV6 41
26486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_ICMPV6 58
26586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_SCTP 132
26686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_RAW 255
26786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_IPX 256
26886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_AX25 257
26986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_ATALK 258
27086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_NETROM 259
27186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_ROSE 260
27286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_DECNET 261
27386ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_X25 262
27486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_PACKET 263
27586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_ATM 264
27686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_AAL 265
27786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_IRDA 266
27886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_NETBEUI 267
27986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_LLC 268
28086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_DCCP 269
28186ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_NETLINK 270
28286ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define SOL_TIPC 271
2838d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define SOL_RXRPC 272
2848d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define SOL_PPPOL2TP 273
2858d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define SOL_BLUETOOTH 274
2868d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define SOL_PNPIPE 275
2878d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define SOL_RDS 276
2888d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define SOL_IUCV 277
2898d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define SOL_CAIF 278
2908d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define SOL_ALG 279
2918d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define SOL_NFC 280
2928d7687143843c4fe8c8e79ea8abbc2d6b9c889f2Elliott Hughes#define SOL_KCM 281
29386ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
29486ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#define IPX_TYPE 1
29586ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes
29686ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#ifdef __i386__
29786ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes# define __socketcall extern __attribute__((__cdecl__))
29886ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#else
29986ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes# define __socketcall extern
30086ec05acc9df3098c4e99e5b3ad85dcef66712c7Elliott Hughes#endif
3011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3026ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet__socketcall int accept(int, struct sockaddr*, socklen_t*);
30314adff1cfa06a3d4d3281a9bf7848b556d84c20dJosh Gao__socketcall int accept4(int, struct sockaddr*, socklen_t*, int) __INTRODUCED_IN(21);
3042b9605fec499b24bcbe9ff408b934455b4d85e57Elliott Hughes__socketcall int bind(int, const struct sockaddr*, socklen_t);
3056ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet__socketcall int connect(int, const struct sockaddr*, socklen_t);
3066ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet__socketcall int getpeername(int, struct sockaddr*, socklen_t*);
3076ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet__socketcall int getsockname(int, struct sockaddr*, socklen_t*);
3086ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet__socketcall int getsockopt(int, int, int, void*, socklen_t*);
3091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__socketcall int listen(int, int);
31014adff1cfa06a3d4d3281a9bf7848b556d84c20dJosh Gao__socketcall int recvmmsg(int, struct mmsghdr*, unsigned int, int, const struct timespec*)
31114adff1cfa06a3d4d3281a9bf7848b556d84c20dJosh Gao  __INTRODUCED_IN(21);
3122b9605fec499b24bcbe9ff408b934455b4d85e57Elliott Hughes__socketcall ssize_t recvmsg(int, struct msghdr*, int);
31314adff1cfa06a3d4d3281a9bf7848b556d84c20dJosh Gao__socketcall int sendmmsg(int, const struct mmsghdr*, unsigned int, int) __INTRODUCED_IN(21);
3142b9605fec499b24bcbe9ff408b934455b4d85e57Elliott Hughes__socketcall ssize_t sendmsg(int, const struct msghdr*, int);
3156ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet__socketcall int setsockopt(int, int, int, const void*, socklen_t);
3161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__socketcall int shutdown(int, int);
3176ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet__socketcall int socket(int, int, int);
3186ff0c75c838e73d2aeccc0102ab58a7b865172caGuillaume Ranquet__socketcall int socketpair(int, int, int, int*);
3191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
3207cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IVssize_t recv(int, void*, size_t, int) __overloadable __RENAME_CLANG(recv);
32195b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micayssize_t send(int, const void*, size_t, int) __overloadable __RENAME_CLANG(send);
3221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
32395b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay__socketcall ssize_t sendto(int, const void*, size_t, int, const struct sockaddr*, socklen_t)
32495b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay        __overloadable __RENAME_CLANG(sendto);
3257cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV__socketcall ssize_t recvfrom(int, void*, size_t, int, struct sockaddr*,
3267cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV        socklen_t*) __overloadable __RENAME_CLANG(recvfrom);
3271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
32895b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micayextern ssize_t __sendto_chk(int, const void*, size_t, size_t, int, const struct sockaddr*,
329cb302f932a3532f1484e1e70894e9b1199384283Josh Gao        socklen_t) __INTRODUCED_IN(26);
3307cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IVssize_t __recvfrom_chk(int, void*, size_t, size_t, int, struct sockaddr*,
3317cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV        socklen_t*) __INTRODUCED_IN(21);
33260f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich
333658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert#if defined(__BIONIC_FORTIFY)
334658727e111ed6dee7be5239494f0764f7b1b02f8Dan Albert
335156d5a8ae93c6515919dd6706481991c7c0dc600George Burgess IV#define __recvfrom_bad_size "recvfrom called with size bigger than buffer"
33695b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay#define __sendto_bad_size "sendto called with size bigger than buffer"
3377cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV#if defined(__clang__)
3387cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV#if __ANDROID_API__ >= __ANDROID_API_N__
3397cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV__BIONIC_ERROR_FUNCTION_VISIBILITY
340156d5a8ae93c6515919dd6706481991c7c0dc600George Burgess IVssize_t recvfrom(int fd, void* const buf __pass_object_size0, size_t len,
3417cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV                 int flags, struct sockaddr* src_addr, socklen_t* addr_len)
3427cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV        __overloadable
3437cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV        __enable_if(__bos(buf) != __BIONIC_FORTIFY_UNKNOWN_SIZE &&
3447cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV                    __bos(buf) < len, "selected when the buffer is too small")
345156d5a8ae93c6515919dd6706481991c7c0dc600George Burgess IV        __errorattr(__recvfrom_bad_size);
3467cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV
3477cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV__BIONIC_FORTIFY_INLINE
348156d5a8ae93c6515919dd6706481991c7c0dc600George Burgess IVssize_t recvfrom(int fd, void* const buf __pass_object_size0, size_t len,
3497cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV                 int flags, struct sockaddr* src_addr, socklen_t* addr_len)
3507cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV      __overloadable {
3517cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV  size_t bos = __bos0(buf);
3527cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV
3537cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV  if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
3547cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV    return __call_bypassing_fortify(recvfrom)(fd, buf, len, flags, src_addr,
3557cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV              addr_len);
3567cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV  }
3577cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV
3587cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV  return __recvfrom_chk(fd, buf, len, bos, flags, src_addr, addr_len);
3597cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV}
3607cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV#endif /* __ANDROID_API__ >= __ANDROID_API_N__ */
3617cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV
36295b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay#if __ANDROID_API__ >= __ANDROID_API_N_MR1__
36395b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay__BIONIC_ERROR_FUNCTION_VISIBILITY
36495b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micayssize_t sendto(int fd, const void* buf, size_t len, int flags,
36595b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay               const struct sockaddr* dest_addr, socklen_t addr_len)
36695b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay        __overloadable
36795b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay        __enable_if(__bos0(buf) != __BIONIC_FORTIFY_UNKNOWN_SIZE &&
36895b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay                    __bos0(buf) < len, "selected when the buffer is too small")
36995b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay        __errorattr(__sendto_bad_size);
37095b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
37195b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay__BIONIC_FORTIFY_INLINE
37295b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micayssize_t sendto(int fd, const void* const buf __pass_object_size0, size_t len,
37395b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay               int flags, const struct sockaddr* dest_addr, socklen_t addr_len)
37495b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay      __overloadable {
37595b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  size_t bos = __bos0(buf);
37695b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
37795b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
37895b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay    return __call_bypassing_fortify(sendto)(fd, buf, len, flags, dest_addr,
37995b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay              addr_len);
38095b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  }
38195b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
38295b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  return __sendto_chk(fd, buf, len, bos, flags, dest_addr, addr_len);
38395b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay}
38495b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
38595b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay__BIONIC_ERROR_FUNCTION_VISIBILITY
38695b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micayssize_t send(int socket, const void* buf, size_t len, int flags)
38795b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay        __overloadable
38895b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay        __enable_if(__bos0(buf) != __BIONIC_FORTIFY_UNKNOWN_SIZE &&
38995b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay                    __bos0(buf) < len, "selected when the buffer is too small")
39095b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay        __errorattr("send called with size bigger than buffer");
39195b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay#endif /* __ANDROID_API__ >= __ANDROID_API_N_MR1__ */
39295b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
3937cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV#else /* defined(__clang__) */
3947cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IVssize_t __recvfrom_real(int, void*, size_t, int, struct sockaddr*, socklen_t*) __RENAME(recvfrom);
395156d5a8ae93c6515919dd6706481991c7c0dc600George Burgess IV__errordecl(__recvfrom_error, __recvfrom_bad_size);
3967cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV
39795b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micayextern ssize_t __sendto_real(int, const void*, size_t, int, const struct sockaddr*, socklen_t)
39895b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay        __RENAME(sendto);
39995b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay__errordecl(__sendto_error, __sendto_bad_size);
40095b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
4015bc78c8bcd0c1e634c04029309ede3ec05f2d424Elliott Hughes#if __ANDROID_API__ >= __ANDROID_API_N__
40260f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich__BIONIC_FORTIFY_INLINE
4037cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IVssize_t recvfrom(int fd, void* buf, size_t len, int flags,
4047cc779f15c524e1622f7d5b1c7e82e6ffc6677fdGeorge Burgess IV                 struct sockaddr* src_addr, socklen_t* addr_len) {
40560f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich  size_t bos = __bos0(buf);
40660f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich
40760f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich  if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
408247dc91889ffc8b71fc3371edba9d834afab96abElliott Hughes    return __recvfrom_real(fd, buf, len, flags, src_addr, addr_len);
40960f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich  }
41060f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich
41160f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich  if (__builtin_constant_p(len) && (len <= bos)) {
412247dc91889ffc8b71fc3371edba9d834afab96abElliott Hughes    return __recvfrom_real(fd, buf, len, flags, src_addr, addr_len);
41360f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich  }
41460f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich
41560f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich  if (__builtin_constant_p(len) && (len > bos)) {
41660f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich    __recvfrom_error();
41760f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich  }
41860f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich
419247dc91889ffc8b71fc3371edba9d834afab96abElliott Hughes  return __recvfrom_chk(fd, buf, len, bos, flags, src_addr, addr_len);
42060f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich}
4215bc78c8bcd0c1e634c04029309ede3ec05f2d424Elliott Hughes#endif /* __ANDROID_API__ >= __ANDROID_API_N__ */
42295b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
42395b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay#if __ANDROID_API__ >= __ANDROID_API_N_MR1__
42495b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay__BIONIC_FORTIFY_INLINE
42595b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micayssize_t sendto(int fd, const void* buf, size_t len, int flags,
42695b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay               const struct sockaddr* dest_addr, socklen_t addr_len) {
42795b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  size_t bos = __bos0(buf);
42895b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
42995b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
43095b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay    return __sendto_real(fd, buf, len, flags, dest_addr, addr_len);
43195b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  }
43295b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
43395b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  if (__builtin_constant_p(len) && (len <= bos)) {
43495b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay    return __sendto_real(fd, buf, len, flags, dest_addr, addr_len);
43595b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  }
43695b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
43795b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  if (__builtin_constant_p(len) && (len > bos)) {
43895b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay    __sendto_error();
43995b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  }
44095b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
44195b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  return __sendto_chk(fd, buf, len, bos, flags, dest_addr, addr_len);
44295b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay}
44395b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay#endif /* __ANDROID_API__ >= __ANDROID_API_N_MR1__ */
44495b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
445156d5a8ae93c6515919dd6706481991c7c0dc600George Burgess IV#endif /* defined(__clang__) */
446156d5a8ae93c6515919dd6706481991c7c0dc600George Burgess IV#undef __recvfrom_bad_size
44795b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay#undef __sendto_bad_size
44860f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich
44960f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich__BIONIC_FORTIFY_INLINE
450156d5a8ae93c6515919dd6706481991c7c0dc600George Burgess IVssize_t recv(int socket, void* const buf __pass_object_size0, size_t len,
451156d5a8ae93c6515919dd6706481991c7c0dc600George Burgess IV             int flags) __overloadable {
452247dc91889ffc8b71fc3371edba9d834afab96abElliott Hughes  return recvfrom(socket, buf, len, flags, NULL, 0);
45360f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich}
45460f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich
45595b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay__BIONIC_FORTIFY_INLINE
45695b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micayssize_t send(int socket, const void* const buf __pass_object_size0, size_t len, int flags)
45795b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay        __overloadable {
45895b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay  return sendto(socket, buf, len, flags, NULL, 0);
45995b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay}
46095b59c520b24aabcdc63b93a3f1eaf73e57a3afeDaniel Micay
46160f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich#endif /* __BIONIC_FORTIFY */
46260f4f9a5b99a0a66817f50edfc2194a49f8b5146Nick Kralevich
4631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#undef __socketcall
4641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
4661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _SYS_SOCKET_H */
468