summaryrefslogtreecommitdiff
path: root/src/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c55
1 files changed, 25 insertions, 30 deletions
diff --git a/src/server.c b/src/server.c
index cc1f45d..3140788 100644
--- a/src/server.c
+++ b/src/server.c
@@ -464,7 +464,7 @@ void paste_server(
if (unlikely(req.count > 64)) req.count = 64;
log(_info,
- "<%.*s> request type: firehose count %i offset %li",
+ "<%.*s> request type: firehose count %i offset %lu",
(int) ip_size,
ip_addr,
req.count,
@@ -473,38 +473,20 @@ void paste_server(
water_splash entries[ req.count ];
uint16_t copied_count = firehose_get_packets(req.offset, req.count, entries);
- size_t total_packets_size = PACKET_SIZE * copied_count;
-
- size_t output_len = 1 + 8 + total_packets_size;
+ size_t output_len = 1 + 8 + (sizeof(water_splash) * copied_count);
byte* output_data = calloc(output_len, sizeof(byte));
output_data[ 0 ] = firehose_reply;
size_t offset = 1;
- uint64_t new_offset = req.offset + copied_count;
- output_data[ offset++ ] = new_offset & 0xFF;
- output_data[ offset++ ] = (new_offset >> 8) & 0xFF;
- output_data[ offset++ ] = (new_offset >> 16) & 0xFF;
- output_data[ offset++ ] = (new_offset >> 24) & 0xFF;
- output_data[ offset++ ] = (new_offset >> 32) & 0xFF;
- output_data[ offset++ ] = (new_offset >> 40) & 0xFF;
- output_data[ offset++ ] = (new_offset >> 48) & 0xFF;
- output_data[ offset++ ] = (new_offset >> 56) & 0xFF;
+ uint64_t new_offset = req.offset + copied_count;
+ write_u64_le(output_data + offset, new_offset);
+ offset += 8;
for (int i = 0; i < copied_count; i++) {
- struct data_packet_entry* entry = &packet_index[ entries[ i ].storage_index ];
- byte decompressed[ sizeof(struct data_packet) ];
- uLongf decompressed_len = sizeof(struct data_packet);
- if (uncompress(
- decompressed,
- &decompressed_len,
- entry->compressed_payload,
- entry->compressed_size)
- != Z_OK) {
- log(_error, "firehose: decompression failed");
- continue;
- }
- data_packet2s(*(struct data_packet*) decompressed, output_data + offset);
- offset += PACKET_SIZE;
+ memcpy(output_data + offset, &entries[ i ].storage_index, 8);
+ offset += 8;
+ memcpy(output_data + offset, entries[ i ].packet_hash, 32);
+ offset += 32;
}
reply(output_len, output_data);
@@ -540,7 +522,12 @@ void paste_server(
for (int j = 0; j < 8; j++) {
uint16_t word
= (neighbor.v6_addr[ j * 2 ] << 8) | neighbor.v6_addr[ j * 2 + 1 ];
- offset += sprintf(ip_string + offset, "%x%s", word, (j < 7) ? ":" : "");
+ offset += snprintf(
+ ip_string + offset,
+ sizeof(ip_string) - offset,
+ "%x%s",
+ word,
+ (j < 7) ? ":" : "");
}
}
@@ -821,8 +808,10 @@ void save_packet(const struct data_packet packet) {
}
}
+char* global_neighbors_save_path = "neighbors.bin";
+
void save_neighbors() {
- FILE* file = fopen("neighbors.bin", "wb");
+ FILE* file = fopen(global_neighbors_save_path, "wb");
if (!file) {
perror("failed to save neighbors");
return;
@@ -843,7 +832,7 @@ void save_neighbors() {
}
void load_neighbors() {
- FILE* file = fopen("neighbors.bin", "rb");
+ FILE* file = fopen(global_neighbors_save_path, "rb");
if (!file) { return; }
size_t count = 0;
@@ -1065,6 +1054,12 @@ int main(int argc, char** argv) {
free(port);
}
+ char* packets_path = get_config("packets_dir", false);
+ if (packets_path) global_packets_dir_path = packets_path;
+
+ char* neighbors_save_path = get_config("neighbors_path", false);
+ if (neighbors_save_path) global_neighbors_save_path = neighbors_save_path;
+
fprintf(
stderr,
"-- moonpaste server v%i.%i --\n"