All pastes #593518 Raw Edit

Anonymous

public text v1 · immutable
#593518 ·published 2007-06-28 11:29 UTC
rendered paste body
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>

#include "event.h"

#include "trace.h"

#include "mond.h"
#include "sock.h"

void sock_on_read(int fd, short event, void *data)
{
	struct sock_t *sock = (struct sock_t *)data;
	int len;
	char chr[1024];

	TRACE_ENTER

	len = read(sock->fd, &chr, 1024);

	if (sock->on_read)
	{
		sock->on_read(sock->data, len, chr);
		event_set(&sock->ev, sock->fd, EV_READ, sock_on_read, sock);
		sock->tv.tv_sec = 5;
		sock->tv.tv_usec = 0;
		event_add(&sock->ev, &sock->tv);
	}

	TRACE_LEAVE
}

void sock_on_connect(int fd, short event, void *data)
{
	struct sock_t *sock = (struct sock_t *)data;

	TRACE_ENTER

	if (event == EV_TIMEOUT)
	{
		if (sock->on_error) sock->on_error(sock->data, SOCK_CONNREF);
		TRACE_LEAVE
		return;
	}

	if (sock->on_connect) sock->on_connect(sock->data);

	if (sock->on_read)
	{
		event_set(&sock->ev, sock->fd, EV_READ, sock_on_read, sock);
		sock->tv.tv_sec = 5;
		sock->tv.tv_usec = 0;
		event_add(&sock->ev, &sock->tv);
	}

	TRACE_LEAVE
}

int sock_connect(struct sock_t *sock)
{
	struct sockaddr_in sin;
	int ce;
	char c[10];

	TRACE_ENTER

	DEBUG("connecting to %s:%d\n", sock->ip, sock->port);
	
	sock->fd = socket(AF_INET, SOCK_STREAM, 0);
	if (sock->fd == -1)
	{
		return -1;
	}
	
	sin.sin_port = htons(sock->port);
	if (inet_aton(sock->ip, &sin.sin_addr) != 1)
	{
		perror("inet_aton");
		exit(0);
	}

	DEBUG("ip %s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));

	sin.sin_family = AF_INET;

	fcntl(sock->fd, F_SETFL, O_NONBLOCK);

	event_set(&sock->ev, sock->fd, EV_READ, sock_on_connect, sock);
	sock->tv.tv_sec = 50;
	sock->tv.tv_usec = 0;
	event_add(&sock->ev, &sock->tv);
	
	ce = connect(sock->fd, (struct sockaddr *)&sin, sizeof(sin));
	if (ce == -1)
	{
		if (errno != EINPROGRESS)
		{
			// sads :(
			DEBUG("connect() failed: %d\n", errno);
			perror("connect");
			TRACE_LEAVE
			return -1;
		}
	}

	TRACE_LEAVE
}

int sock_write(struct sock_t *sock, char *data, int len)
{
	int ret;
	
	TRACE_ENTER;

	DEBUG("writing to %d the data:\n%s\n-------------\n", sock->fd, data);
	
	ret = write(sock->fd, data, len);

	DEBUG("writing to %d the data:\n%s\n-------------\n", sock->fd, data);
	
	TRACE_LEAVE;
	
	return ret;
}

void sock_free(struct sock_t *sock)
{
	TRACE_ENTER;
	{
		close(sock->fd);
		sock->fd = -1;
	}
	TRACE_LEAVE;
}