Fix: Remove compiler warnings (signedness, unused functions, snprintf truncation)

- Cast st_size to uint64_t to match file_size type in server.c
- Remove unused functions: send_one_file, send_file_udp, verify_and_resend
- Reduce rel buffer size to 1024 to prevent snprintf truncation in collect_files

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
Theo Tappe
2026-06-24 12:42:12 +02:00
parent 64fa6ee9dd
commit bc46269f37
4 changed files with 2 additions and 149 deletions
BIN
View File
Binary file not shown.
+1 -148
View File
@@ -71,153 +71,6 @@ typedef struct {
static atomic_uint_fast64_t g_bytes_sent = 0;
static atomic_uint_fast32_t g_files_sent = 0;
// ─── UDP helpers ──────────────────────────────────────────────────────────
static int verify_and_resend(sync_ctx_t *ctx, int file_fd,
uint32_t file_id, uint64_t file_size) {
uint32_t total_blocks = (file_size + UDP_PAYLOAD_MAX - 1) / UDP_PAYLOAD_MAX;
while (1) {
uint32_t req = MAGIC_VERIFY;
if (writen(ctx->tcp_fd, &req, sizeof(req)) != sizeof(req)) return -1;
if (writen(ctx->tcp_fd, &file_id, sizeof(file_id)) != sizeof(file_id)) return -1;
uint32_t missing = 0;
if (readn(ctx->tcp_fd, &missing, sizeof(missing)) != sizeof(missing)) return -1;
if (missing == 0) break;
uint32_t *ids = malloc(missing * sizeof(uint32_t));
if (!ids) { perror("malloc"); return -1; }
if (readn(ctx->tcp_fd, ids, missing * sizeof(uint32_t))
!= (ssize_t)(missing * sizeof(uint32_t))) { free(ids); return -1; }
printf("[thread] Resending %u missing blocks...\n", missing);
for (uint32_t i = 0; i < missing; i++) {
uint32_t bid = ids[i];
if (bid >= total_blocks) continue;
uint64_t off = (uint64_t)bid * UDP_PAYLOAD_MAX;
if (lseek(file_fd, off, SEEK_SET) == (off_t)-1) { perror("lseek"); continue; }
char payload[UDP_PAYLOAD_MAX];
ssize_t nr = read(file_fd, payload, UDP_PAYLOAD_MAX);
if (nr <= 0) continue;
udp_packet_header_t hdr;
hdr.magic = MAGIC_UDP_DATA;
hdr.session_id = ctx->udp_session_id;
hdr.file_id = file_id;
hdr.block_id = bid;
hdr.block_offset = off;
hdr.payload_len = nr;
char pkt[sizeof(hdr) + UDP_PAYLOAD_MAX];
memcpy(pkt, &hdr, sizeof(hdr));
memcpy(pkt + sizeof(hdr), payload, nr);
sendto(ctx->udp_fd, pkt, sizeof(hdr) + nr, 0,
(struct sockaddr *)&ctx->udp_server_addr,
sizeof(ctx->udp_server_addr));
}
free(ids);
}
return 0;
}
static int send_file_udp(sync_ctx_t *ctx, const char *full_path,
uint32_t file_id, uint64_t file_size) {
int fd = open(full_path, O_RDONLY);
if (fd < 0) { perror("open"); return -1; }
uint32_t total = (file_size + UDP_PAYLOAD_MAX - 1) / UDP_PAYLOAD_MAX;
printf("[thread] UDP send: %s (%u blocks)\n", full_path, total);
for (uint32_t bid = 0; bid < total; bid++) {
char payload[UDP_PAYLOAD_MAX];
ssize_t nr = read(fd, payload, UDP_PAYLOAD_MAX);
if (nr <= 0) break;
udp_packet_header_t hdr;
hdr.magic = MAGIC_UDP_DATA;
hdr.session_id = ctx->udp_session_id;
hdr.file_id = file_id;
hdr.block_id = bid;
hdr.block_offset = (uint64_t)bid * UDP_PAYLOAD_MAX;
hdr.payload_len = nr;
char pkt[sizeof(hdr) + UDP_PAYLOAD_MAX];
memcpy(pkt, &hdr, sizeof(hdr));
memcpy(pkt + sizeof(hdr), payload, nr);
sendto(ctx->udp_fd, pkt, sizeof(hdr) + nr, 0,
(struct sockaddr *)&ctx->udp_server_addr,
sizeof(ctx->udp_server_addr));
}
int ret = verify_and_resend(ctx, fd, file_id, file_size);
close(fd);
return ret;
}
// ─── Send a single file over one connection (TCP or UDP data) ─────────────
static int send_one_file(sync_ctx_t *ctx, const char *full_path,
const char *rel_path) {
struct stat st;
if (stat(full_path, &st) < 0) { perror("stat"); return -1; }
file_meta_t meta;
meta.magic = MAGIC_META;
meta.name_len = strlen(rel_path);
meta.file_size = st.st_size;
meta.mode = st.st_mode;
if (writen(ctx->tcp_fd, &meta, sizeof(meta)) != sizeof(meta)) return -1;
if (writen(ctx->tcp_fd, rel_path, meta.name_len) != (ssize_t)meta.name_len) return -1;
file_response_t resp;
if (readn(ctx->tcp_fd, &resp, sizeof(resp)) != sizeof(resp)) return -1;
if (resp.response == RESP_SKIP) {
printf("[thread] Skip: %s\n", rel_path);
return 0;
} else if (resp.response == RESP_USE_UDP) {
if (send_file_udp(ctx, full_path, resp.file_id, meta.file_size) < 0)
return -1;
uint32_t ack = 0;
if (readn(ctx->tcp_fd, &ack, sizeof(ack)) != sizeof(ack)
|| ack != RESP_OK) {
fprintf(stderr, "[thread] UDP finalize failed: %s\n", rel_path);
return -1;
}
} else if (resp.response == RESP_SEND_DATA) {
int fd = open(full_path, O_RDONLY);
if (fd < 0) { perror("open"); return -1; }
off_t off = 0;
while (off < (off_t)meta.file_size) {
ssize_t r = sendfile(ctx->tcp_fd, fd, &off, meta.file_size - off);
if (r < 0) {
if (errno == EINTR) continue;
perror("sendfile"); close(fd); return -1;
}
if (r == 0) break;
}
close(fd);
uint32_t ack = 0;
if (readn(ctx->tcp_fd, &ack, sizeof(ack)) != sizeof(ack)
|| ack != RESP_OK) {
fprintf(stderr, "[thread] TCP finalize failed: %s\n", rel_path);
return -1;
}
} else {
fprintf(stderr, "[thread] Server rejected %s (code %u)\n",
rel_path, resp.response);
return -1;
}
atomic_fetch_add(&g_bytes_sent, meta.file_size);
atomic_fetch_add(&g_files_sent, 1);
printf("[thread] Sent: %s\n", rel_path);
return 0;
}
// ─── UDP session setup (called once per worker if -u) ─────────────────────
static int setup_udp(sync_ctx_t *ctx, const char *host) {
@@ -473,7 +326,7 @@ static int collect_files(const char *base, const char *sub, file_task_t **list,
while ((e = readdir(dir)) != NULL) {
if (!strcmp(e->d_name, ".") || !strcmp(e->d_name, "..")) continue;
char rel[2048], full[2048];
char rel[1024], full[2048];
if (sub && sub[0]) {
snprintf(rel, sizeof(rel), "%s/%s", sub, e->d_name);
} else {
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -353,7 +353,7 @@ void handle_client(int sock_fd, const char *dest_dir) {
// Check if file already exists with same size and checksum (skip if so)
struct stat existing_st;
if (stat(target_path, &existing_st) == 0 &&
existing_st.st_size == meta.file_size &&
(uint64_t)existing_st.st_size == meta.file_size &&
S_ISREG(existing_st.st_mode)) {
// File exists with same size - check checksum
uint64_t existing_checksum = fast_hash_file(target_path, meta.file_size);