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;
}