111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (C) 2008 The Android Open Source Project
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * All rights reserved.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Redistribution and use in source and binary forms, with or without
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modification, are permitted provided that the following conditions
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * are met:
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  * Redistributions of source code must retain the above copyright
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    notice, this list of conditions and the following disclaimer.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  * Redistributions in binary form must reproduce the above copyright
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    notice, this list of conditions and the following disclaimer in
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    the documentation and/or other materials provided with the
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *    distribution.
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * SUCH DAMAGE.
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _SYS_SOCKET_H_
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _SYS_SOCKET_H_
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <sys/cdefs.h>
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <sys/types.h>
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/socket.h>
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <asm/fcntl.h>
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <asm/socket.h>
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/sockios.h>
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/uio.h>
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/types.h>
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/compiler.h>
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BEGIN_DECLS
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define sockaddr_storage __kernel_sockaddr_storage
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef unsigned short sa_family_t;
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct timespec;
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef __mips__
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_DGRAM      1
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_STREAM     2
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_RAW        3
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_RDM        4
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_SEQPACKET  5
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_DCCP       6
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_PACKET     10
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_STREAM      1
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_DGRAM       2
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_RAW         3
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_RDM         4
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_SEQPACKET   5
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_PACKET      10
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_CLOEXEC O_CLOEXEC
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOCK_NONBLOCK O_NONBLOCK
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertenum {
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  SHUT_RD = 0,
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SHUT_RD         SHUT_RD
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  SHUT_WR,
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SHUT_WR         SHUT_WR
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  SHUT_RDWR
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SHUT_RDWR       SHUT_RDWR
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct sockaddr {
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  sa_family_t sa_family;
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  char sa_data[14];
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct linger {
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int l_onoff;
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int l_linger;
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct msghdr {
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void* msg_name;
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  socklen_t msg_namelen;
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct iovec* msg_iov;
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_t msg_iovlen;
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  void* msg_control;
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_t msg_controllen;
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int msg_flags;
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct mmsghdr {
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct msghdr msg_hdr;
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  unsigned int msg_len;
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cmsghdr {
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_t cmsg_len;
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int cmsg_level;
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  int cmsg_type;
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr((mhdr), (cmsg))
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_DATA(cmsg) ((void*)((char*)(cmsg) + CMSG_ALIGN(sizeof(struct cmsghdr))))
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len))
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CMSG_FIRSTHDR(msg) \
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  ((msg)->msg_controllen >= sizeof(struct cmsghdr) \
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   ? (struct cmsghdr*) (msg)->msg_control : (struct cmsghdr*) NULL)
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#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)))
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct cmsghdr* __cmsg_nxthdr(struct msghdr*, struct cmsghdr*);
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SCM_RIGHTS 0x01
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SCM_CREDENTIALS 0x02
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SCM_SECURITY 0x03
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct ucred {
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  pid_t pid;
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  uid_t uid;
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  gid_t gid;
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_UNSPEC 0
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_UNIX 1
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_LOCAL 1
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_INET 2
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_AX25 3
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_IPX 4
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_APPLETALK 5
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_NETROM 6
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_BRIDGE 7
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ATMPVC 8
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_X25 9
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_INET6 10
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ROSE 11
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_DECnet 12
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_NETBEUI 13
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_SECURITY 14
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_KEY 15
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_NETLINK 16
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ROUTE AF_NETLINK
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_PACKET 17
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ASH 18
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ECONET 19
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ATMSVC 20
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_RDS 21
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_SNA 22
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_IRDA 23
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_PPPOX 24
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_WANPIPE 25
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_LLC 26
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_CAN 29
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_TIPC 30
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_BLUETOOTH 31
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_IUCV 32
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_RXRPC 33
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ISDN 34
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_PHONET 35
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_IEEE802154 36
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_CAIF 37
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_ALG 38
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define AF_MAX 39
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_UNSPEC AF_UNSPEC
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_UNIX AF_UNIX
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_LOCAL AF_LOCAL
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_INET AF_INET
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_AX25 AF_AX25
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_IPX AF_IPX
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_APPLETALK AF_APPLETALK
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_NETROM AF_NETROM
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_BRIDGE AF_BRIDGE
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ATMPVC AF_ATMPVC
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_X25 AF_X25
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_INET6 AF_INET6
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ROSE AF_ROSE
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_DECnet AF_DECnet
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_NETBEUI AF_NETBEUI
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_SECURITY AF_SECURITY
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_KEY AF_KEY
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_NETLINK AF_NETLINK
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ROUTE AF_ROUTE
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_PACKET AF_PACKET
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ASH AF_ASH
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ECONET AF_ECONET
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ATMSVC AF_ATMSVC
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_RDS AF_RDS
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_SNA AF_SNA
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_IRDA AF_IRDA
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_PPPOX AF_PPPOX
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_WANPIPE AF_WANPIPE
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_LLC AF_LLC
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_CAN AF_CAN
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_TIPC AF_TIPC
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_BLUETOOTH AF_BLUETOOTH
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_IUCV AF_IUCV
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_RXRPC AF_RXRPC
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ISDN AF_ISDN
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_PHONET AF_PHONET
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_IEEE802154 AF_IEEE802154
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_CAIF AF_CAIF
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_ALG AF_ALG
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define PF_MAX AF_MAX
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOMAXCONN 128
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_OOB 1
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_PEEK 2
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_DONTROUTE 4
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_TRYHARD 4
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_CTRUNC 8
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_PROBE 0x10
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_TRUNC 0x20
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_DONTWAIT 0x40
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_EOR 0x80
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_WAITALL 0x100
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_FIN 0x200
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_SYN 0x400
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_CONFIRM 0x800
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_RST 0x1000
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_ERRQUEUE 0x2000
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_NOSIGNAL 0x4000
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_MORE 0x8000
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_WAITFORONE 0x10000
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_FASTOPEN 0x20000000
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_CMSG_CLOEXEC 0x40000000
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_EOF MSG_FIN
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MSG_CMSG_COMPAT 0
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_IP 0
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_TCP 6
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_UDP 17
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_IPV6 41
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_ICMPV6 58
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_SCTP 132
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_RAW 255
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_IPX 256
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_AX25 257
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_ATALK 258
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_NETROM 259
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_ROSE 260
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_DECNET 261
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_X25 262
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_PACKET 263
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_ATM 264
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_AAL 265
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_IRDA 266
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_NETBEUI 267
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_LLC 268
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_DCCP 269
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_NETLINK 270
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define SOL_TIPC 271
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define IPX_TYPE 1
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef __i386__
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define __socketcall extern __attribute__((__cdecl__))
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# define __socketcall extern
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int accept(int, struct sockaddr*, socklen_t*);
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int accept4(int, struct sockaddr*, socklen_t*, int);
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int bind(int, const struct sockaddr*, int);
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int connect(int, const struct sockaddr*, socklen_t);
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int getpeername(int, struct sockaddr*, socklen_t*);
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int getsockname(int, struct sockaddr*, socklen_t*);
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int getsockopt(int, int, int, void*, socklen_t*);
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int listen(int, int);
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int recvmmsg(int, struct mmsghdr*, unsigned int, int, const struct timespec*);
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int recvmsg(int, struct msghdr*, int);
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int sendmmsg(int, const struct mmsghdr*, unsigned int, int);
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int sendmsg(int, const struct msghdr*, int);
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int setsockopt(int, int, int, const void*, socklen_t);
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int shutdown(int, int);
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int socket(int, int, int);
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall int socketpair(int, int, int, int*);
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern ssize_t send(int, const void*, size_t, int);
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern ssize_t recv(int, void*, size_t, int);
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall ssize_t sendto(int, const void*, size_t, int, const struct sockaddr*, socklen_t);
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__socketcall ssize_t recvfrom(int, void*, size_t, int, const struct sockaddr*, socklen_t*);
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(__BIONIC_FORTIFY)
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__errordecl(__recvfrom_error, "recvfrom called with size bigger than buffer");
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern ssize_t __recvfrom_chk(int, void*, size_t, size_t, int, const struct sockaddr*, socklen_t*);
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern ssize_t __recvfrom_real(int, void*, size_t, int, const struct sockaddr*, socklen_t*)
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __asm__(__USER_LABEL_PREFIX__ "recvfrom");
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BIONIC_FORTIFY_INLINE
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertssize_t recvfrom(int fd, void* buf, size_t len, int flags, const struct sockaddr* src_addr, socklen_t* addr_len) {
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_t bos = __bos0(buf);
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined(__clang__)
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return __recvfrom_real(fd, buf, len, flags, src_addr, addr_len);
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__builtin_constant_p(len) && (len <= bos)) {
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return __recvfrom_real(fd, buf, len, flags, src_addr, addr_len);
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__builtin_constant_p(len) && (len > bos)) {
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __recvfrom_error();
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return __recvfrom_chk(fd, buf, len, bos, flags, src_addr, addr_len);
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__BIONIC_FORTIFY_INLINE
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertssize_t recv(int socket, void* buf, size_t len, int flags) {
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return recvfrom(socket, buf, len, flags, NULL, 0);
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* __BIONIC_FORTIFY */
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef __socketcall
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__END_DECLS
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _SYS_SOCKET_H */
333