From e0a287d7979581a7aabf5295c55976942d703da0 Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 10 Oct 2026 01:11:54 +0200 Subject: [PATCH] Report nonempty member file directories precisely --- src/member_files/disk.c | 2 ++ src/member_files/protocol.c | 7 ++++--- src/member_files/protocol.h | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/member_files/disk.c b/src/member_files/disk.c index 53ba65fc..fb364f1b 100644 --- a/src/member_files/disk.c +++ b/src/member_files/disk.c @@ -17,6 +17,7 @@ static int disk_error(const char* operation, const char* path) { int error = errno; int status = error == ENOENT ? MF_NOT_FOUND : error == EEXIST ? MF_EXISTS : error == ENOSPC ? MF_NO_SPACE : error == ENOTDIR ? MF_INVALID_PATH : MF_IO_ERROR; + if (error == ENOTEMPTY || (error == EEXIST && !strcmp(operation, "remove"))) status = MF_DIRECTORY_NOT_EMPTY; #ifdef EDQUOT if (error == EDQUOT) status = MF_NO_SPACE; #endif @@ -48,6 +49,7 @@ static int disk_win_error(const char* operation) { if (e == ERROR_FILE_NOT_FOUND || e == ERROR_PATH_NOT_FOUND) return MF_NOT_FOUND; if (e == ERROR_ALREADY_EXISTS || e == ERROR_FILE_EXISTS) return MF_EXISTS; if (e == ERROR_DISK_FULL || e == ERROR_HANDLE_DISK_FULL) return MF_NO_SPACE; + if (e == ERROR_DIR_NOT_EMPTY) return MF_DIRECTORY_NOT_EMPTY; return MF_IO_ERROR; } diff --git a/src/member_files/protocol.c b/src/member_files/protocol.c index 6163ad4f..4d67a45e 100644 --- a/src/member_files/protocol.c +++ b/src/member_files/protocol.c @@ -111,7 +111,7 @@ int mf_decode(const uint8_t* p, size_t n, struct mf_message* m) { m->type = p[117]; m->more = p[118]; m->data_len = (uint32_t)d; memcpy(m->path, p + MF_WIRE_HEADER, a); memcpy(m->target, p + MF_WIRE_HEADER + a, b); memcpy(m->data, p + MF_WIRE_HEADER + a + b, d); - if (!m->request_id || m->status > MF_TIMEOUT || (m->kind == MF_REQUEST && m->status)) goto bad; + if (!m->request_id || m->status > MF_DIRECTORY_NOT_EMPTY || (m->kind == MF_REQUEST && m->status)) goto bad; return 0; bad: DEBUG_WARN(DEBUG_CATEGORY_MEDIA, "member_files: malformed wire packet bytes=%zu", n); @@ -120,8 +120,9 @@ bad: const char* mf_status_text(int status) { static const char* texts[] = { "OK", "Access denied", "Not found", "Invalid path", "Invalid range", "Already exists", - "Busy", "File changed", "Storage full", "I/O error", "Invalid packet", "Hash mismatch", "Cancelled", "Timeout" }; - return status >= 0 && status <= MF_TIMEOUT ? texts[status] : "Unknown error"; + "Busy", "File changed", "Storage full", "I/O error", "Invalid packet", "Hash mismatch", "Cancelled", "Timeout", + "Directory not empty" }; + return status >= 0 && status <= MF_DIRECTORY_NOT_EMPTY ? texts[status] : "Unknown error"; } const char* mf_command_text(int command) { diff --git a/src/member_files/protocol.h b/src/member_files/protocol.h index 743a760c..45ee9a15 100644 --- a/src/member_files/protocol.h +++ b/src/member_files/protocol.h @@ -41,7 +41,7 @@ enum mf_command { }; enum mf_status { MF_OK, MF_ACCESS_DENIED, MF_NOT_FOUND, MF_INVALID_PATH, MF_INVALID_RANGE, MF_EXISTS, - MF_BUSY, MF_STALE, MF_NO_SPACE, MF_IO_ERROR, MF_BAD_PACKET, MF_HASH_MISMATCH, MF_CANCELLED, MF_TIMEOUT + MF_BUSY, MF_STALE, MF_NO_SPACE, MF_IO_ERROR, MF_BAD_PACKET, MF_HASH_MISMATCH, MF_CANCELLED, MF_TIMEOUT, MF_DIRECTORY_NOT_EMPTY }; struct mf_message {