From c2ddda26ad60f563d7df425513656646b04840b4 Mon Sep 17 00:00:00 2001 From: TapTap Date: Mon, 20 Jul 2026 18:58:48 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20refactoring=20and=20portability=20?= =?UTF-8?q?=E2=80=94=20issues=20#61,=20#51,=20#52?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/client_cli.c | 4 ++ src/server/server.c | 4 ++ src/shared/data.h | 2 +- src/shared/metadata.c | 135 +++++++++++++++++++++++++++------------- src/shared/metadata.h | 4 +- 5 files changed, 104 insertions(+), 45 deletions(-) diff --git a/src/client/client_cli.c b/src/client/client_cli.c index d7cff62..c0758e3 100644 --- a/src/client/client_cli.c +++ b/src/client/client_cli.c @@ -56,6 +56,7 @@ static void print_usage(void) { printf(" --key TLS private key file (PEM)\n"); printf(" --ca TLS CA certificate file (PEM)\n"); printf(" --help Show this help\n"); + printf(" -V, --version Show version and exit\n"); } int main(int argc, char* argv[]) { @@ -80,6 +81,9 @@ int main(int argc, char* argv[]) { if (strcmp(argv[i], "--help") == 0) { print_usage(); goto cleanup; + } else if (strcmp(argv[i], "-V") == 0 || strcmp(argv[i], "--version") == 0) { + printf("fastsync version %s\n", PROTOCOL_VERSION); + goto cleanup; } else if (strcmp(argv[i], "-a") == 0 || strcmp(argv[i], "--archive") == 0) { config->use_compression = true; config->use_multithreading = true; diff --git a/src/server/server.c b/src/server/server.c index d3bbc74..43e3819 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -135,6 +135,7 @@ static void print_server_usage(void) { printf(" --ca TLS CA certificate file (PEM)\n"); printf(" -v, --verbose Enable debug logging\n"); printf(" --help Show this help\n"); + printf(" -V, --version Show version and exit\n"); } int main(int argc, char* argv[]) { @@ -149,6 +150,9 @@ int main(int argc, char* argv[]) { if (strcmp(argv[i], "--help") == 0) { print_server_usage(); return 0; + } else if (strcmp(argv[i], "-V") == 0 || strcmp(argv[i], "--version") == 0) { + printf("fastsync-server version %s\n", PROTOCOL_VERSION); + return 0; } else if (strcmp(argv[i], "--stdio") == 0) { io_set_fds(STDIN_FILENO, STDOUT_FILENO); handler(STDIN_FILENO); diff --git a/src/shared/data.h b/src/shared/data.h index 5246afa..f03fabf 100644 --- a/src/shared/data.h +++ b/src/shared/data.h @@ -1,7 +1,7 @@ #ifndef DATA_H #define DATA_H -#include "stdlib.h" +#include typedef struct { void* data; diff --git a/src/shared/metadata.c b/src/shared/metadata.c index f36e2d6..d93f584 100644 --- a/src/shared/metadata.c +++ b/src/shared/metadata.c @@ -4,6 +4,7 @@ #include "protocol.h" #include #include +#include #include #include #include @@ -11,60 +12,80 @@ #include void metadata_to_buf(char** buf, const FileMetadata* m) { - int present = (m != NULL) ? 1 : 0; - memcpy(*buf, &present, sizeof(int)); - *buf += sizeof(int); + int32_t present = (m != NULL) ? 1 : 0; + memcpy(*buf, &present, sizeof(present)); + *buf += sizeof(present); if (m == NULL) return; - memcpy(*buf, &m->mode, sizeof(mode_t)); - *buf += sizeof(mode_t); - memcpy(*buf, &m->uid, sizeof(uid_t)); - *buf += sizeof(uid_t); - memcpy(*buf, &m->gid, sizeof(gid_t)); - *buf += sizeof(gid_t); - memcpy(*buf, &m->mtime_sec, sizeof(time_t)); - *buf += sizeof(time_t); - memcpy(*buf, &m->mtime_nsec, sizeof(long)); - *buf += sizeof(long); + int32_t mode = (int32_t)m->mode; + memcpy(*buf, &mode, sizeof(mode)); + *buf += sizeof(mode); + int32_t uid = (int32_t)m->uid; + memcpy(*buf, &uid, sizeof(uid)); + *buf += sizeof(uid); + int32_t gid = (int32_t)m->gid; + memcpy(*buf, &gid, sizeof(gid)); + *buf += sizeof(gid); + int64_t mtime_sec = (int64_t)m->mtime_sec; + memcpy(*buf, &mtime_sec, sizeof(mtime_sec)); + *buf += sizeof(mtime_sec); + int64_t mtime_nsec = (int64_t)m->mtime_nsec; + memcpy(*buf, &mtime_nsec, sizeof(mtime_nsec)); + *buf += sizeof(mtime_nsec); } FileMetadata* metadata_from_buf(char** buf) { - int present; - memcpy(&present, *buf, sizeof(int)); - *buf += sizeof(int); + int32_t present; + memcpy(&present, *buf, sizeof(present)); + *buf += sizeof(present); if (!present) return NULL; FileMetadata* m = malloc(sizeof(FileMetadata)); - memcpy(&m->mode, *buf, sizeof(mode_t)); - *buf += sizeof(mode_t); - memcpy(&m->uid, *buf, sizeof(uid_t)); - *buf += sizeof(uid_t); - memcpy(&m->gid, *buf, sizeof(gid_t)); - *buf += sizeof(gid_t); - memcpy(&m->mtime_sec, *buf, sizeof(time_t)); - *buf += sizeof(time_t); - memcpy(&m->mtime_nsec, *buf, sizeof(long)); - *buf += sizeof(long); + int32_t mode; + memcpy(&mode, *buf, sizeof(mode)); + *buf += sizeof(mode); + m->mode = (mode_t)mode; + int32_t uid; + memcpy(&uid, *buf, sizeof(uid)); + *buf += sizeof(uid); + m->uid = (uid_t)uid; + int32_t gid; + memcpy(&gid, *buf, sizeof(gid)); + *buf += sizeof(gid); + m->gid = (gid_t)gid; + int64_t mtime_sec; + memcpy(&mtime_sec, *buf, sizeof(mtime_sec)); + *buf += sizeof(mtime_sec); + m->mtime_sec = (time_t)mtime_sec; + int64_t mtime_nsec; + memcpy(&mtime_nsec, *buf, sizeof(mtime_nsec)); + *buf += sizeof(mtime_nsec); + m->mtime_nsec = (long)mtime_nsec; return m; } bool metadata_send(int file_descriptor, FileMetadata* m) { if (m == NULL) { - int zero = 0; - return send_n_data(file_descriptor, &zero, sizeof(int)); + int32_t zero = 0; + return send_n_data(file_descriptor, &zero, sizeof(zero)); } - int present = 1; - return send_n_data(file_descriptor, &present, sizeof(int)) && - send_n_data(file_descriptor, &m->mode, sizeof(mode_t)) && - send_n_data(file_descriptor, &m->uid, sizeof(uid_t)) && - send_n_data(file_descriptor, &m->gid, sizeof(gid_t)) && - send_n_data(file_descriptor, &m->mtime_sec, sizeof(time_t)) && - send_n_data(file_descriptor, &m->mtime_nsec, sizeof(long)); + int32_t present = 1; + int32_t mode = (int32_t)m->mode; + int32_t uid = (int32_t)m->uid; + int32_t gid = (int32_t)m->gid; + int64_t mtime_sec = (int64_t)m->mtime_sec; + int64_t mtime_nsec = (int64_t)m->mtime_nsec; + return send_n_data(file_descriptor, &present, sizeof(present)) && + send_n_data(file_descriptor, &mode, sizeof(mode)) && + send_n_data(file_descriptor, &uid, sizeof(uid)) && + send_n_data(file_descriptor, &gid, sizeof(gid)) && + send_n_data(file_descriptor, &mtime_sec, sizeof(mtime_sec)) && + send_n_data(file_descriptor, &mtime_nsec, sizeof(mtime_nsec)); } FileMetadata* metadata_receive(int file_descriptor, int* ok) { - int present; - if (!receive_n_data(file_descriptor, &present, sizeof(int))) { + int32_t present; + if (!receive_n_data(file_descriptor, &present, sizeof(present))) { if (ok) *ok = 0; return NULL; @@ -80,16 +101,46 @@ FileMetadata* metadata_receive(int file_descriptor, int* ok) { *ok = 0; return NULL; } - if (!receive_n_data(file_descriptor, &m->mode, sizeof(mode_t)) || - !receive_n_data(file_descriptor, &m->uid, sizeof(uid_t)) || - !receive_n_data(file_descriptor, &m->gid, sizeof(gid_t)) || - !receive_n_data(file_descriptor, &m->mtime_sec, sizeof(time_t)) || - !receive_n_data(file_descriptor, &m->mtime_nsec, sizeof(long))) { + int32_t mode; + if (!receive_n_data(file_descriptor, &mode, sizeof(mode))) { free(m); if (ok) *ok = 0; return NULL; } + m->mode = (mode_t)mode; + int32_t uid; + if (!receive_n_data(file_descriptor, &uid, sizeof(uid))) { + free(m); + if (ok) + *ok = 0; + return NULL; + } + m->uid = (uid_t)uid; + int32_t gid; + if (!receive_n_data(file_descriptor, &gid, sizeof(gid))) { + free(m); + if (ok) + *ok = 0; + return NULL; + } + m->gid = (gid_t)gid; + int64_t mtime_sec; + if (!receive_n_data(file_descriptor, &mtime_sec, sizeof(mtime_sec))) { + free(m); + if (ok) + *ok = 0; + return NULL; + } + m->mtime_sec = (time_t)mtime_sec; + int64_t mtime_nsec; + if (!receive_n_data(file_descriptor, &mtime_nsec, sizeof(mtime_nsec))) { + free(m); + if (ok) + *ok = 0; + return NULL; + } + m->mtime_nsec = (long)mtime_nsec; if (ok) *ok = 1; return m; diff --git a/src/shared/metadata.h b/src/shared/metadata.h index 2ad8b3d..518077b 100644 --- a/src/shared/metadata.h +++ b/src/shared/metadata.h @@ -3,10 +3,10 @@ #include "file.h" #include +#include #include -#define FILE_METADATA_WIRE_SIZE \ - (sizeof(mode_t) + sizeof(uid_t) + sizeof(gid_t) + sizeof(time_t) + sizeof(long)) +#define FILE_METADATA_WIRE_SIZE (sizeof(int32_t) * 3 + sizeof(int64_t) * 2) void metadata_to_buf(char** buf, const FileMetadata* m); FileMetadata* metadata_from_buf(char** buf); -- 2.52.0