From b5119d79580d923602f9b144f9b194814317e6e4 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 7 Oct 2014 06:07:00 +0200 Subject: [PATCH] test/run_storage: new debug program --- Makefile.am | 15 ++++- test/run_storage.cxx | 130 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 test/run_storage.cxx diff --git a/Makefile.am b/Makefile.am index 80894d504..98942e64b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -581,9 +581,9 @@ libstorage_a_CPPFLAGS = $(AM_CPPFLAGS) \ $(SMBCLIENT_CFLAGS) STORAGE_LIBS = \ + libstorage.a \ $(NFS_LIBS) \ - $(SMBCLIENT_LIBS) \ - libstorage.a + $(SMBCLIENT_LIBS) if ENABLE_SMBCLIENT libstorage_a_SOURCES += \ @@ -1514,6 +1514,7 @@ noinst_PROGRAMS = \ if ENABLE_DATABASE noinst_PROGRAMS += test/DumpDatabase +noinst_PROGRAMS += test/run_storage endif if ENABLE_NEIGHBOR_PLUGINS @@ -1584,6 +1585,16 @@ if HAVE_LIBUPNP test_DumpDatabase_SOURCES += src/lib/expat/ExpatParser.cxx endif +test_run_storage_LDADD = \ + $(STORAGE_LIBS) \ + $(FS_LIBS) \ + libsystem.a \ + libutil.a \ + $(GLIB_LIBS) +test_run_storage_SOURCES = \ + src/Log.cxx src/LogBackend.cxx \ + test/run_storage.cxx + endif test_run_input_LDADD = \ diff --git a/test/run_storage.cxx b/test/run_storage.cxx new file mode 100644 index 000000000..45575b9e0 --- /dev/null +++ b/test/run_storage.cxx @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2003-2014 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" +#include "storage/Registry.hxx" +#include "storage/StorageInterface.hxx" +#include "storage/FileInfo.hxx" +#include "util/Error.hxx" + +#ifdef HAVE_GLIB +#include +#endif + +#include + +#include +#include +#include +#include + +static Storage * +MakeStorage(const char *uri) +{ + Error error; + Storage *storage = CreateStorageURI(uri, error); + if (storage == nullptr) { + fprintf(stderr, "%s\n", error.GetMessage()); + exit(EXIT_FAILURE); + } + + return storage; +} + +static int +Ls(Storage &storage, const char *path) +{ + Error error; + auto dir = storage.OpenDirectory(path, error); + if (dir == nullptr) { + fprintf(stderr, "%s\n", error.GetMessage()); + return EXIT_FAILURE; + } + + const char *name; + while ((name = dir->Read()) != nullptr) { + FileInfo info; + if (!dir->GetInfo(false, info, error)) { + printf("Error on %s: %s\n", name, error.GetMessage()); + error.Clear(); + continue; + } + + const char *type = "unk"; + switch (info.type) { + case FileInfo::Type::OTHER: + type = "oth"; + break; + + case FileInfo::Type::REGULAR: + type = "reg"; + break; + + case FileInfo::Type::DIRECTORY: + type = "dir"; + break; + } + + char mtime[32]; + strftime(mtime, sizeof(mtime), "%F", gmtime(&info.mtime)); + + printf("%s %10llu %s %s\n", + type, (unsigned long long)info.size, + mtime, name); + } + + delete dir; + return EXIT_SUCCESS; +} + +int +main(int argc, char **argv) +{ + if (argc < 3) { + fprintf(stderr, "Usage: run_storage COMMAND URI ...\n"); + return EXIT_FAILURE; + } + + /* initialize GLib */ + +#ifdef HAVE_GLIB +#if !GLIB_CHECK_VERSION(2,32,0) + g_thread_init(NULL); +#endif +#endif + + const char *const command = argv[1]; + const char *const storage_uri = argv[2]; + + if (strcmp(command, "ls") == 0) { + if (argc != 4) { + fprintf(stderr, "Usage: run_storage ls URI PATH\n"); + return EXIT_FAILURE; + } + + const char *const path = argv[3]; + + std::unique_ptr storage(MakeStorage(storage_uri)); + + return Ls(*storage, path); + } else { + fprintf(stderr, "Unknown command\n"); + return EXIT_FAILURE; + } +}