summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common.c91
-rw-r--r--src/server.c27
2 files changed, 64 insertions, 54 deletions
diff --git a/src/common.c b/src/common.c
index e679cbe..771c3e6 100644
--- a/src/common.c
+++ b/src/common.c
@@ -79,10 +79,11 @@ typedef uint64_t firehose_reply_new_offset;
struct relay_neighbor {
bool active; // set to 0 to indicate empty quick connect slot
- bool has_ipv4; // whether the neighbor supports ipv4 connection
- bool has_ipv6; // whether the neighbor supports ipv6 connection
- ipv4 v4_addr; // ipv4 address of the neighbor (if supported)
- ipv6 v6_addr; // ipv6 address of the neighbor (if supported)
+ bool has_ipv4; // whether the neighbor supports ipv4 connection
+ bool has_ipv6; // whether the neighbor supports ipv6 connection
+ ipv4 v4_addr; // ipv4 address of the neighbor (if supported)
+ ipv6 v6_addr; // ipv6 address of the neighbor (if supported)
+ uint16_t port; // port to connect to
};
struct relay_info {
@@ -127,11 +128,40 @@ struct data_packet {
} contents;
};
+static inline uint64_t read_u64_le(const byte *b) {
+ uint64_t v = 0;
+ for (int i = 0; i < 8; ++i) v |= (uint64_t) b[ i ] << (8 * i);
+ return v;
+}
+
+static inline void write_u64_le(byte *b, uint64_t v) {
+ for (int i = 0; i < 8; ++i) b[ i ] = (v >> (8 * i)) & 0xFF;
+}
+
+static inline uint32_t read_u32_le(const byte *b) {
+ uint32_t v = 0;
+ for (int i = 0; i < 4; ++i) v |= (uint32_t) b[ i ] << (8 * i);
+ return v;
+}
+
+static inline void write_u32_le(byte *b, uint32_t v) {
+ for (int i = 0; i < 4; ++i) b[ i ] = (v >> (8 * i)) & 0xFF;
+}
+
+static inline uint16_t read_u16_le(const byte *b) {
+ return (uint16_t) b[ 0 ] | ((uint16_t) b[ 1 ] << 8);
+}
+
+static inline void write_u16_le(byte *b, uint16_t v) {
+ b[ 0 ] = v & 0xFF;
+ b[ 1 ] = (v >> 8) & 0xFF;
+}
+
const size_t CONTENTS_SIZE = 1 + 8 + 32 + 32 + 1 + (32 * MAX_RECIPIENTS) + 65536 + 64;
const size_t PACKET_SIZE = 4 + 32 + (CONTENTS_SIZE);
struct relay_neighbor s2relay_neighbor(size_t len, byte *stream, bool *success) {
- if (len != 1 + 1 + 1 + 4 + 16) {
+ if (len != 1 + 1 + 1 + 4 + 16 + 2) {
*success = false;
return (struct relay_neighbor) { 0 };
}
@@ -143,6 +173,7 @@ struct relay_neighbor s2relay_neighbor(size_t len, byte *stream, bool *success)
memcpy(out.v4_addr, stream + 3, 4);
memcpy(out.v6_addr, stream + 7, 16);
+ out.port = read_u16_le(stream + 23);
*success = true;
return out;
@@ -155,10 +186,11 @@ void relay_neighbor2s(struct relay_neighbor data, byte *stream) {
memcpy(stream + 3, data.v4_addr, 4);
memcpy(stream + 7, data.v6_addr, 16);
+ write_u16_le(stream + 23, data.port);
}
struct relay_info s2relay_info(size_t len, byte *stream, bool *success) {
- if (len != 1 + 1 + 128 + 2 + 1 + 1 + 1 + 2 + 8 + (4 * (1 + 1 + 1 + 4 + 16))) {
+ if (len != 1 + 1 + 128 + 2 + 1 + 1 + 1 + 2 + 8 + (4 * (1 + 1 + 1 + 4 + 16 + 2))) {
*success = false;
return (struct relay_info) { 0 };
}
@@ -189,7 +221,7 @@ struct relay_info s2relay_info(size_t len, byte *stream, bool *success) {
for (int i = 0; i < 4; i++) {
bool ok;
- out.statistics.quick_connect[ i ] = s2relay_neighbor(1 + 1 + 1 + 4 + 16, stream + off, &ok);
+ out.statistics.quick_connect[ i ] = s2relay_neighbor(1 + 1 + 1 + 4 + 16 + 2, stream + off, &ok);
if (!ok) {
*success = false;
return (struct relay_info) { 0 };
@@ -219,18 +251,12 @@ void relay_info2s(struct relay_info data, byte *stream) {
stream[ off++ ] = data.statistics.neighbors & 0xFF;
stream[ off++ ] = (data.statistics.neighbors >> 8) & 0xFF;
- stream[ off++ ] = data.statistics.held_packets & 0xFF;
- stream[ off++ ] = (data.statistics.held_packets >> 8) & 0xFF;
- stream[ off++ ] = (data.statistics.held_packets >> 16) & 0xFF;
- stream[ off++ ] = (data.statistics.held_packets >> 24) & 0xFF;
- stream[ off++ ] = (data.statistics.held_packets >> 32) & 0xFF;
- stream[ off++ ] = (data.statistics.held_packets >> 40) & 0xFF;
- stream[ off++ ] = (data.statistics.held_packets >> 48) & 0xFF;
- stream[ off++ ] = (data.statistics.held_packets >> 56) & 0xFF;
+ write_u64_le(stream + off, data.statistics.held_packets);
+ off += 8;
for (int i = 0; i < 4; i++) {
relay_neighbor2s(data.statistics.quick_connect[ i ], stream + off);
- off += 1 + 1 + 1 + 4 + 16;
+ off += 1 + 1 + 1 + 4 + 16 + 2;
}
}
@@ -394,36 +420,7 @@ uint64_t get_current_time_ms(void) {
return (uint64_t) ts.tv_sec * 1000 + (uint64_t) ts.tv_nsec / 1000000;
}
-#define RELAY_NEIGHBOR_WIRE_LEN (1 + 1 + 1 + 4 + 16)
-
-static inline uint64_t read_u64_le(const byte *b) {
- uint64_t v = 0;
- for (int i = 0; i < 8; ++i) v |= (uint64_t) b[ i ] << (8 * i);
- return v;
-}
-
-static inline void write_u64_le(byte *b, uint64_t v) {
- for (int i = 0; i < 8; ++i) b[ i ] = (v >> (8 * i)) & 0xFF;
-}
-
-static inline uint32_t read_u32_le(const byte *b) {
- uint32_t v = 0;
- for (int i = 0; i < 4; ++i) v |= (uint32_t) b[ i ] << (8 * i);
- return v;
-}
-
-static inline void write_u32_le(byte *b, uint32_t v) {
- for (int i = 0; i < 4; ++i) b[ i ] = (v >> (8 * i)) & 0xFF;
-}
-
-static inline uint16_t read_u16_le(const byte *b) {
- return (uint16_t) b[ 0 ] | ((uint16_t) b[ 1 ] << 8);
-}
-
-static inline void write_u16_le(byte *b, uint16_t v) {
- b[ 0 ] = v & 0xFF;
- b[ 1 ] = (v >> 8) & 0xFF;
-}
+#define RELAY_NEIGHBOR_WIRE_LEN (1 + 1 + 1 + 4 + 16 + 2)
struct relay_info run_server_audit(const char *ip, int port) {
byte data[] = { audit_server, 0, 0, 0, 0, 0, 0, 0 };
@@ -450,7 +447,7 @@ pthread_mutex_t packet_storage_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t log_io_mutex = PTHREAD_MUTEX_INITIALIZER;
enum { _debug = 1, _info = 2, _warn = 3, _error = 4 } log_level = _error; // error only by default
-const char* log_level_names[] = { "debug", "info", "warn", "error" };
+const char *log_level_names[] = { "debug", "info", "warn", "error" };
#define log(__level, fmt, ...) \
({ \
char msg[ 4096 ]; \
diff --git a/src/server.c b/src/server.c
index 0e01683..98680a3 100644
--- a/src/server.c
+++ b/src/server.c
@@ -17,6 +17,8 @@
#include "sha256.c"
//
+uint16_t current_port = default_port;
+
const uint64_t max_neighbors = 1 << 10; // probably more than enough for a lot of folks
uint64_t current_neighbor_ptr = 0;
@@ -119,7 +121,7 @@ void* propagate_packet(void* _packet) {
neighbor.v4_addr[ 3 ]);
result = study(
- ip_string, default_port, send_data, send_len, &response_data, &response_len);
+ ip_string, neighbor.port, send_data, send_len, &response_data, &response_len);
} else if (neighbor.has_ipv6) {
char ip_string[ 46 ];
int offset = 0;
@@ -130,7 +132,7 @@ void* propagate_packet(void* _packet) {
}
result = study(
- ip_string, default_port, send_data, send_len, &response_data, &response_len);
+ ip_string, neighbor.port, send_data, send_len, &response_data, &response_len);
}
if (result != 0) { log(_error, "failed to send packet to neighbor"); }
@@ -540,7 +542,7 @@ void paste_server(
}
}
- struct relay_info audit_result = run_server_audit(ip_string, default_port);
+ struct relay_info audit_result = run_server_audit(ip_string, neighbor.port);
if (!audit_result.capabilities.can_store && audit_result.major_version == 0
&& audit_result.minor_version == 0) {
// invalid
@@ -829,7 +831,7 @@ void* check_neighbors(void* arg) {
neighbor.v4_addr[ 2 ],
neighbor.v4_addr[ 3 ]);
result = study(
- ip_string, default_port, audit_request, 1, &response_data, &response_len);
+ ip_string, neighbor.port, audit_request, 1, &response_data, &response_len);
} else if (neighbor.has_ipv6) {
char ip_string[ 46 ];
int offset = 0;
@@ -847,7 +849,7 @@ void* check_neighbors(void* arg) {
}
result = study(
- ip_string, default_port, audit_request, 1, &response_data, &response_len);
+ ip_string, neighbor.port, audit_request, 1, &response_data, &response_len);
}
if (result != 0 || response_data[ 0 ] != audit_response) {
@@ -901,13 +903,24 @@ int main(int argc, char** argv) {
free(__log_level);
}
+ char* port = get_config("port", false);
+ if (port) {
+ if (!isdigit(*port)) {
+ fprintf(stderr, "invalid port value '%s', must be a number\n", port);
+ exit(1);
+ }
+
+ current_port = atoi(port);
+ free(port);
+ }
+
fprintf(
stderr,
"-- moonpaste server v%i.%i --\n"
"port %i\n\n",
server_stats.major_version,
server_stats.minor_version,
- default_port);
+ current_port);
// init
packet_storage = alloc_map(max_storage * sizeof(struct data_packet_entry));
@@ -947,7 +960,7 @@ int main(int argc, char** argv) {
free(plugin_path);
}
- omen(default_port, paste_server);
+ omen(current_port, paste_server);
packet_cleanup_thread_running = false;
pthread_join(packet_cleanup_thread, NULL);