From 32799ff68289c8e3ad253a883ffcb2b1e711efa5 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 4 Dec 2019 12:29:06 +0100 Subject: [PATCH] archive/zzip: improve error reporting Most importantly, this commit translates ZZIP_ENOENT to std::system_error(ENOENT) so IsFileNotFound() returns true and find_stream_art() can suppress the log line. --- NEWS | 2 ++ src/archive/plugins/ZzipArchivePlugin.cxx | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 5f4b2337f..67f5807b4 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,6 @@ ver 0.21.17 (not yet released) +* archive + - zzip: improve error reporting * outputs - jack: mark ports as terminal - shout: declare metadata as UTF-8 diff --git a/src/archive/plugins/ZzipArchivePlugin.cxx b/src/archive/plugins/ZzipArchivePlugin.cxx index e238dd4ba..31698b978 100644 --- a/src/archive/plugins/ZzipArchivePlugin.cxx +++ b/src/archive/plugins/ZzipArchivePlugin.cxx @@ -1,5 +1,5 @@ /* - * Copyright 2003-2018 The Music Player Daemon Project + * Copyright 2003-2019 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -27,6 +27,7 @@ #include "../ArchiveVisitor.hxx" #include "input/InputStream.hxx" #include "fs/Path.hxx" +#include "system/Error.hxx" #include "util/RuntimeError.hxx" #include @@ -120,9 +121,19 @@ ZzipArchiveFile::OpenStream(const char *pathname, Mutex &mutex) { ZZIP_FILE *_file = zzip_file_open(dir->dir, pathname, 0); - if (_file == nullptr) - throw FormatRuntimeError("not found in the ZIP file: %s", - pathname); + if (_file == nullptr) { + const auto error = (zzip_error_t)zzip_error(dir->dir); + switch (error) { + case ZZIP_ENOENT: + throw FormatFileNotFound("Failed to open '%s' in ZIP file", + pathname); + + default: + throw FormatRuntimeError("Failed to open '%s' in ZIP file: %s", + pathname, + zzip_strerror(error)); + } + } return std::make_unique(dir, pathname, mutex,