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