aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/net.c')
-rw-r--r--src/net.c315
1 files changed, 157 insertions, 158 deletions
diff --git a/src/net.c b/src/net.c
index da23747..9ca6d05 100644
--- a/src/net.c
+++ b/src/net.c
@@ -22,234 +22,233 @@
#define gai_log_errno(ec) log_err("getaddrinfo: %s\n", gai_strerror(ec))
int net_bind(const char* port) {
- static const int flags = SOCK_CLOEXEC;
- struct addrinfo *result = NULL, *it = NULL;
- struct addrinfo hints;
- int socket_fd = -1, ret = 0;
+ static const int flags = SOCK_CLOEXEC;
+ struct addrinfo *result = NULL, *it = NULL;
+ struct addrinfo hints;
+ int socket_fd = -1, ret = 0;
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_INET6;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_PASSIVE;
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_INET6;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_PASSIVE;
- ret = getaddrinfo(NULL, port, &hints, &result);
- if (ret) {
- gai_log_errno(ret);
- return -1;
- }
+ ret = getaddrinfo(NULL, port, &hints, &result);
+ if (ret) {
+ gai_log_errno(ret);
+ return -1;
+ }
- for (it = result; it; it = it->ai_next) {
- socket_fd = socket(it->ai_family, it->ai_socktype | flags, it->ai_protocol);
- if (socket_fd < 0) {
- log_errno("socket");
- continue;
- }
+ for (it = result; it; it = it->ai_next) {
+ socket_fd = socket(it->ai_family, it->ai_socktype | flags, it->ai_protocol);
+ if (socket_fd < 0) {
+ log_errno("socket");
+ continue;
+ }
- static const int yes = 1;
- static const int no = 0;
+ static const int yes = 1;
+ static const int no = 0;
- if (it->ai_family == AF_INET6) {
- if (setsockopt(socket_fd, IPPROTO_IPV6, IPV6_V6ONLY, &no, sizeof(no)) < 0) {
- log_errno("setsockopt");
- goto close_socket;
- }
- }
+ if (it->ai_family == AF_INET6) {
+ if (setsockopt(socket_fd, IPPROTO_IPV6, IPV6_V6ONLY, &no, sizeof(no)) < 0) {
+ log_errno("setsockopt");
+ goto close_socket;
+ }
+ }
- if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0) {
- log_errno("setsockopt");
- goto close_socket;
- }
+ if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0) {
+ log_errno("setsockopt");
+ goto close_socket;
+ }
- if (bind(socket_fd, it->ai_addr, it->ai_addrlen) < 0) {
- log_errno("bind");
- goto close_socket;
- }
+ if (bind(socket_fd, it->ai_addr, it->ai_addrlen) < 0) {
+ log_errno("bind");
+ goto close_socket;
+ }
- break;
+ break;
- close_socket:
- net_close(socket_fd);
- }
+ close_socket:
+ net_close(socket_fd);
+ }
- freeaddrinfo(result);
+ freeaddrinfo(result);
- if (!it) {
- log_err("Couldn't bind to port %s\n", port);
- return -1;
- }
+ if (!it) {
+ log_err("Couldn't bind to port %s\n", port);
+ return -1;
+ }
- ret = listen(socket_fd, 4096);
- if (ret < 0) {
- log_errno("listen");
- goto fail;
- }
+ ret = listen(socket_fd, 4096);
+ if (ret < 0) {
+ log_errno("listen");
+ goto fail;
+ }
- return socket_fd;
+ return socket_fd;
fail:
- net_close(socket_fd);
+ net_close(socket_fd);
- return ret;
+ return ret;
}
int net_accept(int fd) {
- static const int flags = SOCK_CLOEXEC;
- int ret = 0;
+ static const int flags = SOCK_CLOEXEC;
+ int ret = 0;
- ret = accept4(fd, NULL, NULL, flags);
- if (ret < 0) {
- log_errno("accept4");
- return ret;
- }
+ ret = accept4(fd, NULL, NULL, flags);
+ if (ret < 0) {
+ log_errno("accept4");
+ return ret;
+ }
- return ret;
+ return ret;
}
int net_connect(const char* host, const char* port) {
- static const int flags = SOCK_CLOEXEC;
- struct addrinfo *result = NULL, *it = NULL;
- struct addrinfo hints;
- int socket_fd = -1, ret = 0;
+ static const int flags = SOCK_CLOEXEC;
+ struct addrinfo *result = NULL, *it = NULL;
+ struct addrinfo hints;
+ int socket_fd = -1, ret = 0;
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_STREAM;
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
- ret = getaddrinfo(host, port, &hints, &result);
- if (ret) {
- gai_log_errno(ret);
- return -1;
- }
+ ret = getaddrinfo(host, port, &hints, &result);
+ if (ret) {
+ gai_log_errno(ret);
+ return -1;
+ }
- for (it = result; it; it = it->ai_next) {
- socket_fd = socket(it->ai_family, it->ai_socktype | flags, it->ai_protocol);
- if (socket_fd < 0) {
- log_errno("socket");
- continue;
- }
+ for (it = result; it; it = it->ai_next) {
+ socket_fd = socket(it->ai_family, it->ai_socktype | flags, it->ai_protocol);
+ if (socket_fd < 0) {
+ log_errno("socket");
+ continue;
+ }
- if (connect(socket_fd, it->ai_addr, it->ai_addrlen) < 0) {
- log_errno("connect");
- goto close_socket;
- }
+ if (connect(socket_fd, it->ai_addr, it->ai_addrlen) < 0) {
+ log_errno("connect");
+ goto close_socket;
+ }
- break;
+ break;
- close_socket:
- net_close(socket_fd);
- }
+ close_socket:
+ net_close(socket_fd);
+ }
- freeaddrinfo(result);
+ freeaddrinfo(result);
- if (!it) {
- log_err("Couldn't connect to host %s, port %s\n", host, port);
- return -1;
- }
+ if (!it) {
+ log_err("Couldn't connect to host %s, port %s\n", host, port);
+ return -1;
+ }
- return socket_fd;
+ return socket_fd;
}
void net_close(int fd) {
- file_close(fd);
+ file_close(fd);
}
static ssize_t net_send_part(int fd, const void* buf, size_t size) {
- static const int flags = MSG_NOSIGNAL;
+ static const int flags = MSG_NOSIGNAL;
- ssize_t ret = send(fd, buf, size, flags);
- if (ret < 0) {
- log_errno("send");
- return -1;
- }
+ ssize_t ret = send(fd, buf, size, flags);
+ if (ret < 0) {
+ log_errno("send");
+ return -1;
+ }
- return ret;
+ return ret;
}
int net_send(int fd, const void* buf, size_t size) {
- size_t sent_total = 0;
+ size_t sent_total = 0;
- while (sent_total < size) {
- ssize_t sent_now =
- net_send_part(fd, (const char*)buf + sent_total, size - sent_total);
- if (sent_now < 0)
- return -1;
- sent_total += sent_now;
- }
+ while (sent_total < size) {
+ ssize_t sent_now = net_send_part(fd, (const char*)buf + sent_total, size - sent_total);
+ if (sent_now < 0)
+ return -1;
+ sent_total += sent_now;
+ }
- return 0;
+ return 0;
}
int net_recv(int fd, void* buf, size_t size) {
- ssize_t read_total = 0;
+ ssize_t read_total = 0;
- while ((size_t)read_total < size) {
- ssize_t read_now = read(fd, (unsigned char*)buf + read_total, size - read_total);
- if (!read_now)
- break;
+ while ((size_t)read_total < size) {
+ ssize_t read_now = read(fd, (unsigned char*)buf + read_total, size - read_total);
+ if (!read_now)
+ break;
- if (read_now < 0) {
- log_errno("read");
- return -1;
- }
+ if (read_now < 0) {
+ log_errno("read");
+ return -1;
+ }
- read_total += read_now;
- }
+ read_total += read_now;
+ }
- if ((size_t)read_total < size) {
- log_err("Received only %zd bytes out of %zu\n", read_total, size);
- return -1;
- }
+ if ((size_t)read_total < size) {
+ log_err("Received only %zd bytes out of %zu\n", read_total, size);
+ return -1;
+ }
- return 0;
+ return 0;
}
int net_send_buf(int fd, const struct buf* buf) {
- int ret = 0;
+ int ret = 0;
- uint32_t size = htonl(buf_get_size(buf));
- ret = net_send(fd, &size, sizeof(size));
- if (ret < 0)
- return ret;
+ uint32_t size = htonl(buf_get_size(buf));
+ ret = net_send(fd, &size, sizeof(size));
+ if (ret < 0)
+ return ret;
- ret = net_send(fd, buf_get_data(buf), buf_get_size(buf));
- if (ret < 0)
- return ret;
+ ret = net_send(fd, buf_get_data(buf), buf_get_size(buf));
+ if (ret < 0)
+ return ret;
- return ret;
+ return ret;
}
int net_recv_buf(int fd, struct buf** buf) {
- uint32_t size = 0;
- int ret = 0;
+ uint32_t size = 0;
+ int ret = 0;
- ret = net_recv(fd, &size, sizeof(size));
- if (ret < 0) {
- log_err("Couldn't read buffer size\n");
- goto fail;
- }
- size = ntohl(size);
+ ret = net_recv(fd, &size, sizeof(size));
+ if (ret < 0) {
+ log_err("Couldn't read buffer size\n");
+ goto fail;
+ }
+ size = ntohl(size);
- void* data = malloc(size);
- if (!data) {
- log_errno("malloc");
- goto fail;
- }
+ void* data = malloc(size);
+ if (!data) {
+ log_errno("malloc");
+ goto fail;
+ }
- ret = net_recv(fd, data, size);
- if (ret < 0) {
- log_err("Couldn't read buffer\n");
- goto free_data;
- }
+ ret = net_recv(fd, data, size);
+ if (ret < 0) {
+ log_err("Couldn't read buffer\n");
+ goto free_data;
+ }
- ret = buf_create(buf, data, size);
- if (ret < 0)
- goto free_data;
+ ret = buf_create(buf, data, size);
+ if (ret < 0)
+ goto free_data;
- return ret;
+ return ret;
free_data:
- free(data);
+ free(data);
fail:
- return -1;
+ return -1;
}