#include <assert.h>
+#include <dragonnet/peer.h>
+#include <dragonnet/recv.h>
+#include <dragonnet/recv_thread.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
-#include "peer.h"
-#include "recv_thread.h"
-
-const struct timeval dragonnet_timeout = {
- .tv_sec = 30,
- .tv_usec = 0
-};
-
static bool dragonnet_peer_init(DragonnetPeer *p, char *addr)
{
- p->mu = malloc(sizeof *p->mu);
- pthread_rwlock_init(p->mu, NULL);
- pthread_rwlock_wrlock(p->mu);
+ pthread_mutex_init(&p->mtx, NULL);
p->sock = socket(AF_INET6, SOCK_STREAM, 0);
p->raddr = dragonnet_addr_parse_str(addr);
-
- if (setsockopt(p->sock, SOL_SOCKET, SO_RCVTIMEO, &dragonnet_timeout,
- sizeof dragonnet_timeout) < 0) {
- perror("setsockopt");
- return false;
- }
-
- if (setsockopt(p->sock, SOL_SOCKET, SO_SNDTIMEO, &dragonnet_timeout,
- sizeof dragonnet_timeout) < 0) {
- perror("setsockopt");
- return false;
- }
+ p->on_disconnect = NULL;
+ p->on_recv = NULL;
+ p->on_recv_type = calloc(sizeof *p->on_recv_type, dragonnet_num_types);
struct sockaddr_in6 sock_addr = dragonnet_addr_sock(p->raddr);
if (connect(p->sock, (const struct sockaddr *) &sock_addr,
}
p->laddr = dragonnet_addr_parse_sock(sock_name);
-
- pthread_rwlock_unlock(p->mu);
return true;
}
{
DragonnetPeer *p = malloc(sizeof *p);
if (!dragonnet_peer_init(p, addr)) {
- dragonnet_peer_delete(p);
+ pthread_mutex_destroy(&p->mtx);
+ free(p);
return NULL;
}
void dragonnet_peer_run(DragonnetPeer *p)
{
- pthread_t recv_thread;
- pthread_create(&recv_thread, NULL, &dragonnet_peer_recv_thread, p);
- pthread_join(recv_thread, NULL);
-}
-
-void dragonnet_peer_close(DragonnetPeer *p)
-{
- pthread_rwlock_wrlock(p->mu);
-
- if (p->state == DRAGONNET_PEER_ACTIVE) {
- shutdown(p->sock, SHUT_RDWR);
- p->state++;
- }
-
- pthread_rwlock_unlock(p->mu);
+ pthread_create(&p->recv_thread, NULL, &dragonnet_peer_recv_thread, p);
}
-void dragonnet_peer_delete(DragonnetPeer *p)
+void dragonnet_peer_shutdown(DragonnetPeer *p)
{
- pthread_rwlock_destroy(p->mu);
- free(p);
+ shutdown(p->sock, SHUT_RDWR);
}