2020-06-15 14:18:57 +00:00
|
|
|
#ifndef COSMOPOLITAN_LIBC_SOCK_SOCK_H_
|
|
|
|
#define COSMOPOLITAN_LIBC_SOCK_SOCK_H_
|
2020-08-25 11:23:25 +00:00
|
|
|
#include "libc/bits/bswap.h"
|
2021-06-16 02:52:02 +00:00
|
|
|
#include "libc/calls/struct/sigset.h"
|
|
|
|
#include "libc/calls/struct/timespec.h"
|
2020-06-15 14:18:57 +00:00
|
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
|
|
COSMOPOLITAN_C_START_
|
|
|
|
/*───────────────────────────────────────────────────────────────────────────│─╗
|
|
|
|
│ cosmopolitan § system api » berkeley sockets ─╬─│┼
|
|
|
|
╚────────────────────────────────────────────────────────────────────────────│*/
|
|
|
|
|
|
|
|
#define INET_ADDRSTRLEN 22
|
|
|
|
|
2021-06-10 02:35:44 +00:00
|
|
|
#define NI_NUMERICHOST 0x01
|
|
|
|
#define NI_NUMERICSERV 0x02
|
|
|
|
#define NI_NOFQDN 0x04
|
|
|
|
#define NI_NAMEREQD 0x08
|
|
|
|
#define NI_DGRAM 0x10
|
|
|
|
|
|
|
|
#define NI_MAXHOST 0xff
|
2020-06-15 14:18:57 +00:00
|
|
|
#define NI_MAXSERV 0x20
|
|
|
|
|
|
|
|
#define htons(u16) bswap_16(u16)
|
|
|
|
#define ntohs(u16) bswap_16(u16)
|
|
|
|
#define htonl(u32) bswap_32(u32)
|
|
|
|
#define ntohl(u32) bswap_32(u32)
|
|
|
|
|
|
|
|
struct in_addr { /* ARPA ABI */
|
|
|
|
/* e.g. 127|0<<8|0<<16|1<<24 or inet_pton(AF_INET, "127.0.0.1", &s_addr) */
|
|
|
|
uint32_t s_addr;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct sockaddr { /* Linux+NT ABI */
|
|
|
|
uint16_t sa_family; /* AF_XXX */
|
|
|
|
char sa_data[14];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct sockaddr_in { /* Linux+NT ABI */
|
|
|
|
uint16_t sin_family; /* AF_XXX */
|
|
|
|
uint16_t sin_port; /* htons(XXX) i.e. big endian */
|
|
|
|
struct in_addr sin_addr;
|
|
|
|
uint8_t sin_zero[8];
|
|
|
|
};
|
|
|
|
|
2021-04-02 02:32:39 +00:00
|
|
|
struct sockaddr_un {
|
2021-04-23 17:45:19 +00:00
|
|
|
uint16_t sun_family; /* AF_UNIX */
|
|
|
|
char sun_path[108]; /* path */
|
2021-04-02 02:32:39 +00:00
|
|
|
};
|
|
|
|
|
2021-02-06 07:45:34 +00:00
|
|
|
struct sockaddr_storage {
|
|
|
|
union {
|
|
|
|
uint16_t ss_family;
|
|
|
|
intptr_t __ss_align;
|
|
|
|
char __ss_storage[128];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2021-04-23 17:45:19 +00:00
|
|
|
struct ip_mreq {
|
|
|
|
struct in_addr imr_multiaddr; /* IP multicast address of group */
|
|
|
|
struct in_addr imr_interface; /* local IP address of interface */
|
2021-04-02 02:38:11 +00:00
|
|
|
};
|
|
|
|
|
2021-04-23 17:45:19 +00:00
|
|
|
struct linger { /* Linux+XNU+BSD ABI */
|
|
|
|
int32_t l_onoff; /* on/off */
|
|
|
|
int32_t l_linger; /* seconds */
|
|
|
|
};
|
2021-04-02 02:38:11 +00:00
|
|
|
|
2020-06-15 14:18:57 +00:00
|
|
|
struct pollfd {
|
|
|
|
int32_t fd;
|
|
|
|
int16_t events;
|
|
|
|
int16_t revents;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct msghdr { /* Linux+NT ABI */
|
|
|
|
void *msg_name; /* optional address */
|
2021-04-08 05:53:23 +00:00
|
|
|
uint32_t msg_namelen; /* size of msg_name */
|
2020-06-15 14:18:57 +00:00
|
|
|
struct iovec *msg_iov; /* scatter/gather array */
|
|
|
|
uint64_t msg_iovlen; /* iovec count */
|
|
|
|
void *msg_control; /* credentials and stuff */
|
|
|
|
uint64_t msg_controllen; /* size of msg_control */
|
|
|
|
uint32_t msg_flags; /* MSG_XXX */
|
|
|
|
};
|
|
|
|
|
2021-06-24 17:53:27 +00:00
|
|
|
/*
|
|
|
|
* Structure used in SIOCGIFCONF request.
|
|
|
|
* Used to retrieve interface configuration
|
|
|
|
* for machine (useful for programs which
|
|
|
|
* must know all networks accessible).
|
|
|
|
*/
|
|
|
|
struct ifconf {
|
2021-06-24 19:31:26 +00:00
|
|
|
uint64_t ifc_len; /* size of buffer */
|
2021-06-24 17:53:27 +00:00
|
|
|
union {
|
|
|
|
char *ifcu_buf;
|
|
|
|
struct ifreq *ifcu_req;
|
|
|
|
} ifc_ifcu;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Shortcuts to the ifconf buffer or ifreq array */
|
2021-06-24 19:31:26 +00:00
|
|
|
#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
|
|
|
|
#define ifc_req ifc_ifcu.ifcu_req /* array of structures */
|
2021-06-24 17:53:27 +00:00
|
|
|
|
2021-06-24 19:31:26 +00:00
|
|
|
#define IFHWADDRLEN 6
|
|
|
|
#define IF_NAMESIZE 16
|
|
|
|
#define IFNAMSIZ IF_NAMESIZE
|
2021-06-24 17:53:27 +00:00
|
|
|
struct ifreq {
|
|
|
|
union {
|
2021-06-24 19:31:26 +00:00
|
|
|
char ifrn_name[IFNAMSIZ]; /* Interface name, e.g. "en0". */
|
2021-06-24 17:53:27 +00:00
|
|
|
} ifr_ifrn;
|
|
|
|
|
|
|
|
union {
|
2021-06-24 19:31:26 +00:00
|
|
|
struct sockaddr ifru_addr; /* SIOCGIFADDR */
|
|
|
|
struct sockaddr ifru_dstaddr; /* SIOCGIFDSTADDR */
|
|
|
|
struct sockaddr ifru_netmask; /* SIOCGIFNETMASK */
|
|
|
|
struct sockaddr ifru_broadaddr; /* SIOCGIFBRDADDR */
|
|
|
|
short ifru_flags; /* SIOCGIFFLAGS */
|
|
|
|
char ifru_pad[24]; /* ifru_map is the largest, just pad */
|
2021-06-24 17:53:27 +00:00
|
|
|
} ifr_ifru;
|
|
|
|
};
|
|
|
|
|
2021-06-24 19:31:26 +00:00
|
|
|
#define ifr_name ifr_ifrn.ifrn_name /* interface name */
|
|
|
|
#define ifr_addr ifr_ifru.ifru_addr /* address */
|
|
|
|
#define ifr_netmask ifr_ifru.ifru_netmask /* netmask */
|
|
|
|
#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
|
|
|
|
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* destination address */
|
|
|
|
#define ifr_flags ifr_ifru.ifru_flags /* flags */
|
2021-06-24 17:53:27 +00:00
|
|
|
|
2021-06-24 19:31:26 +00:00
|
|
|
#define _IOT_ifreq _IOT(_IOTS(char), IFNAMSIZ, _IOTS(char), 16, 0, 0)
|
|
|
|
#define _IOT_ifreq_short _IOT(_IOTS(char), IFNAMSIZ, _IOTS(short), 1, 0, 0)
|
|
|
|
#define _IOT_ifreq_int _IOT(_IOTS(char), IFNAMSIZ, _IOTS(int), 1, 0, 0)
|
2021-06-24 17:53:27 +00:00
|
|
|
|
2021-06-24 19:31:26 +00:00
|
|
|
#define IFF_UP (1 << 0)
|
2021-06-24 17:53:27 +00:00
|
|
|
|
2020-06-15 14:18:57 +00:00
|
|
|
const char *inet_ntop(int, const void *, char *, uint32_t);
|
2021-02-21 06:52:46 +00:00
|
|
|
int inet_aton(const char *, struct in_addr *);
|
|
|
|
int inet_pton(int, const char *, void *);
|
|
|
|
uint32_t inet_addr(const char *);
|
|
|
|
char *inet_ntoa(struct in_addr);
|
2020-06-15 14:18:57 +00:00
|
|
|
int parseport(const char *);
|
2021-06-24 19:31:26 +00:00
|
|
|
uint32_t *GetHostIps(void);
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
int socket(int, int, int) nodiscard;
|
2020-09-07 04:39:00 +00:00
|
|
|
int accept(int, void *, uint32_t *) nodiscard;
|
|
|
|
int accept4(int, void *, uint32_t *, int) nodiscard;
|
|
|
|
int bind(int, const void *, uint32_t);
|
|
|
|
int connect(int, const void *, uint32_t);
|
2020-06-15 14:18:57 +00:00
|
|
|
int listen(int, int);
|
|
|
|
int shutdown(int, int);
|
|
|
|
int getsockname(int, void *, uint32_t *) paramsnonnull();
|
|
|
|
int getpeername(int, void *, uint32_t *) paramsnonnull();
|
|
|
|
ssize_t send(int, const void *, size_t, int) paramsnonnull();
|
|
|
|
ssize_t recv(int, void *, size_t, int);
|
2021-04-08 05:53:23 +00:00
|
|
|
ssize_t recvmsg(int, struct msghdr *, int) paramsnonnull();
|
2020-06-15 14:18:57 +00:00
|
|
|
ssize_t recvfrom(int, void *, size_t, uint32_t, void *, uint32_t *);
|
|
|
|
ssize_t sendmsg(int, const struct msghdr *, int) paramsnonnull();
|
|
|
|
ssize_t readv(int, const struct iovec *, int);
|
|
|
|
ssize_t writev(int, const struct iovec *, int);
|
|
|
|
ssize_t sendfile(int, int, int64_t *, size_t);
|
|
|
|
int getsockopt(int, int, int, void *, uint32_t *) paramsnonnull((5));
|
2020-09-07 04:39:00 +00:00
|
|
|
int setsockopt(int, int, int, const void *, uint32_t);
|
2021-03-17 05:05:59 +00:00
|
|
|
int socketpair(int, int, int, int[2]) paramsnonnull();
|
2020-06-15 14:18:57 +00:00
|
|
|
int poll(struct pollfd *, uint64_t, int32_t) paramsnonnull();
|
|
|
|
int ppoll(struct pollfd *, uint64_t, const struct timespec *,
|
|
|
|
const struct sigset *) paramsnonnull((1, 4));
|
|
|
|
ssize_t sendto(int, const void *, size_t, uint32_t, const void *, uint32_t)
|
|
|
|
paramsnonnull((2));
|
|
|
|
|
|
|
|
COSMOPOLITAN_C_END_
|
|
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
|
|
#endif /* COSMOPOLITAN_LIBC_SOCK_SOCK_H_ */
|