temporary-satori-hole/src/sock/sock_common.c
2023-12-27 01:35:22 +01:00

105 lines
2.4 KiB
C

#include "sock.h"
sat_sock_ptr sat_sock_alloc(void) {
sat_sock_ptr ctx = malloc(sizeof(sat_sock));
memset(ctx, 0, sizeof(sat_sock));
return ctx;
}
void sat_sock_free(sat_sock_ptr ctx) {
if(ctx == NULL) return;
free(ctx);
}
int sat_sock_connect(sat_sock_ptr ctx, int addrFamily, int sockType, char *host, char *port) {
struct addrinfo hints;
memset(&hints, 0, sizeof hints);
hints.ai_family = addrFamily;
hints.ai_socktype = sockType;
struct addrinfo *servInfo;
int err = getaddrinfo(host, port, &hints, &servInfo);
if(err) {
fprintf(stderr, "getaddrinfo(): %s\r\n", gai_strerror(err));
return err;
}
int sock = -1;
struct addrinfo *p;
for(p = servInfo; p != NULL; p = p->ai_next) {
if((sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
perror("socket():");
continue;
}
if(connect(sock, p->ai_addr, p->ai_addrlen) == -1) {
close(sock);
perror("connect():");
sock = -1;
continue;
}
break;
}
freeaddrinfo(servInfo);
if(sock != -1)
ctx->sock = sock;
return sock;
}
int sat_sock_connect_tcp(sat_sock_ptr ctx, char *host, char *port) {
return sat_sock_connect(ctx, AF_UNSPEC, SOCK_STREAM, host, port);
}
void sat_sock_close(sat_sock_ptr ctx) {
if(ctx->sock != -1) {
close(ctx->sock);
}
}
int sat_sock_recv(sat_sock_ptr ctx, uint8_t *buffer, size_t size) {
return recv(ctx->sock, buffer, size, 0);
}
int sat_sock_send(sat_sock_ptr ctx, uint8_t *buffer, size_t count) {
return send(ctx->sock, (char*)buffer, count, 0);
}
bool sat_sock_get_blocking(sat_sock_ptr ctx) {
return (fcntl(ctx->sock, F_GETFL) & O_NONBLOCK) > 0;
}
void sat_sock_set_blocking(sat_sock_ptr ctx, bool blocking) {
int flags = fcntl(ctx->sock, F_GETFL);
if(blocking)
flags |= O_NONBLOCK;
else
flags &= ~O_NONBLOCK;
fcntl(ctx->sock, F_SETFL, flags);
}
int sat_sock_select(sat_sock_ptr ctx, int timeout) {
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(ctx->sock, &rfds);
struct timeval tv;
tv.tv_sec = timeout;
tv.tv_usec = 0;
int state = select(ctx->sock + 1, &rfds, NULL, NULL, &tv);
if(state == -1 || state == 0)
return state;
if(!FD_ISSET(ctx->sock, &rfds))
return -2;
return state;
}