From 5bb5f9f8605072ff9f68723a8fd4887d709ce37f Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Wed, 9 Nov 2022 11:13:17 +0300 Subject: [PATCH] Autoformat code --- dht-bootstrap.c | 779 +++++++++++++++++++++++++++--------------------- 1 file changed, 432 insertions(+), 347 deletions(-) diff --git a/dht-bootstrap.c b/dht-bootstrap.c index 9a43670..a4fe67e 100644 --- a/dht-bootstrap.c +++ b/dht-bootstrap.c @@ -23,22 +23,20 @@ THE SOFTWARE. /* For memmem. */ #define _GNU_SOURCE +#include +#include +#include +#include +#include +#include #include #include -#include #include -#include -#include -#include -#include -#include -#include -#include #include -#include +#include #include -#include -#include +#include +#include #ifndef HAVE_MEMMEM #ifdef __GLIBC__ @@ -59,36 +57,58 @@ THE SOFTWARE. /* nothing */ #elif defined(__GNUC__) #define inline __inline -#if (__GNUC__ >= 3) +#if (__GNUC__ >= 3) #define restrict __restrict #else #define restrict /**/ #endif #else -#define inline /**/ +#define inline /**/ #define restrict /**/ #endif #define MAX(x, y) ((x) >= (y) ? (x) : (y)) #define MIN(x, y) ((x) <= (y) ? (x) : (y)) -static int send_ping(struct sockaddr *sa, int salen, - const unsigned char *tid, int tid_len); -static int send_pong(struct sockaddr *sa, int salen, - const unsigned char *tid, int tid_len); -static int send_find_node(struct sockaddr *sa, int salen, - const unsigned char *tid, int tid_len, - const unsigned char *target, int want, int confirm); -static int send_nodes(struct sockaddr *sa, int salen, - const unsigned char *tid, int tid_len, - const unsigned char *nodes, int nodes_len, - const unsigned char *nodes6, int nodes6_len); -static int send_random_nodes(struct sockaddr *sa, int salen, - const unsigned char *tid, int tid_len, - const unsigned char *id, int want); -static int send_error(struct sockaddr *sa, int salen, - unsigned char *tid, int tid_len, - int code, const char *message); +static int +send_ping(struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len); +static int +send_pong(struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len); +static int +send_find_node( + struct sockaddr *sa, + int salen, + const unsigned char *tid, + int tid_len, + const unsigned char *target, + int want, + int confirm); +static int +send_nodes( + struct sockaddr *sa, + int salen, + const unsigned char *tid, + int tid_len, + const unsigned char *nodes, + int nodes_len, + const unsigned char *nodes6, + int nodes6_len); +static int +send_random_nodes( + struct sockaddr *sa, + int salen, + const unsigned char *tid, + int tid_len, + const unsigned char *id, + int want); +static int +send_error( + struct sockaddr *sa, + int salen, + unsigned char *tid, + int tid_len, + int code, + const char *message); #define ERROR 0 #define REPLY 1 @@ -100,23 +120,31 @@ static int send_error(struct sockaddr *sa, int salen, #define WANT4 1 #define WANT6 2 -static int parse_message(const unsigned char *buf, int buflen, - unsigned char *tid_return, int *tid_len, - unsigned char *id_return, - unsigned char *info_hash_return, - unsigned char *target_return, - unsigned short *port_return, - unsigned char *token_return, int *token_len, - unsigned char *nodes_return, int *nodes_len, - unsigned char *nodes6_return, int *nodes6_len, - unsigned char *values_return, int *values_len, - unsigned char *values6_return, int *values6_len, - int *want_return); +static int +parse_message( + const unsigned char *buf, + int buflen, + unsigned char *tid_return, + int *tid_len, + unsigned char *id_return, + unsigned char *info_hash_return, + unsigned char *target_return, + unsigned short *port_return, + unsigned char *token_return, + int *token_len, + unsigned char *nodes_return, + int *nodes_len, + unsigned char *nodes6_return, + int *nodes6_len, + unsigned char *values_return, + int *values_len, + unsigned char *values6_return, + int *values6_len, + int *want_return); static const unsigned char zeroes[20] = {0}; -static const unsigned char v4prefix[16] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 -}; +static const unsigned char v4prefix[16] = + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0}; static unsigned char myid[20]; static int have_v = 0; @@ -130,7 +158,7 @@ struct node { struct sockaddr_storage ss; socklen_t sslen; }; - + #define CIRCULAR_LIST_SIZE 256 struct circular_list { @@ -148,14 +176,14 @@ static int token_bucket_tokens; FILE *dht_debug = NULL; #ifdef __GNUC__ - __attribute__ ((format (printf, 1, 2))) +__attribute__((format(printf, 1, 2))) #endif static void debugf(const char *format, ...) { va_list args; va_start(args, format); - if(dht_debug) + if (dht_debug) vfprintf(dht_debug, format, args); va_end(args); fflush(dht_debug); @@ -164,24 +192,21 @@ debugf(const char *format, ...) static int is_martian(struct sockaddr *sa) { - switch(sa->sa_family) { + switch (sa->sa_family) { case AF_INET: { - struct sockaddr_in *sin = (struct sockaddr_in*)sa; - const unsigned char *address = (const unsigned char*)&sin->sin_addr; - return sin->sin_port == 0 || - (address[0] == 0) || - (address[0] == 127) || - ((address[0] & 0xE0) == 0xE0); + struct sockaddr_in *sin = (struct sockaddr_in *)sa; + const unsigned char *address = (const unsigned char *)&sin->sin_addr; + return sin->sin_port == 0 || (address[0] == 0) || (address[0] == 127) || + ((address[0] & 0xE0) == 0xE0); } case AF_INET6: { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)sa; - const unsigned char *address = (const unsigned char*)&sin6->sin6_addr; - return sin6->sin6_port == 0 || - (address[0] == 0xFF) || - (address[0] == 0xFE && (address[1] & 0xC0) == 0x80) || - (memcmp(address, zeroes, 15) == 0 && - (address[15] == 0 || address[15] == 1)) || - (memcmp(address, v4prefix, 12) == 0); + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; + const unsigned char *address = (const unsigned char *)&sin6->sin6_addr; + return sin6->sin6_port == 0 || (address[0] == 0xFF) || + (address[0] == 0xFE && (address[1] & 0xC0) == 0x80) || + (memcmp(address, zeroes, 15) == 0 && + (address[15] == 0 || address[15] == 1)) || + (memcmp(address, v4prefix, 12) == 0); } default: @@ -212,11 +237,10 @@ make_tid(unsigned char *tid_return, const char *prefix, unsigned short seqno) } static int -tid_match(const unsigned char *tid, const char *prefix, - unsigned short *seqno_return) +tid_match(const unsigned char *tid, const char *prefix, unsigned short *seqno_return) { - if(tid[0] == (prefix[0] & 0xFF) && tid[1] == (prefix[1] & 0xFF)) { - if(seqno_return) + if (tid[0] == (prefix[0] & 0xFF) && tid[1] == (prefix[1] & 0xFF)) { + if (seqno_return) memcpy(seqno_return, tid + 2, 2); return 1; } else @@ -227,7 +251,7 @@ static inline int circular(int from, int to) { int x = to - from; - if(x < 0) + if (x < 0) return x + CIRCULAR_LIST_SIZE; return x; } @@ -251,10 +275,9 @@ list_free(struct circular_list *list) } static int -list_pop(struct circular_list *list, - struct sockaddr_storage *ss, socklen_t *sslen) +list_pop(struct circular_list *list, struct sockaddr_storage *ss, socklen_t *sslen) { - if(list->head == list->tail) + if (list->head == list->tail) return 0; memcpy(ss, &list->nodes[list->head].ss, list->nodes[list->head].sslen); @@ -264,17 +287,20 @@ list_pop(struct circular_list *list, } static int -list_random(struct circular_list *list, unsigned char *id, - struct sockaddr_storage *ss, socklen_t *sslen) +list_random( + struct circular_list *list, + unsigned char *id, + struct sockaddr_storage *ss, + socklen_t *sslen) { int n; - if(list->head == list->tail) + if (list->head == list->tail) return 0; n = random() % (list->tail - list->head); n = (list->head + n) % CIRCULAR_LIST_SIZE; - if(id) + if (id) memcpy(id, &list->nodes[n].id, 20); memcpy(ss, &list->nodes[n].ss, list->nodes[n].sslen); *sslen = list->nodes[n].sslen; @@ -290,9 +316,9 @@ new_node(unsigned char *id, struct sockaddr *sa, socklen_t salen, int confirm) struct circular_list *list; int i; - if(sa->sa_family == AF_INET) + if (sa->sa_family == AF_INET) list = confirm >= 2 ? &v4_confirmed : &v4_new; - else if(sa->sa_family == AF_INET6) + else if (sa->sa_family == AF_INET6) list = confirm >= 2 ? &v6_confirmed : &v6_new; else abort(); @@ -301,12 +327,12 @@ new_node(unsigned char *id, struct sockaddr *sa, socklen_t salen, int confirm) We want to avoid getting our tables full of very young nodes -- only include such a node if we have plenty of space. */ - if(confirm == 1 && list_free(list) < 32) + if (confirm == 1 && list_free(list) < 32) return 0; - for(i = list->head; i != list->tail; i = (i + 1) % CIRCULAR_LIST_SIZE) { + for (i = list->head; i != list->tail; i = (i + 1) % CIRCULAR_LIST_SIZE) { struct node *n = &list->nodes[i]; - if(n->sslen == salen && memcmp(&n->ss, sa, salen) == 0) + if (n->sslen == salen && memcmp(&n->ss, sa, salen) == 0) return 0; } @@ -314,7 +340,7 @@ new_node(unsigned char *id, struct sockaddr *sa, socklen_t salen, int confirm) memcpy(&list->nodes[list->tail].ss, sa, salen); list->nodes[list->tail].sslen = salen; list->tail = (list->tail + 1) % CIRCULAR_LIST_SIZE; - if(list->head == list->tail) + if (list->head == list->tail) list->head = (list->head + 1) % CIRCULAR_LIST_SIZE; return 1; @@ -324,13 +350,13 @@ static int token_bucket(void) { time_t now = time(NULL); - if(token_bucket_tokens == 0) { - token_bucket_tokens = MIN(MAX_TOKEN_BUCKET_TOKENS, - 4 * (now - token_bucket_time)); + if (token_bucket_tokens == 0) { + token_bucket_tokens = + MIN(MAX_TOKEN_BUCKET_TOKENS, 4 * (now - token_bucket_time)); token_bucket_time = now; } - if(token_bucket_tokens == 0) + if (token_bucket_tokens == 0) return 0; token_bucket_tokens--; @@ -345,32 +371,31 @@ send_request(struct circular_list *list, int dopop, int doping, int want) socklen_t sslen; int rc; - if(list_empty(list)) + if (list_empty(list)) return 0; - if(dopop) { + if (dopop) { rc = list_pop(list, &ss, &sslen); - if(rc == 0) + if (rc == 0) return 0; } else { rc = list_random(list, NULL, &ss, &sslen); - if(rc == 0) + if (rc == 0) return 0; } - if(doping) { + if (doping) { make_tid(ttid, "pn", 0); debugf("Sending ping.\n"); - return send_ping((struct sockaddr*)&ss, sslen, ttid, 4); + return send_ping((struct sockaddr *)&ss, sslen, ttid, 4); } else { unsigned char id[20]; int i; - for(i = 0; i < 20; i++) + for (i = 0; i < 20; i++) id[i] = random() & 0xFF; make_tid(ttid, "fn", 0); debugf("Sending find_node.\n"); - return send_find_node((struct sockaddr*)&ss, sslen, ttid, 4, - id, want, 0); + return send_find_node((struct sockaddr *)&ss, sslen, ttid, 4, id, want, 0); } } @@ -381,12 +406,12 @@ main(int argc, char **argv) int opt, rc, i, send4; unsigned char ttid[4]; - while(1) { + while (1) { opt = getopt(argc, argv, "q46"); - if(opt < 0) + if (opt < 0) break; - switch(opt) { + switch (opt) { case 'q': quiet = 1; break; @@ -403,63 +428,63 @@ main(int argc, char **argv) i = optind; - if(argc < i + 1) + if (argc < i + 1) goto usage; port = atoi(argv[i++]); - if(port <= 0 || port >= 0x10000) + if (port <= 0 || port >= 0x10000) goto usage; - if(ipv4) { + if (ipv4) { dht_socket = socket(PF_INET, SOCK_DGRAM, 0); - if(dht_socket < 0) + if (dht_socket < 0) perror("socket(IPv4)"); } - if(ipv6) { + if (ipv6) { dht_socket6 = socket(PF_INET6, SOCK_DGRAM, 0); - if(dht_socket6 < 0) + if (dht_socket6 < 0) perror("socket(IPv6)"); } - if(dht_socket < 0 && dht_socket6 < 0) { + if (dht_socket < 0 && dht_socket6 < 0) { fprintf(stderr, "Eek!\n"); exit(1); } - if(dht_socket >= 0) { + if (dht_socket >= 0) { struct sockaddr_in sin; int rc; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(port); - rc = bind(dht_socket, (struct sockaddr*)&sin, sizeof(sin)); - if(rc < 0) { + rc = bind(dht_socket, (struct sockaddr *)&sin, sizeof(sin)); + if (rc < 0) { perror("bind(IPv4)"); exit(1); } rc = fcntl(dht_socket, F_GETFL, 0); - if(rc < 0) { + if (rc < 0) { perror("F_GETFL"); exit(1); } - + rc = fcntl(dht_socket, F_SETFL, (rc | O_NONBLOCK)); - if(rc < 0) { + if (rc < 0) { perror("F_SETFL"); exit(1); } } - if(dht_socket6 >= 0) { + if (dht_socket6 >= 0) { struct sockaddr_in6 sin6; int rc; int val = 1; - rc = setsockopt(dht_socket6, IPPROTO_IPV6, IPV6_V6ONLY, - (char *)&val, sizeof(val)); - if(rc < 0) { + rc = setsockopt( + dht_socket6, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&val, sizeof(val)); + if (rc < 0) { perror("setsockopt(IPV6_V6ONLY)"); exit(1); } @@ -471,20 +496,20 @@ main(int argc, char **argv) memset(&sin6, 0, sizeof(sin6)); sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(port); - rc = bind(dht_socket6, (struct sockaddr*)&sin6, sizeof(sin6)); - if(rc < 0) { + rc = bind(dht_socket6, (struct sockaddr *)&sin6, sizeof(sin6)); + if (rc < 0) { perror("bind(IPv6)"); exit(1); } rc = fcntl(dht_socket6, F_GETFL, 0); - if(rc < 0) { + if (rc < 0) { perror("F_GETFL"); exit(1); } - + rc = fcntl(dht_socket6, F_SETFL, (rc | O_NONBLOCK)); - if(rc < 0) { + if (rc < 0) { perror("F_SETFL"); exit(1); } @@ -495,13 +520,13 @@ main(int argc, char **argv) unsigned int seed; fd = open("/dev/urandom", O_RDONLY); - if(fd < 0) { + if (fd < 0) { perror("open(random)"); exit(1); } rc = read(fd, myid, 20); - if(rc < 20) { + if (rc < 20) { perror("open(random)"); exit(1); } @@ -515,30 +540,30 @@ main(int argc, char **argv) memcpy(my_v, "1:v4:JB\0\0", 9); have_v = 1; - if(!quiet) + if (!quiet) dht_debug = stdout; - - while(i < argc) { + + while (i < argc) { struct addrinfo hints, *info, *infop; memset(&hints, 0, sizeof(hints)); hints.ai_socktype = SOCK_DGRAM; hints.ai_family = 0; - if(dht_socket < 0) + if (dht_socket < 0) hints.ai_family = AF_INET6; - else if(dht_socket6 < 0) + else if (dht_socket6 < 0) hints.ai_family |= AF_INET; rc = getaddrinfo(argv[i], argv[i + 1], &hints, &info); - if(rc != 0) { + if (rc != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rc)); exit(1); } i++; - if(i >= argc) + if (i >= argc) goto usage; infop = info; - while(infop) { + while (infop) { make_tid(ttid, "pn", 0); debugf("Sending ping.\n"); send_ping(infop->ai_addr, infop->ai_addrlen, ttid, 4); @@ -552,40 +577,42 @@ main(int argc, char **argv) token_bucket_time = time(NULL); token_bucket_tokens = MAX_TOKEN_BUCKET_TOKENS; - while(1) { + while (1) { struct timeval tv; fd_set readfds; int rc; - if((dht_socket >= 0 && list_elements(&v4_confirmed) <= 16) || - (dht_socket6 >= 0 && list_elements(&v6_confirmed) <= 16)) + if ((dht_socket >= 0 && list_elements(&v4_confirmed) <= 16) || + (dht_socket6 >= 0 && list_elements(&v6_confirmed) <= 16)) tv.tv_sec = 0; else tv.tv_sec = random() % 30; tv.tv_usec = random() % 1000000; - + FD_ZERO(&readfds); - if(dht_socket >= 0) + if (dht_socket >= 0) FD_SET(dht_socket, &readfds); - if(dht_socket6 >= 0) + if (dht_socket6 >= 0) FD_SET(dht_socket6, &readfds); - if(dht_debug) - debugf("%d+%d %d+%d\n", - list_elements(&v4_confirmed), list_elements(&v6_confirmed), - list_elements(&v4_new), list_elements(&v6_new)); + if (dht_debug) + debugf( + "%d+%d %d+%d\n", + list_elements(&v4_confirmed), + list_elements(&v6_confirmed), + list_elements(&v4_new), + list_elements(&v6_new)); - rc = select(MAX(dht_socket, dht_socket6) + 1, &readfds, NULL, NULL, - &tv); + rc = select(MAX(dht_socket, dht_socket6) + 1, &readfds, NULL, NULL, &tv); - if(rc < 0) { - if(errno != EINTR) { + if (rc < 0) { + if (errno != EINTR) { perror("select"); sleep(1); } } - if(rc > 0) { + if (rc > 0) { int rc, message; unsigned char tid[16], id[20], info_hash[20], target[20]; unsigned char buf[1536], nodes[256], nodes6[1024], token[128]; @@ -596,88 +623,101 @@ main(int argc, char **argv) int values_len = 2048, values6_len = 2048; int want; struct sockaddr_storage source_storage; - struct sockaddr *source = (struct sockaddr*)&source_storage; + struct sockaddr *source = (struct sockaddr *)&source_storage; socklen_t sourcelen = sizeof(source_storage); - if(dht_socket >= 0 && FD_ISSET(dht_socket, &readfds)) { + if (dht_socket >= 0 && FD_ISSET(dht_socket, &readfds)) { rc = recvfrom(dht_socket, buf, 1536, 0, source, &sourcelen); - } else if(dht_socket6 >= 0 && FD_ISSET(dht_socket6, &readfds)) { + } else if (dht_socket6 >= 0 && FD_ISSET(dht_socket6, &readfds)) { rc = recvfrom(dht_socket6, buf, 1536, 0, source, &sourcelen); } - if(rc < 0 || sourcelen > sizeof(struct sockaddr_storage)) + if (rc < 0 || sourcelen > sizeof(struct sockaddr_storage)) goto dontread; - if(is_martian(source)) + if (is_martian(source)) goto dontread; /* There's a bug in parse_message -- it will happily overflow the buffer if it's not NUL-terminated. For now, put a NUL at the end of buffers. */ - if(rc < 1536) { + if (rc < 1536) { buf[rc] = '\0'; } else { debugf("Overlong message.\n"); goto dontread; } - message = parse_message(buf, rc, tid, &tid_len, id, info_hash, - target, &port, token, &token_len, - nodes, &nodes_len, nodes6, &nodes6_len, - values, &values_len, values6, &values6_len, - &want); - - if(id_cmp(id, myid) == 0) { + message = parse_message( + buf, + rc, + tid, + &tid_len, + id, + info_hash, + target, + &port, + token, + &token_len, + nodes, + &nodes_len, + nodes6, + &nodes6_len, + values, + &values_len, + values6, + &values6_len, + &want); + + if (id_cmp(id, myid) == 0) { debugf("Received message from self.\n"); goto dontread; } - if(message > REPLY) { + if (message > REPLY) { /* Rate limit requests. */ - if(!token_bucket()) { + if (!token_bucket()) { debugf("Dropping request due to rate limiting.\n"); goto dontread; } } - switch(message) { + switch (message) { case REPLY: - if(tid_len != 4) { + if (tid_len != 4) { debugf("Broken node truncates transaction ids.\n"); goto dontread; } - if(tid_match(tid, "pn", NULL)) { + if (tid_match(tid, "pn", NULL)) { debugf("Pong!\n"); new_node(id, source, sourcelen, 2); - } else if(tid_match(tid, "fn", NULL)) { + } else if (tid_match(tid, "fn", NULL)) { debugf("Nodes found!\n"); - if(nodes_len % 26 != 0 || nodes6_len % 38 != 0) { + if (nodes_len % 26 != 0 || nodes6_len % 38 != 0) { debugf("Unexpected length for node info!\n"); } else { new_node(id, source, sourcelen, 2); - for(i = 0; i < nodes_len / 26; i++) { + for (i = 0; i < nodes_len / 26; i++) { unsigned char *ni = nodes + i * 26; struct sockaddr_in sin; - if(id_cmp(ni, myid) == 0) + if (id_cmp(ni, myid) == 0) continue; memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; memcpy(&sin.sin_addr, ni + 20, 4); memcpy(&sin.sin_port, ni + 24, 2); - new_node(ni, (struct sockaddr*)&sin, sizeof(sin), - 0); + new_node(ni, (struct sockaddr *)&sin, sizeof(sin), 0); } - for(i = 0; i < nodes6_len / 38; i++) { + for (i = 0; i < nodes6_len / 38; i++) { unsigned char *ni = nodes6 + i * 38; struct sockaddr_in6 sin6; - if(id_cmp(ni, myid) == 0) + if (id_cmp(ni, myid) == 0) continue; memset(&sin6, 0, sizeof(sin6)); sin6.sin6_family = AF_INET6; memcpy(&sin6.sin6_addr, ni + 20, 16); memcpy(&sin6.sin6_port, ni + 36, 2); - new_node(ni, (struct sockaddr*)&sin6, sizeof(sin6), - 0); + new_node(ni, (struct sockaddr *)&sin6, sizeof(sin6), 0); } } } else { @@ -694,19 +734,23 @@ main(int argc, char **argv) case FIND_NODE: case GET_PEERS: - if(message == FIND_NODE) + if (message == FIND_NODE) debugf("Find node!\n"); else debugf("Get peers!\n"); new_node(id, source, sourcelen, 1); debugf("Sending nodes (%d).\n", want); - send_random_nodes(source, sourcelen, - tid, tid_len, target, want); + send_random_nodes(source, sourcelen, tid, tid_len, target, want); break; case ANNOUNCE_PEER: debugf("Announce peer!\n"); - send_error(source, sourcelen, tid, tid_len, - 203, "This node doesn't accept announces"); + send_error( + source, + sourcelen, + tid, + tid_len, + 203, + "This node doesn't accept announces"); break; } } @@ -717,35 +761,31 @@ main(int argc, char **argv) sure we send at most one packet each time through the select loop. */ - if(dht_socket6 < 0) + if (dht_socket6 < 0) send4 = 1; - else if(dht_socket < 0) + else if (dht_socket < 0) send4 = 0; else send4 = random() % 2; - if(send4) { - int want = - dht_socket6 >= 0 && list_free(&v6_new) > 8 ? - (WANT4 | WANT6) : 0; - if(!list_empty(&v4_new)) + if (send4) { + int want = dht_socket6 >= 0 && list_free(&v6_new) > 8 ? (WANT4 | WANT6) : 0; + if (!list_empty(&v4_new)) send_request(&v4_new, 1, list_free(&v4_new) < 8, want); - else if(!list_empty(&v4_confirmed)) + else if (!list_empty(&v4_confirmed)) send_request(&v4_confirmed, 0, 0, want); } else { - int want = - dht_socket >= 0 && list_free(&v4_new) > 8 ? - (WANT4 | WANT6) : 0; - if(!list_empty(&v6_new)) + int want = dht_socket >= 0 && list_free(&v4_new) > 8 ? (WANT4 | WANT6) : 0; + if (!list_empty(&v6_new)) send_request(&v6_new, 1, list_free(&v6_new) < 8, want); - else if(!list_empty(&v6_confirmed)) + else if (!list_empty(&v6_confirmed)) send_request(&v6_confirmed, 0, 0, want); } } return 0; - usage: +usage: fprintf(stderr, "dht-bootstrap [-q] [-4] [-6] port [node port...]\n"); exit(1); } @@ -753,40 +793,40 @@ main(int argc, char **argv) /* We could use a proper bencoding printer and parser, but the format of DHT messages is fairly stylised, so this seemed simpler. */ -#define CHECK(offset, delta, size) \ - if(delta < 0 || offset + delta > size) goto fail +#define CHECK(offset, delta, size) \ + if (delta < 0 || offset + delta > size) \ + goto fail -#define INC(offset, delta, size) \ - CHECK(offset, delta, size); \ +#define INC(offset, delta, size) \ + CHECK(offset, delta, size); \ offset += delta -#define COPY(buf, offset, src, delta, size) \ - CHECK(offset, delta, size); \ - memcpy(buf + offset, src, delta); \ +#define COPY(buf, offset, src, delta, size) \ + CHECK(offset, delta, size); \ + memcpy(buf + offset, src, delta); \ offset += delta; -#define ADD_V(buf, offset, size) \ - if(have_v) { \ - COPY(buf, offset, my_v, sizeof(my_v), size); \ +#define ADD_V(buf, offset, size) \ + if (have_v) { \ + COPY(buf, offset, my_v, sizeof(my_v), size); \ } static int -dht_send(const void *buf, size_t len, int flags, - const struct sockaddr *sa, int salen) +dht_send(const void *buf, size_t len, int flags, const struct sockaddr *sa, int salen) { int s; - if(salen == 0) + if (salen == 0) abort(); - if(sa->sa_family == AF_INET) + if (sa->sa_family == AF_INET) s = dht_socket; - else if(sa->sa_family == AF_INET6) + else if (sa->sa_family == AF_INET6) s = dht_socket6; else s = -1; - if(s < 0) { + if (s < 0) { errno = EAFNOSUPPORT; return -1; } @@ -795,103 +835,125 @@ dht_send(const void *buf, size_t len, int flags, } int -send_ping(struct sockaddr *sa, int salen, - const unsigned char *tid, int tid_len) +send_ping(struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len) { char buf[512]; int i = 0, rc; - rc = snprintf(buf + i, 512 - i, "d1:ad2:id20:"); INC(i, rc, 512); + rc = snprintf(buf + i, 512 - i, "d1:ad2:id20:"); + INC(i, rc, 512); COPY(buf, i, myid, 20, 512); rc = snprintf(buf + i, 512 - i, "e1:q4:ping1:t%d:", tid_len); INC(i, rc, 512); COPY(buf, i, tid, tid_len, 512); ADD_V(buf, i, 512); - rc = snprintf(buf + i, 512 - i, "1:y1:qe"); INC(i, rc, 512); + rc = snprintf(buf + i, 512 - i, "1:y1:qe"); + INC(i, rc, 512); return dht_send(buf, i, 0, sa, salen); - fail: +fail: errno = ENOSPC; return -1; } int -send_pong(struct sockaddr *sa, int salen, - const unsigned char *tid, int tid_len) +send_pong(struct sockaddr *sa, int salen, const unsigned char *tid, int tid_len) { char buf[512]; int i = 0, rc; - rc = snprintf(buf + i, 512 - i, "d1:rd2:id20:"); INC(i, rc, 512); + rc = snprintf(buf + i, 512 - i, "d1:rd2:id20:"); + INC(i, rc, 512); COPY(buf, i, myid, 20, 512); - rc = snprintf(buf + i, 512 - i, "e1:t%d:", tid_len); INC(i, rc, 512); + rc = snprintf(buf + i, 512 - i, "e1:t%d:", tid_len); + INC(i, rc, 512); COPY(buf, i, tid, tid_len, 512); ADD_V(buf, i, 512); - rc = snprintf(buf + i, 512 - i, "1:y1:re"); INC(i, rc, 512); + rc = snprintf(buf + i, 512 - i, "1:y1:re"); + INC(i, rc, 512); return dht_send(buf, i, 0, sa, salen); - fail: +fail: errno = ENOSPC; return -1; } int -send_find_node(struct sockaddr *sa, int salen, - const unsigned char *tid, int tid_len, - const unsigned char *target, int want, int confirm) +send_find_node( + struct sockaddr *sa, + int salen, + const unsigned char *tid, + int tid_len, + const unsigned char *target, + int want, + int confirm) { char buf[512]; int i = 0, rc; - rc = snprintf(buf + i, 512 - i, "d1:ad2:id20:"); INC(i, rc, 512); + rc = snprintf(buf + i, 512 - i, "d1:ad2:id20:"); + INC(i, rc, 512); COPY(buf, i, myid, 20, 512); - rc = snprintf(buf + i, 512 - i, "6:target20:"); INC(i, rc, 512); + rc = snprintf(buf + i, 512 - i, "6:target20:"); + INC(i, rc, 512); COPY(buf, i, target, 20, 512); - if(want > 0) { - rc = snprintf(buf + i, 512 - i, "4:wantl%s%se", - (want & WANT4) ? "2:n4" : "", - (want & WANT6) ? "2:n6" : ""); + if (want > 0) { + rc = snprintf( + buf + i, + 512 - i, + "4:wantl%s%se", + (want & WANT4) ? "2:n4" : "", + (want & WANT6) ? "2:n6" : ""); INC(i, rc, 512); } rc = snprintf(buf + i, 512 - i, "e1:q9:find_node1:t%d:", tid_len); INC(i, rc, 512); COPY(buf, i, tid, tid_len, 512); ADD_V(buf, i, 512); - rc = snprintf(buf + i, 512 - i, "1:y1:qe"); INC(i, rc, 512); + rc = snprintf(buf + i, 512 - i, "1:y1:qe"); + INC(i, rc, 512); return dht_send(buf, i, confirm ? MSG_CONFIRM : 0, sa, salen); - fail: +fail: errno = ENOSPC; return -1; } int -send_nodes(struct sockaddr *sa, int salen, - const unsigned char *tid, int tid_len, - const unsigned char *nodes, int nodes_len, - const unsigned char *nodes6, int nodes6_len) +send_nodes( + struct sockaddr *sa, + int salen, + const unsigned char *tid, + int tid_len, + const unsigned char *nodes, + int nodes_len, + const unsigned char *nodes6, + int nodes6_len) { char buf[2048]; int i = 0, rc; - rc = snprintf(buf + i, 2048 - i, "d1:rd2:id20:"); INC(i, rc, 2048); + rc = snprintf(buf + i, 2048 - i, "d1:rd2:id20:"); + INC(i, rc, 2048); COPY(buf, i, myid, 20, 2048); - if(nodes_len > 0) { + if (nodes_len > 0) { rc = snprintf(buf + i, 2048 - i, "5:nodes%d:", nodes_len); INC(i, rc, 2048); COPY(buf, i, nodes, nodes_len, 2048); } - if(nodes6_len > 0) { - rc = snprintf(buf + i, 2048 - i, "6:nodes6%d:", nodes6_len); - INC(i, rc, 2048); - COPY(buf, i, nodes6, nodes6_len, 2048); + if (nodes6_len > 0) { + rc = snprintf(buf + i, 2048 - i, "6:nodes6%d:", nodes6_len); + INC(i, rc, 2048); + COPY(buf, i, nodes6, nodes6_len, 2048); } - rc = snprintf(buf + i, 2048 - i, "e1:t%d:", tid_len); INC(i, rc, 2048); + rc = snprintf(buf + i, 2048 - i, "e1:t%d:", tid_len); + INC(i, rc, 2048); COPY(buf, i, tid, tid_len, 2048); ADD_V(buf, i, 2048); - rc = snprintf(buf + i, 2048 - i, "1:y1:re"); INC(i, rc, 2048); + rc = snprintf(buf + i, 2048 - i, "1:y1:re"); + INC(i, rc, 2048); return dht_send(buf, i, 0, sa, salen); - fail: +fail: errno = ENOSPC; return -1; } @@ -906,20 +968,25 @@ buffer_random_nodes(int af, unsigned char *nodes) int n; int rc; - switch(af) { - case AF_INET: list = &v4_confirmed; break; - case AF_INET6: list = &v6_confirmed; break; - default: abort(); + switch (af) { + case AF_INET: + list = &v4_confirmed; + break; + case AF_INET6: + list = &v6_confirmed; + break; + default: + abort(); } n = 0; - while(n < 8) { + while (n < 8) { rc = list_random(list, id, &ss, &sslen); - if(rc < 1) + if (rc < 1) break; - switch(af) { + switch (af) { case AF_INET: { - struct sockaddr_in *sin = (struct sockaddr_in*)&ss; + struct sockaddr_in *sin = (struct sockaddr_in *)&ss; memcpy(nodes + n * 26, id, 20); memcpy(nodes + n * 26 + 20, &sin->sin_addr, 4); memcpy(nodes + n * 26 + 24, &sin->sin_port, 2); @@ -927,7 +994,7 @@ buffer_random_nodes(int af, unsigned char *nodes) break; } case AF_INET6: { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)&ss; + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&ss; memcpy(nodes + n * 38, id, 20); memcpy(nodes + n * 38 + 20, &sin6->sin6_addr, 16); memcpy(nodes + n * 38 + 36, &sin6->sin6_port, 2); @@ -942,47 +1009,55 @@ buffer_random_nodes(int af, unsigned char *nodes) } int -send_random_nodes(struct sockaddr *sa, int salen, - const unsigned char *tid, int tid_len, - const unsigned char *id, int want) +send_random_nodes( + struct sockaddr *sa, + int salen, + const unsigned char *tid, + int tid_len, + const unsigned char *id, + int want) { unsigned char nodes[8 * 26]; unsigned char nodes6[8 * 38]; int numnodes = 0, numnodes6 = 0; - if(want < 0) + if (want < 0) want = sa->sa_family == AF_INET ? WANT4 : WANT6; - if((want & WANT4)) + if ((want & WANT4)) numnodes = buffer_random_nodes(AF_INET, nodes); - if((want & WANT6)) + if ((want & WANT6)) numnodes6 = buffer_random_nodes(AF_INET6, nodes6); - return send_nodes(sa, salen, tid, tid_len, - nodes, numnodes * 26, - nodes6, numnodes6 * 38); + return send_nodes( + sa, salen, tid, tid_len, nodes, numnodes * 26, nodes6, numnodes6 * 38); } static int -send_error(struct sockaddr *sa, int salen, - unsigned char *tid, int tid_len, - int code, const char *message) +send_error( + struct sockaddr *sa, + int salen, + unsigned char *tid, + int tid_len, + int code, + const char *message) { char buf[512]; int i = 0, rc; - rc = snprintf(buf + i, 512 - i, "d1:eli%de%d:", - code, (int)strlen(message)); + rc = snprintf(buf + i, 512 - i, "d1:eli%de%d:", code, (int)strlen(message)); INC(i, rc, 512); COPY(buf, i, message, (int)strlen(message), 512); - rc = snprintf(buf + i, 512 - i, "e1:t%d:", tid_len); INC(i, rc, 512); + rc = snprintf(buf + i, 512 - i, "e1:t%d:", tid_len); + INC(i, rc, 512); COPY(buf, i, tid, tid_len, 512); ADD_V(buf, i, 512); - rc = snprintf(buf + i, 512 - i, "1:y1:ee"); INC(i, rc, 512); + rc = snprintf(buf + i, 512 - i, "1:y1:ee"); + INC(i, rc, 512); return dht_send(buf, i, 0, sa, salen); - fail: +fail: errno = ENOSPC; return -1; } @@ -994,55 +1069,65 @@ send_error(struct sockaddr *sa, int salen, #ifndef HAVE_MEMMEM static void * -memmem(const void *haystack, size_t haystacklen, - const void *needle, size_t needlelen) +memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) { const char *h = haystack; const char *n = needle; size_t i; /* size_t is unsigned */ - if(needlelen > haystacklen) + if (needlelen > haystacklen) return NULL; - for(i = 0; i <= haystacklen - needlelen; i++) { - if(memcmp(h + i, n, needlelen) == 0) - return (void*)(h + i); + for (i = 0; i <= haystacklen - needlelen; i++) { + if (memcmp(h + i, n, needlelen) == 0) + return (void *)(h + i); } return NULL; } #endif static int -parse_message(const unsigned char *buf, int buflen, - unsigned char *tid_return, int *tid_len, - unsigned char *id_return, unsigned char *info_hash_return, - unsigned char *target_return, unsigned short *port_return, - unsigned char *token_return, int *token_len, - unsigned char *nodes_return, int *nodes_len, - unsigned char *nodes6_return, int *nodes6_len, - unsigned char *values_return, int *values_len, - unsigned char *values6_return, int *values6_len, - int *want_return) +parse_message( + const unsigned char *buf, + int buflen, + unsigned char *tid_return, + int *tid_len, + unsigned char *id_return, + unsigned char *info_hash_return, + unsigned char *target_return, + unsigned short *port_return, + unsigned char *token_return, + int *token_len, + unsigned char *nodes_return, + int *nodes_len, + unsigned char *nodes6_return, + int *nodes6_len, + unsigned char *values_return, + int *values_len, + unsigned char *values6_return, + int *values6_len, + int *want_return) { const unsigned char *p; /* This code will happily crash if the buffer is not NUL-terminated. */ - if(buf[buflen] != '\0') { + if (buf[buflen] != '\0') { debugf("Eek! parse_message with unterminated buffer.\n"); return -1; } -#define CHECK(ptr, len) \ - if(((unsigned char*)ptr) + (len) > (buf) + (buflen)) goto overflow; +#define CHECK(ptr, len) \ + if (((unsigned char *)ptr) + (len) > (buf) + (buflen)) \ + goto overflow; - if(tid_return) { + if (tid_return) { p = memmem(buf, buflen, "1:t", 3); - if(p) { + if (p) { long l; char *q; - l = strtol((char*)p + 3, &q, 10); - if(q && *q == ':' && l > 0 && l < *tid_len) { + l = strtol((char *)p + 3, &q, 10); + if (q && *q == ':' && l > 0 && l < *tid_len) { CHECK(q + 1, l); memcpy(tid_return, q + 1, l); *tid_len = l; @@ -1050,53 +1135,53 @@ parse_message(const unsigned char *buf, int buflen, *tid_len = 0; } } - if(id_return) { + if (id_return) { p = memmem(buf, buflen, "2:id20:", 7); - if(p) { + if (p) { CHECK(p + 7, 20); memcpy(id_return, p + 7, 20); } else { memset(id_return, 0, 20); } } - if(info_hash_return) { + if (info_hash_return) { p = memmem(buf, buflen, "9:info_hash20:", 14); - if(p) { + if (p) { CHECK(p + 14, 20); memcpy(info_hash_return, p + 14, 20); } else { memset(info_hash_return, 0, 20); } } - if(port_return) { + if (port_return) { p = memmem(buf, buflen, "porti", 5); - if(p) { + if (p) { long l; char *q; - l = strtol((char*)p + 5, &q, 10); - if(q && *q == 'e' && l > 0 && l < 0x10000) + l = strtol((char *)p + 5, &q, 10); + if (q && *q == 'e' && l > 0 && l < 0x10000) *port_return = l; else *port_return = 0; } else *port_return = 0; } - if(target_return) { + if (target_return) { p = memmem(buf, buflen, "6:target20:", 11); - if(p) { + if (p) { CHECK(p + 11, 20); memcpy(target_return, p + 11, 20); } else { memset(target_return, 0, 20); } } - if(token_return) { + if (token_return) { p = memmem(buf, buflen, "5:token", 7); - if(p) { + if (p) { long l; char *q; - l = strtol((char*)p + 7, &q, 10); - if(q && *q == ':' && l > 0 && l < *token_len) { + l = strtol((char *)p + 7, &q, 10); + if (q && *q == ':' && l > 0 && l < *token_len) { CHECK(q + 1, l); memcpy(token_return, q + 1, l); *token_len = l; @@ -1106,13 +1191,13 @@ parse_message(const unsigned char *buf, int buflen, *token_len = 0; } - if(nodes_len) { + if (nodes_len) { p = memmem(buf, buflen, "5:nodes", 7); - if(p) { + if (p) { long l; char *q; - l = strtol((char*)p + 7, &q, 10); - if(q && *q == ':' && l > 0 && l < *nodes_len) { + l = strtol((char *)p + 7, &q, 10); + if (q && *q == ':' && l > 0 && l < *nodes_len) { CHECK(q + 1, l); memcpy(nodes_return, q + 1, l); *nodes_len = l; @@ -1122,13 +1207,13 @@ parse_message(const unsigned char *buf, int buflen, *nodes_len = 0; } - if(nodes6_len) { + if (nodes6_len) { p = memmem(buf, buflen, "6:nodes6", 8); - if(p) { + if (p) { long l; char *q; - l = strtol((char*)p + 8, &q, 10); - if(q && *q == ':' && l > 0 && l < *nodes6_len) { + l = strtol((char *)p + 8, &q, 10); + if (q && *q == ':' && l > 0 && l < *nodes6_len) { CHECK(q + 1, l); memcpy(nodes6_return, q + 1, l); *nodes6_len = l; @@ -1138,42 +1223,42 @@ parse_message(const unsigned char *buf, int buflen, *nodes6_len = 0; } - if(values_len || values6_len) { + if (values_len || values6_len) { p = memmem(buf, buflen, "6:valuesl", 9); - if(p) { + if (p) { int i = p - buf + 9; int j = 0, j6 = 0; - while(1) { + while (1) { long l; char *q; - l = strtol((char*)buf + i, &q, 10); - if(q && *q == ':' && l > 0) { + l = strtol((char *)buf + i, &q, 10); + if (q && *q == ':' && l > 0) { CHECK(q + 1, l); - if(l == 6) { - if(j + l > *values_len) + if (l == 6) { + if (j + l > *values_len) continue; - i = q + 1 + l - (char*)buf; - memcpy((char*)values_return + j, q + 1, l); + i = q + 1 + l - (char *)buf; + memcpy((char *)values_return + j, q + 1, l); j += l; - } else if(l == 18) { - if(j6 + l > *values6_len) + } else if (l == 18) { + if (j6 + l > *values6_len) continue; - i = q + 1 + l - (char*)buf; - memcpy((char*)values6_return + j6, q + 1, l); + i = q + 1 + l - (char *)buf; + memcpy((char *)values6_return + j6, q + 1, l); j6 += l; } else { debugf("Received weird value -- %d bytes.\n", (int)l); - i = q + 1 + l - (char*)buf; + i = q + 1 + l - (char *)buf; } } else { break; } } - if(i >= buflen || buf[i] != 'e') + if (i >= buflen || buf[i] != 'e') debugf("eek... unexpected end for values.\n"); - if(values_len) + if (values_len) *values_len = j; - if(values6_len) + if (values6_len) *values6_len = j6; } else { *values_len = 0; @@ -1181,23 +1266,23 @@ parse_message(const unsigned char *buf, int buflen, } } - if(want_return) { + if (want_return) { p = memmem(buf, buflen, "4:wantl", 7); - if(p) { + if (p) { int i = p - buf + 7; *want_return = 0; - while(buf[i] > '0' && buf[i] <= '9' && buf[i + 1] == ':' && - i + 2 + buf[i] - '0' < buflen) { + while (buf[i] > '0' && buf[i] <= '9' && buf[i + 1] == ':' && + i + 2 + buf[i] - '0' < buflen) { CHECK(buf + i + 2, buf[i] - '0'); - if(buf[i] == '2' && memcmp(buf + i + 2, "n4", 2) == 0) + if (buf[i] == '2' && memcmp(buf + i + 2, "n4", 2) == 0) *want_return |= WANT4; - else if(buf[i] == '2' && memcmp(buf + i + 2, "n6", 2) == 0) + else if (buf[i] == '2' && memcmp(buf + i + 2, "n6", 2) == 0) *want_return |= WANT6; else debugf("eek... unexpected want flag (%c)\n", buf[i]); i += 2 + buf[i] - '0'; } - if(i >= buflen || buf[i] != 'e') + if (i >= buflen || buf[i] != 'e') debugf("eek... unexpected end for want.\n"); } else { *want_return = -1; @@ -1206,23 +1291,23 @@ parse_message(const unsigned char *buf, int buflen, #undef CHECK - if(memmem(buf, buflen, "1:y1:r", 6)) + if (memmem(buf, buflen, "1:y1:r", 6)) return REPLY; - if(memmem(buf, buflen, "1:y1:e", 6)) + if (memmem(buf, buflen, "1:y1:e", 6)) return ERROR; - if(!memmem(buf, buflen, "1:y1:q", 6)) + if (!memmem(buf, buflen, "1:y1:q", 6)) return -1; - if(memmem(buf, buflen, "1:q4:ping", 9)) + if (memmem(buf, buflen, "1:q4:ping", 9)) return PING; - if(memmem(buf, buflen, "1:q9:find_node", 14)) - return FIND_NODE; - if(memmem(buf, buflen, "1:q9:get_peers", 14)) + if (memmem(buf, buflen, "1:q9:find_node", 14)) + return FIND_NODE; + if (memmem(buf, buflen, "1:q9:get_peers", 14)) return GET_PEERS; - if(memmem(buf, buflen, "1:q13:announce_peer", 19)) - return ANNOUNCE_PEER; + if (memmem(buf, buflen, "1:q13:announce_peer", 19)) + return ANNOUNCE_PEER; return -1; - overflow: +overflow: debugf("Truncated message.\n"); return -1; } -- 2.44.0