1/* 2 * Copyright 2002-2012 Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _SYS_SOCKET_H 6#define _SYS_SOCKET_H 7 8 9#include <stdint.h> 10#include <sys/param.h> 11#include <sys/types.h> 12#include <sys/uio.h> 13 14 15typedef uint32_t socklen_t; 16typedef uint8_t sa_family_t; 17 18/* Address families */ 19#define AF_UNSPEC 0 20#define AF_INET 1 21#define AF_APPLETALK 2 22#define AF_ROUTE 3 23#define AF_LINK 4 24#define AF_INET6 5 25#define AF_DLI 6 26#define AF_IPX 7 27#define AF_NOTIFY 8 28#define AF_LOCAL 9 29#define AF_UNIX AF_LOCAL 30#define AF_BLUETOOTH 10 31#define AF_MAX 11 32 33/* Protocol families, deprecated */ 34#define PF_UNSPEC AF_UNSPEC 35#define PF_INET AF_INET 36#define PF_ROUTE AF_ROUTE 37#define PF_LINK AF_LINK 38#define PF_INET6 AF_INET6 39#define PF_LOCAL AF_LOCAL 40#define PF_UNIX AF_UNIX 41#define PF_BLUETOOTH AF_BLUETOOTH 42 43/* Socket types */ 44#define SOCK_STREAM 1 45#define SOCK_DGRAM 2 46#define SOCK_RAW 3 47#define SOCK_SEQPACKET 5 48#define SOCK_MISC 255 49 50/* Socket options for SOL_SOCKET level */ 51#define SOL_SOCKET -1 52 53#define SO_ACCEPTCONN 0x00000001 /* socket has had listen() */ 54#define SO_BROADCAST 0x00000002 /* permit sending of broadcast msgs */ 55#define SO_DEBUG 0x00000004 /* turn on debugging info recording */ 56#define SO_DONTROUTE 0x00000008 /* just use interface addresses */ 57#define SO_KEEPALIVE 0x00000010 /* keep connections alive */ 58#define SO_OOBINLINE 0x00000020 /* leave received OOB data in line */ 59#define SO_REUSEADDR 0x00000040 /* allow local address reuse */ 60#define SO_REUSEPORT 0x00000080 /* allow local address & port reuse */ 61#define SO_USELOOPBACK 0x00000100 /* bypass hardware when possible */ 62#define SO_LINGER 0x00000200 /* linger on close if data present */ 63 64#define SO_SNDBUF 0x40000001 /* send buffer size */ 65#define SO_SNDLOWAT 0x40000002 /* send low-water mark */ 66#define SO_SNDTIMEO 0x40000003 /* send timeout */ 67#define SO_RCVBUF 0x40000004 /* receive buffer size */ 68#define SO_RCVLOWAT 0x40000005 /* receive low-water mark */ 69#define SO_RCVTIMEO 0x40000006 /* receive timeout */ 70#define SO_ERROR 0x40000007 /* get error status and clear */ 71#define SO_TYPE 0x40000008 /* get socket type */ 72#define SO_NONBLOCK 0x40000009 73#define SO_BINDTODEVICE 0x4000000a /* binds the socket to a specific device index */ 74#define SO_PEERCRED 0x4000000b /* get peer credentials, param: ucred */ 75 76/* Shutdown options */ 77#define SHUT_RD 0 78#define SHUT_WR 1 79#define SHUT_RDWR 2 80 81#define SOMAXCONN 32 /* Max listen queue for a socket */ 82 83struct linger { 84 int l_onoff; 85 int l_linger; 86}; 87 88struct sockaddr { 89 uint8_t sa_len; 90 sa_family_t sa_family; 91 uint8_t sa_data[30]; 92}; 93 94struct sockaddr_storage { 95 uint8_t ss_len; /* total length */ 96 sa_family_t ss_family; /* address family */ 97 uint8_t __ss_pad1[6]; /* align to quad */ 98 uint64_t __ss_pad2; /* force alignment to 64 bit */ 99 uint8_t __ss_pad3[112]; /* pad to a total of 128 bytes */ 100}; 101 102struct msghdr { 103 void *msg_name; /* address we're using (optional) */ 104 socklen_t msg_namelen; /* length of address */ 105 struct iovec *msg_iov; /* scatter/gather array we'll use */ 106 int msg_iovlen; /* # elements in msg_iov */ 107 void *msg_control; /* extra data */ 108 socklen_t msg_controllen; /* length of extra data */ 109 int msg_flags; /* flags */ 110}; 111 112/* Flags for the msghdr.msg_flags field */ 113#define MSG_OOB 0x0001 /* process out-of-band data */ 114#define MSG_PEEK 0x0002 /* peek at incoming message */ 115#define MSG_DONTROUTE 0x0004 /* send without using routing tables */ 116#define MSG_EOR 0x0008 /* data completes record */ 117#define MSG_TRUNC 0x0010 /* data discarded before delivery */ 118#define MSG_CTRUNC 0x0020 /* control data lost before delivery */ 119#define MSG_WAITALL 0x0040 /* wait for full request or error */ 120#define MSG_DONTWAIT 0x0080 /* this message should be nonblocking */ 121#define MSG_BCAST 0x0100 /* this message rec'd as broadcast */ 122#define MSG_MCAST 0x0200 /* this message rec'd as multicast */ 123#define MSG_EOF 0x0400 /* data completes connection */ 124 125struct cmsghdr { 126 socklen_t cmsg_len; 127 int cmsg_level; 128 int cmsg_type; 129 /* data follows */ 130}; 131 132/* cmsghdr access macros */ 133#define CMSG_DATA(cmsg) ((unsigned char *)(cmsg) \ 134 + _ALIGN(sizeof(struct cmsghdr))) 135#define CMSG_NXTHDR(mhdr, cmsg) \ 136 (((char *)(cmsg) + _ALIGN((cmsg)->cmsg_len) \ 137 + _ALIGN(sizeof(struct cmsghdr)) \ 138 > (char *)(mhdr)->msg_control + (mhdr)->msg_controllen) \ 139 ? (struct cmsghdr *)NULL \ 140 : (struct cmsghdr *)((char *)(cmsg) + _ALIGN((cmsg)->cmsg_len))) 141#define CMSG_FIRSTHDR(mhdr) \ 142 ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) \ 143 ? (struct cmsghdr *)(mhdr)->msg_control \ 144 : (struct cmsghdr *)NULL) 145#define CMSG_SPACE(len) (_ALIGN(sizeof(struct cmsghdr)) + _ALIGN(len)) 146#define CMSG_LEN(len) (_ALIGN(sizeof(struct cmsghdr)) + (len)) 147#define CMSG_ALIGN(len) _ALIGN(len) 148 149/* SOL_SOCKET control message types */ 150#define SCM_RIGHTS 0x01 151 152/* parameter to SO_PEERCRED */ 153struct ucred { 154 pid_t pid; /* PID of sender */ 155 uid_t uid; /* UID of sender */ 156 gid_t gid; /* GID of sender */ 157}; 158 159 160#if __cplusplus 161extern "C" { 162#endif 163 164int accept(int socket, struct sockaddr *address, socklen_t *_addressLength); 165int bind(int socket, const struct sockaddr *address, 166 socklen_t addressLength); 167int connect(int socket, const struct sockaddr *address, 168 socklen_t addressLength); 169int getpeername(int socket, struct sockaddr *address, 170 socklen_t *_addressLength); 171int getsockname(int socket, struct sockaddr *address, 172 socklen_t *_addressLength); 173int getsockopt(int socket, int level, int option, void *value, 174 socklen_t *_length); 175int listen(int socket, int backlog); 176ssize_t recv(int socket, void *buffer, size_t length, int flags); 177ssize_t recvfrom(int socket, void *buffer, size_t bufferLength, int flags, 178 struct sockaddr *address, socklen_t *_addressLength); 179ssize_t recvmsg(int socket, struct msghdr *message, int flags); 180ssize_t send(int socket, const void *buffer, size_t length, int flags); 181ssize_t sendmsg(int socket, const struct msghdr *message, int flags); 182ssize_t sendto(int socket, const void *message, size_t length, int flags, 183 const struct sockaddr *address, socklen_t addressLength); 184int setsockopt(int socket, int level, int option, const void *value, 185 socklen_t length); 186int shutdown(int socket, int how); 187int socket(int domain, int type, int protocol); 188int sockatmark(int descriptor); 189int socketpair(int domain, int type, int protocol, int socketVector[2]); 190 191#if __cplusplus 192} 193#endif 194 195#endif /* _SYS_SOCKET_H */ 196