24 #include <netinet/ip.h>
31 .bind_ip = INADDR_ANY,
41 #define SOCKET_BACKLOG 512
45 int socket_fd = socket(
50 if ( socket_fd == -1 ) {
56 if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt,
sizeof(opt)) == -1) {
57 log_perror(
"setsockopt() failed for reuseaddr");
60 if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEPORT, &opt,
sizeof(&opt)) == -1) {
61 log_perror(
"setsockopt() failed for reuseport");
64 struct sockaddr_in addr;
65 addr.sin_family = settings->
domain;
66 addr.sin_addr.s_addr = settings->
bind_ip;
67 addr.sin_port = htons(settings->
port);
69 if (bind(socket_fd, (
struct sockaddr*)&addr,
sizeof(addr)) == -1) {
85 int num_bytes = read(fd, buf, *buf_size);
87 *buf_size = num_bytes;
90 if (errno == EAGAIN) {
93 log_perror(
"Error reading from socket %d", fd);
100 int num_bytes = write(fd, buf, *buf_size);
102 if (num_bytes != *buf_size) {
103 log_warn(
"Didn't write the right number of bytes?");
105 *buf_size = num_bytes;
108 if (errno == EAGAIN) {
111 log_perror(
"Error writing to socket %d (rtn: %d, requested: %d)",
112 fd, num_bytes, *buf_size);
int write_socket(int fd, char *buf, int *buf_size)
#define WS_INCOMPLETE_READ
#define log_perror(fmt,...)
Logging of status messages to the terminal.
#define WS_INCOMPLETE_WRITE
int init_socket(struct sock_settings *settings)
static struct sock_settings ws_sock_settings
int read_socket(int fd, char *buf, int *buf_size)
struct sock_settings * webserver_sock_settings(int port)
#define log_warn(fmt,...)