|
|
|
|
@ -23,9 +23,10 @@ static int disk_error(const char* operation, const char* path) {
|
|
|
|
|
#ifdef ELOOP |
|
|
|
|
if (error == ELOOP) status = MF_INVALID_PATH; |
|
|
|
|
#endif |
|
|
|
|
if (status == MF_NOT_FOUND || status == MF_EXISTS) |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_MEDIA, "member_files: disk %s path=%s status=%s", operation, path ? path : "", mf_status_text(status)); |
|
|
|
|
else DEBUG_WARN(DEBUG_CATEGORY_MEDIA, "member_files: disk %s path=%s errno=%d (%s)", operation, path ? path : "", error, strerror(error)); |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "member_files: disk %s path=%s status=%s errno=%d (%s)", operation, |
|
|
|
|
path ? path : "", mf_status_text(status), error, strerror(error)); |
|
|
|
|
if (status != MF_NOT_FOUND && status != MF_EXISTS) |
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_MEDIA, "member_files: disk %s path=%s errno=%d (%s)", operation, path ? path : "", error, strerror(error)); |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -41,9 +42,9 @@ static int disk_wide(const char* path, wchar_t* wide, size_t cap) {
|
|
|
|
|
|
|
|
|
|
static int disk_win_error(const char* operation) { |
|
|
|
|
DWORD e = GetLastError(); |
|
|
|
|
if (e == ERROR_FILE_NOT_FOUND || e == ERROR_PATH_NOT_FOUND || e == ERROR_ALREADY_EXISTS || e == ERROR_FILE_EXISTS) |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_MEDIA, "member_files: %s winerr=%lu", operation, e); |
|
|
|
|
else DEBUG_WARN(DEBUG_CATEGORY_MEDIA, "member_files: %s winerr=%lu", operation, e); |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "member_files: %s winerr=%lu", operation, e); |
|
|
|
|
if (e != ERROR_FILE_NOT_FOUND && e != ERROR_PATH_NOT_FOUND && e != ERROR_ALREADY_EXISTS && e != ERROR_FILE_EXISTS) |
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_MEDIA, "member_files: %s winerr=%lu", operation, e); |
|
|
|
|
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; |
|
|
|
|
@ -349,6 +350,7 @@ int mf_disk_local_remove(const char* path) { return !unlink(path) || errno == EN
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
int mf_disk_read(int fd, uint64_t offset, void* data, size_t size) { |
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_DEBUG, "member_files: disk read fd=%d offset=%llu bytes=%zu", fd, (unsigned long long)offset, size); |
|
|
|
|
size_t done = 0; |
|
|
|
|
while (done < size) { |
|
|
|
|
#ifdef _WIN32 |
|
|
|
|
@ -362,9 +364,11 @@ int mf_disk_read(int fd, uint64_t offset, void* data, size_t size) {
|
|
|
|
|
(unsigned long long)offset, size, done, errno); return MF_IO_ERROR; } |
|
|
|
|
done += (size_t)n; |
|
|
|
|
} |
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_DEBUG, "member_files: disk read done fd=%d bytes=%zu", fd, done); |
|
|
|
|
return MF_OK; |
|
|
|
|
} |
|
|
|
|
int mf_disk_write(int fd, uint64_t offset, const void* data, size_t size) { |
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_DEBUG, "member_files: disk write fd=%d offset=%llu bytes=%zu", fd, (unsigned long long)offset, size); |
|
|
|
|
size_t done = 0; |
|
|
|
|
while (done < size) { |
|
|
|
|
#ifdef _WIN32 |
|
|
|
|
@ -377,11 +381,13 @@ int mf_disk_write(int fd, uint64_t offset, const void* data, size_t size) {
|
|
|
|
|
if (n <= 0) return disk_error("write", NULL); |
|
|
|
|
done += (size_t)n; |
|
|
|
|
} |
|
|
|
|
DEBUG_TRACE(DEBUG_CATEGORY_DEBUG, "member_files: disk write done fd=%d bytes=%zu", fd, done); |
|
|
|
|
return MF_OK; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Полное хеширование выполняется только worker, с ограниченным буфером. */ |
|
|
|
|
int mf_disk_hash(int fd, uint64_t size, uint8_t hash[32]) { |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "member_files: hash start fd=%d bytes=%llu", fd, (unsigned long long)size); |
|
|
|
|
EVP_MD_CTX* ctx = EVP_MD_CTX_new(); |
|
|
|
|
int rc = MF_IO_ERROR; |
|
|
|
|
if (!ctx || EVP_DigestInit_ex(ctx, EVP_sha256(), NULL) != 1) goto out; |
|
|
|
|
@ -396,6 +402,7 @@ int mf_disk_hash(int fd, uint64_t size, uint8_t hash[32]) {
|
|
|
|
|
rc = EVP_DigestFinal_ex(ctx, hash, &n) == 1 && n == 32 ? MF_OK : MF_IO_ERROR; |
|
|
|
|
out: |
|
|
|
|
EVP_MD_CTX_free(ctx); |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "member_files: hash done fd=%d status=%s", fd, mf_status_text(rc)); |
|
|
|
|
if (rc) DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "member_files: hash failed size=%llu status=%d", (unsigned long long)size, rc); |
|
|
|
|
return rc; |
|
|
|
|
} |
|
|
|
|
|