forked from flash/temporary-satori-hole
105 lines
2.4 KiB
C
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;
|
|
}
|