#define _SYS_SOCKETS_H_
#include <sys/types.h>
+#ifndef size_t
#include <stddef.h> // size_t
+#endif
+#include <stdint.h> // uint32_t
+
+#ifdef __cplusplus
+extern "C" {
+#endif
typedef uint32_t socklen_t;
-typedef enum
+enum
{
AF_UNSPEC = 0,
AF_PACKET = 1,
AF_LOCAL = 2,
AF_INET = 4,
AF_INET6 = 6,
-} sa_family_t;
+};
#define AF_UNIX AF_LOCAL
+typedef uint8_t sa_family_t; // I would use an enum, but cast issues
struct sockaddr
{
sa_family_t sa_family;
- char sa_data[16];
+ char sa_data[16+2];
};
struct msghdr
enum
{
SO_REUSEADDR,
- SO_LINGER
+ SO_LINGER,
+ SO_ERROR,
+ SO_KEEPALIVE,
+};
+
+// shutdown how
+enum
+{
+ SHUT_RD,
+ SHUT_WR,
+ SHUT_RDWR
};
+// flags for send*
+//#define MSG_CONFIRM 0x01
+#define MSG_DONTROUTE 0x02
+#define MSG_OOB 0x40
+// flags for recv
+#define MSG_PEEK 0x100
+
/**
* \brief Create a new socket descriptor
* \param domain Address family
*/
extern int socket(int domain, int type, int protocol);
+/**
+ *
+ */
+extern int shutdown(int socket, int how);
+
/**
* \brief Bind a socket to an address
*/
*/
extern int listen(int sockfd, int backlog);
+#define SOMAXCONN 128 // Maximum size of backlog (actually far higher)
+
/**
* \brief Accept an incoming connection
*/
-extern int accept(int sockfd, struct sockaddr *clientaddr, socklen_t addrlen);
+extern int accept(int sockfd, struct sockaddr *clientaddr, socklen_t *addrlen);
extern int recvfrom(int sockfd, void *buffer, size_t length, int flags, struct sockaddr *clientaddr, socklen_t *addrlen);
extern int recv(int sockfd, void *buffer, size_t length, int flags);
extern int getsockname(int socket, struct sockaddr *addr, socklen_t *addrlen);
extern int getpeername(int socket, struct sockaddr *addr, socklen_t *addrlen);
+extern struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type);
+extern void sethostent(int stayopen);
+extern void endhostent(void);
+extern void herror(const char *s);
+extern const char *hstrerror(int err);
+extern struct hostent *gethostent(void);
+
+#ifdef __cplusplus
+}
+#endif
+
#endif