#include "includes.h"

bool contcp_connect(net_ctx_t *ctx)
{
	struct hostent *host;
	struct sockaddr_in sin;

	if(!ctx) return false;

	host = gethostbyname(ctx->host);
	if(!host) return false;
	ctx->sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(ctx->sock == -1) return false;

	sin.sin_family      = AF_INET;
	sin.sin_addr.s_addr = ((struct in_addr *)host->h_addr)->s_addr;
	sin.sin_port        = htons(ctx->port);

	puts(ctx->host);
	if(connect(ctx->sock, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
		close(ctx->sock);
		return false;
	}

	if(ctx->flags & NET_SSL) {
		ctx->ssl_ctx = SSL_CTX_new(SSLv23_client_method());
		if(!ctx->ssl_ctx) {
			close(ctx->sock);
			return false;
		}
		ctx->ssl = SSL_new(ctx->ssl_ctx);
		if(!ctx->ssl) {
			SSL_CTX_free(ctx->ssl_ctx);
			close(ctx->sock);
			return false;
		}
		SSL_set_fd(ctx->ssl, ctx->sock);
		if(SSL_connect(ctx->ssl) != 1) {
			SSL_free(ctx->ssl);
			SSL_CTX_free(ctx->ssl_ctx);
			close(ctx->sock);
		}
	}

	return true;
}

void contcp_close(net_ctx_t *ctx)
{
	if(ctx->flags & NET_SSL) {
		SSL_shutdown(ctx->ssl);
		SSL_free(ctx->ssl);
		SSL_CTX_free(ctx->ssl_ctx);
	}
	close(ctx->sock);
}

int nsend(net_ctx_t *ctx, char *buf, int len)
{
	int ret;

	if(ctx->flags & NET_SSL)
		ret = SSL_write(ctx->ssl, buf, len);
	else ret = send(ctx->sock, buf, len, 0);

	return ret;
}

int nrecv(net_ctx_t *ctx, char *buf, int len)
{
	int ret;

	if(ctx->flags & NET_SSL)
		ret = SSL_read(ctx->ssl, buf, len);
	else ret = recv(ctx->sock, buf, len, 0);

	return ret;
}
