Compare commits

..

3 Commits

Author SHA1 Message Date
seajee
28f4011780 v1.7.5 2026-01-09 21:16:05 +01:00
seajee
077bd91f98 v1.7.4 Ignore signals in send and sendto 2025-12-13 16:12:56 +01:00
seajee
8c0ccb628e Fix formatting 2025-11-10 17:55:10 +01:00

23
sock.h
View File

@@ -4,7 +4,7 @@
# @@@@@@ # # @@@@@@ #
# @ @ # # @ @ #
# @====@ # # @====@ #
# @ @ sock.h - v1.7.3 # # @ @ sock.h - v1.7.5 #
# @ @ MIT License # # @ @ MIT License #
# @@% .@ @ # # @@% .@ @ #
# @@ @ @ https://github.com/seajee/sock.h # # @@ @ @ https://github.com/seajee/sock.h #
@@ -214,10 +214,10 @@ typedef enum {
} SockType; } SockType;
typedef struct { typedef struct {
SockType type; // Socket type SockType type; // Socket type
SockAddr addr; // Socket address SockAddr addr; // Socket address
int fd; // File descriptor int fd; // File descriptor
int last_errno; // Last error about this socket int last_errno; // Last error about this socket
} Sock; } Sock;
typedef void (*SockThreadCallback)(Sock *sock, void *user_data); typedef void (*SockThreadCallback)(Sock *sock, void *user_data);
@@ -375,6 +375,7 @@ SockAddrList sock_dns(const char *addr, int port, SockAddrType addr_hint, SockTy
struct addrinfo *res; struct addrinfo *res;
if (getaddrinfo(addr, service, &hints, &res) != 0) { if (getaddrinfo(addr, service, &hints, &res) != 0) {
sock_addr_list_free(&list);
return list; return list;
} }
@@ -514,7 +515,7 @@ bool sock_async_accept(Sock *sock, SockThreadCallback fn, void *user_data)
if (sock->type != SOCK_TCP) { if (sock->type != SOCK_TCP) {
sock->last_errno = EINVAL; sock->last_errno = EINVAL;
return NULL; return false;
} }
Sock *client = sock_accept(sock); Sock *client = sock_accept(sock);
@@ -555,7 +556,7 @@ bool sock_connect(Sock *sock, SockAddr addr)
if (sock->type != SOCK_TCP) { if (sock->type != SOCK_TCP) {
sock->last_errno = EINVAL; sock->last_errno = EINVAL;
return NULL; return false;
} }
if (connect(sock->fd, &addr.sockaddr, addr.len) < 0) { if (connect(sock->fd, &addr.sockaddr, addr.len) < 0) {
@@ -578,7 +579,7 @@ ssize_t sock_send(Sock *sock, const void *buf, size_t size)
} }
while (true) { while (true) {
ssize_t n = send(sock->fd, buf, size, 0); ssize_t n = send(sock->fd, buf, size, MSG_NOSIGNAL);
if (n < 0) { if (n < 0) {
if (errno == EINTR) { if (errno == EINTR) {
continue; continue;
@@ -677,7 +678,8 @@ ssize_t sock_sendto(Sock *sock, const void *buf, size_t size, SockAddr addr)
} }
while (true) { while (true) {
ssize_t n = sendto(sock->fd, buf, size, 0, &addr.sockaddr, addr.len); ssize_t n = sendto(sock->fd, buf, size, MSG_NOSIGNAL, &addr.sockaddr,
addr.len);
if (n < 0) { if (n < 0) {
if (errno == EINTR) { if (errno == EINTR) {
continue; continue;
@@ -820,6 +822,9 @@ void sock__convert_addr(SockAddr *addr)
/* /*
Revision history: Revision history:
1.7.5 (2025-12-13) Return false instead of NULL when returning a bool;
Fixed memory leak in sock_dns()
1.7.4 (2025-12-13) Ignore signals in send and sendto
1.7.3 (2025-09-20) Changed sock_send_all() signature; drain buffers on 1.7.3 (2025-09-20) Changed sock_send_all() signature; drain buffers on
sock_close() to prevent data loss sock_close() to prevent data loss
1.7.2 (2025-09-17) New functions sock_recv_all() and sock_send_all(); 1.7.2 (2025-09-17) New functions sock_recv_all() and sock_send_all();