input/Open: use OpenLocalInputStream()

Make the "open" method of plugins "file" and "archive" dummy methods
that always fail.  Instead, let InputStream::Open() hard-code access
to these two plugins by using OpenLocalInputStream().  This allows
simplifyin the algorithm for falling back to probing archive plugins.
This commit is contained in:
Max Kellermann
2014-10-02 21:17:31 +02:00
parent 20346b0da4
commit 7e12aea1d8
5 changed files with 34 additions and 33 deletions

View File

@@ -31,6 +31,10 @@
#include <assert.h>
#ifdef ENABLE_ARCHIVE
#include <errno.h>
#endif
InputStream *
OpenLocalInputStream(Path path, Mutex &mutex, Cond &cond, Error &error)
{
@@ -38,8 +42,15 @@ OpenLocalInputStream(Path path, Mutex &mutex, Cond &cond, Error &error)
InputStream *is = OpenFileInputStream(path, mutex, cond, error);
#ifdef ENABLE_ARCHIVE
if (is == nullptr && !error.IsDefined())
is = OpenArchiveInputStream(path, mutex, cond, error);
if (is == nullptr && error.IsDomain(errno_domain) &&
error.GetCode() == ENOTDIR) {
/* ENOTDIR means this may be a path inside an archive
file */
Error error2;
is = OpenArchiveInputStream(path, mutex, cond, error2);
if (is == nullptr && error2.IsDefined())
error = std::move(error2);
}
#endif
assert(is == nullptr || is->IsReady());