summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--src/archive/plugins/ZzipArchivePlugin.cxx19
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 <zzip/zzip.h>
@@ -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<ZzipInputStream>(dir, pathname,
mutex,