...
authoralex <[email protected]>
Sun, 27 Mar 2022 00:24:16 +0000 (17:24 -0700)
committeralex <[email protected]>
Sun, 27 Mar 2022 00:24:16 +0000 (17:24 -0700)
Makefile.am
inc/net.h
inc/peer.h
src/net/cache.c
src/net/handler.c
src/net/loop.c
src/net/queue.c
src/net/send.c
src/peer/handshake.c
src/session.c

index b50172e00cb8da8a5c31b1a713f71de0a108f4a2..5c01a311cb5152bc1766785bc8d9b50cbb1bf00f 100644 (file)
@@ -37,10 +37,13 @@ seederd_SOURCES = \
        src/net/handler.c \
        src/net/listen.c \
        src/net/loop.c \
+       src/net/queue.c \
+       src/net/send.c \
        src/net/setup.c \
        src/net/start.c \
        src/net/tcp.c \
        src/net/udp.c \
+       src/net/wait.c \
        src/opt/config.c \
        src/opt/env.c \
        src/opt/feed.c \
@@ -53,6 +56,7 @@ seederd_SOURCES = \
        src/opt/watch.c \
        src/opt/worker.c \
        src/peer/free.c \
+       src/peer/handshake.c \
        src/peer/init.c \
        src/pqueue.c \
        src/rss/entry.c \
index a3e67fe6b462186e5074304de098e0d6263787a6..9cd57dec8e78ba7dd4f9fa7e2c9381bacffa113c 100644 (file)
--- a/inc/net.h
+++ b/inc/net.h
@@ -4,6 +4,7 @@
 #include<opt.h>
 #include<peer.h>
 
+#include<errno.h>
 #include<fcntl.h>
 #include<netdb.h>
 #include<stdio.h>
@@ -35,14 +36,16 @@ struct net_info {
        hints.ai_next = NULL; \
 }
 
+int net_cache(void**,size_t*,void*,size_t);
 void net_handler(int,int,struct peer*);
 int net_listen_sock();
 void net_loop();
-int net_queue(int,struct peer*,void*,size_t);
+int net_queue(int,int,struct peer*);
+int net_send(int,struct peer*,void*,size_t);
 int net_setup(struct net_info*);
 int net_start();
 int net_tcp();
 int net_udp();
-int net_wait(int,struct peer*,size_t);
+int net_wait(int,struct peer*,void*,size_t);
 
 #endif
index f70f891cc48de9d954f87a4ed2cccde1cfd9ae7e..df2a21fde68325335bd709dccfe94c97f4e86a21 100644 (file)
@@ -4,6 +4,12 @@
 #define PEER_INFOHASH_SIZE 20
 #define PEER_PEER_ID_SIZE 20
 
+#include<assert.h>
+#include<stddef.h>
+#include<stdint.h>
+#include<stdlib.h>
+#include<string.h>
+
 struct peer {
        unsigned int handshake : 1;
        unsigned int choked : 1;
@@ -35,6 +41,9 @@ enum peer_message {
        PEER_MESSAGE_HASH_REJECT = 23
 };
 
+#include<net.h>
+#include<session.h>
+
 void peer_free(struct peer*);
 int peer_handshake(int,struct peer*);
 int peer_init(struct peer**);
index 875009c646ef55049de1851a26965d003b23a23e..8cb0528490b8d54961ed36fbec7091f85602ee10 100644 (file)
@@ -10,7 +10,7 @@ int net_cache(void **prev, size_t *prev_size, void *p, size_t size) {
 
        if((*prev)!=NULL) {
                memcpy(next,(*prev),(*prev_size));
-               memcpy(&(next[(*prev_size)]),p,size);
+               memcpy(&(((uint8_t*)next)[(*prev_size)]),p,size);
                free((*prev));
        }
 
index 10f1ca281260d0719a9c37b086addef093989e3e..15c98cab0fef4fe671848a785fbf3b631cb3d004 100644 (file)
@@ -1,10 +1,11 @@
 #include<net.h>
 
-static ssize_t net_expected_length(int);
-static void send_remaining(int,struct peer*);
+static uint32_t net_expected_length(int);
+static int send_remaining(int,struct peer*);
 
-static ssize_t net_expected_length(int sock) {
+static uint32_t net_expected_length(int sock) {
        unsigned char buf[4];
+       uint32_t len;
        ssize_t i;
        
        i = recv(sock,buf,4,MSG_PEEK);
@@ -28,19 +29,17 @@ static ssize_t net_expected_length(int sock) {
         */
        if(i<4) { return 0; }
 
-       i = 0;
+       len = 0;
        for(size_t j=0;j<4;j++) {
-               i <<= 1;
-               i += buf[j];
+               len <<= 1;
+               len += buf[j];
        }
 
        return i;
 }
 
-void net_handler(int epoll_fd, int sock, struct peer *peer_info) {
-       struct epoll_event ev;
-       ssize_t i;
-       unsigned int len;
+void net_handler(int epoll_fd, int sock, struct peer *info) {
+       uint32_t i;
 
        if(info->out!=NULL) { goto remaining; }
 
@@ -49,7 +48,7 @@ void net_handler(int epoll_fd, int sock, struct peer *peer_info) {
        if((i = net_expected_length(sock))<0) { goto close; }
        if(0==i) { goto queue; } // message of length 0 == keep-alive
 
-       switch(buf[4]) {
+       switch(0) {
                case PEER_MESSAGE_CHOKE:
                        break;
                case PEER_MESSAGE_UNCHOKE:
@@ -82,22 +81,22 @@ void net_handler(int epoll_fd, int sock, struct peer *peer_info) {
 
        return;
 remaining:
-       if(send_remaining(sock,peer_info)<0) { goto close; }
+       if(send_remaining(sock,info)<0) { goto close; }
        goto queue;
 handshake:
-       if(peer_handshake(sock,peer_info)<0) { goto close; }
+       if(peer_handshake(sock,info)<0) { goto close; }
        goto queue;
 queue:
-       if(net_queue(sock,info,NULL,0)<0) { goto close; }
+       if(net_queue(epoll_fd,sock,info)<0) { goto close; }
        return;
 close:
-       peer_free(peer_info);
+       peer_free(info);
        close(sock);
        return;
 }
 
 static int send_remaining(int sock, struct peer *info) {
-       if(net_send(sock,peer_info->out,peer_info->out_size)<0) { return -1; }
+       if(net_send(sock,info,info->out,info->out_size)<0) { return -1; }
 
        free(info->out);
        info->out = NULL;
index 59c60549d7e5b97a055b0e31bd6eb36b432e245e..f230b909ca0d5d0fda98708f5cb5e72b4efa8081 100644 (file)
@@ -34,7 +34,7 @@ static void net_await_epoll_event(struct net_info *info) {
                        ev.events = EPOLLIN | EPOLLET;
                        ev.data.fd = conn_sock;
 
-                       if(peer_init((struct peer*)&(ev.data.ptr))<0) {
+                       if(peer_init((struct peer**)ev.data.ptr)<0) {
                               return;
                        }
 
index ba47dfda0524b3a5b21939a1c1445181432fdafb..eafc7ece9c0f78ba623d734438b2b666cdab7fc9 100644 (file)
@@ -1,15 +1,8 @@
 #include<net.h>
 
-int net_queue(int sock, struct peer *info, void *p, size_t size) {
+int net_queue(int epoll_fd, int sock, struct peer *info) {
        struct epoll_event ev;
 
-       if((p!=NULL)&&(size>0)) {
-               info->data = malloc(size);
-               if(NULL==info->data) { return -1; }
-
-               memcpy(info->data,p,size);
-       }
-       
        ev.events = EPOLLIN | EPOLLOUT | EPOLLET;
        ev.data.ptr = info;
        ev.data.fd = sock;
index e878ff1bb3b15949cec522d2c756151e27f11d3e..f73c23c7a6c5c8ae0d5be4e55f38f8c63cb6a323 100644 (file)
@@ -1,7 +1,6 @@
 #include<net.h>
 
 int net_send(int sock, struct peer *info, void *p, size_t size) {
-       void *next;
        ssize_t i;
 
        i = send(sock,p,size,0);
@@ -9,11 +8,13 @@ int net_send(int sock, struct peer *info, void *p, size_t size) {
 
        return 1;
 cache:
-       if(net_cache(
-               &(info->out), /* void **prev */
-               &(info->out_size), /* size_t *prev_size */
-               &(p[i]), /* void *p */
-               (size-i) /* size_t size */
-               )<0) { return -1; }
+       if(p!=info->out) {
+               if(net_cache(
+                       &(info->out), /* void **prev */
+                       &(info->out_size), /* size_t *prev_size */
+                       &(((unsigned char*)p)[i]), /* void *p */
+                       (size-i) /* size_t size */
+                       )<0) { return -1; }
+       }
        return 0;
 }
index 8f79351e038389400ff07831b5e731aff3751b00..73967bcdcf02a8738e1c01244eb7922a2a17eae8 100644 (file)
@@ -5,15 +5,14 @@
 
 #define HEADER_LENGTH HANDSHAKE_STRING_LENGTH+PEER_INFOHASH_SIZE+PEER_PEER_ID_SIZE
 
-static int peer_handshake_receive(int);
+static int peer_handshake_receive(int,struct peer*);
 
 int peer_handshake(int sock, struct peer *info) {
        char header[HEADER_LENGTH] = HANDSHAKE_STRING;
-       int i;
        
        if(sock<0) { return -1; }
 
-       if(peer_handshake_receive(sock)<0) { return -1; }
+       if(peer_handshake_receive(sock,info)<0) { return -1; }
        if(!info->handshake) { return 0; }
 
        // copy infohash to buffer
@@ -36,9 +35,12 @@ int peer_handshake(int sock, struct peer *info) {
 static int peer_handshake_receive(int sock, struct peer *info) {
        char header[HEADER_LENGTH];
        struct torrent *p;
-       ssize_t i;
+       int i;
 
-       if(net_wait(sock,info,header,HEADER_LENGTH)<0) { return -1; }
+       if((i = net_wait(sock,info,header,HEADER_LENGTH))<=0) {
+               if(i<0) { return -1; }
+               return 0;
+       }
 
        memcpy(
                info->infohash,
@@ -52,8 +54,7 @@ static int peer_handshake_receive(int sock, struct peer *info) {
        p = session_find_torrent(info->infohash,PEER_INFOHASH_SIZE);
        if(NULL==p) { return -1; }
 
+       info->handshake = 1;
+
        return 1;
-wait:
-       if(net_wait(sock,info,header,i)<0) { return -1; }
-       return 0;
 }
index 1a2f2ea9ba2c89cd75005838bd8f23011ff76087..3f5c1af0f5b84bb773e9cdc6c3855924e605b5f0 100644 (file)
@@ -14,6 +14,10 @@ void session_clean() {
        hashmap_free(session.torrents.paths);
 }
 
+struct torrent *session_find_torrent(uint8_t *infohash, size_t size) {
+       return NULL;
+}
+
 #define SESSION_HASHMAP_INITIAL_SIZE 8
 
 int session_init() {