Browse Source

Report nonempty member file directories precisely

master
evgeny 7 days ago
parent
commit
e0a287d797
  1. 2
      src/member_files/disk.c
  2. 7
      src/member_files/protocol.c
  3. 2
      src/member_files/protocol.h

2
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;
}

7
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) {

2
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 {

Loading…
Cancel
Save