From c74385603ca27878c820d1aa478153f3c29fc4c2 Mon Sep 17 00:00:00 2001 From: falkTX Date: Wed, 25 Sep 2019 02:04:22 +0100 Subject: [PATCH] Cleanup metadata on server close --- common/JackClient.h | 2 ++ common/JackEngine.cpp | 2 +- common/JackLibGlobals.h | 3 ++- common/JackMetadata.cpp | 57 +++++++++++++++++++++++++++++++++++-------------- common/JackMetadata.h | 5 +++-- 5 files changed, 49 insertions(+), 20 deletions(-) diff --git a/common/JackClient.h b/common/JackClient.h index 3270933a..a0e506e7 100644 --- a/common/JackClient.h +++ b/common/JackClient.h @@ -130,6 +130,8 @@ class SERVER_EXPORT JackClient : public JackClientInterface, public JackRunnable JackClient(JackSynchro* table); virtual ~JackClient(); + + char* GetServerName() { return fServerName; } virtual int Open(const char* server_name, const char* name, jack_uuid_t uuid, jack_options_t options, jack_status_t* status) = 0; virtual int Close(); diff --git a/common/JackEngine.cpp b/common/JackEngine.cpp index 14718762..229de0f1 100644 --- a/common/JackEngine.cpp +++ b/common/JackEngine.cpp @@ -46,7 +46,7 @@ JackEngine::JackEngine(JackGraphManager* manager, char self_connect_mode) : JackLockAble(control->fServerName), fSignal(control->fServerName), - fMetadata(NULL) // FIXME use control->fServerName? + fMetadata(true) { fGraphManager = manager; fSynchroTable = table; diff --git a/common/JackLibGlobals.h b/common/JackLibGlobals.h index 16d93fde..bca775a3 100644 --- a/common/JackLibGlobals.h +++ b/common/JackLibGlobals.h @@ -70,7 +70,7 @@ struct JackLibGlobals fGraphManager = -1; fEngineControl = -1; - fMetadata = new JackMetadata(NULL); + fMetadata = new JackMetadata(false); // Filter SIGPIPE to avoid having client get a SIGPIPE when trying to access a died server. #ifdef WIN32 @@ -92,6 +92,7 @@ struct JackLibGlobals JackMessageBuffer::Destroy(); delete fMetadata; + fMetadata = NULL; // Restore old signal mask #ifdef WIN32 diff --git a/common/JackMetadata.cpp b/common/JackMetadata.cpp index dadb7bdf..75d4b3b5 100644 --- a/common/JackMetadata.cpp +++ b/common/JackMetadata.cpp @@ -1,6 +1,7 @@ /* Copyright (C) 2011 David Robillard Copyright (C) 2013 Paul Davis + Copyright (C) 2019 Filipe Coelho This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -22,6 +23,7 @@ #include "JackClient.h" #include +#include #include @@ -32,33 +34,54 @@ LIB_EXPORT const char* JACK_METADATA_PORT_GROUP = "http://jackaudio.org/metadata LIB_EXPORT const char* JACK_METADATA_ICON_SMALL = "http://jackaudio.org/metadata/icon-small"; LIB_EXPORT const char* JACK_METADATA_ICON_LARGE = "http://jackaudio.org/metadata/icon-large"; - namespace Jack { -JackMetadata::JackMetadata(const char* server_name) +JackMetadata::JackMetadata(bool isEngine) #if HAVE_DB - : fDB(NULL), fDBenv(NULL) + : fDB(NULL), fDBenv(NULL), fIsEngine(isEngine) #endif { - PropertyInit(server_name); + PropertyInit(); } JackMetadata::~JackMetadata() { #if HAVE_DB + char dbpath[PATH_MAX + 1]; + if (fDB) { fDB->close (fDB, 0); fDB = NULL; } if (fDBenv) { fDBenv->close (fDBenv, 0); - fDBenv = 0; + fDBenv = NULL; + } + + if (fIsEngine) + { + // cleanup after libdb, nasty! + snprintf (dbpath, sizeof(dbpath), "%s/jack_db/metadata.db", jack_server_dir); + remove (dbpath); + + snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.001", jack_server_dir); + remove (dbpath); + + snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.002", jack_server_dir); + remove (dbpath); + + snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.003", jack_server_dir); + remove (dbpath); + + // remove our custom dir + snprintf (dbpath, sizeof(dbpath), "%s/jack_db", jack_server_dir); + rmdir (dbpath); } #endif } -int JackMetadata::PropertyInit(const char* server_name) +int JackMetadata::PropertyInit() { #if HAVE_DB @@ -76,7 +99,10 @@ int JackMetadata::PropertyInit(const char* server_name) return -1; } - if ((ret = fDBenv->open (fDBenv, jack_server_dir /*FIXME:(server_name, server_dir)*/, DB_CREATE | DB_INIT_LOCK | DB_INIT_MPOOL | DB_THREAD, 0)) != 0) { + snprintf (dbpath, sizeof(dbpath), "%s/jack_db", jack_server_dir); + mkdir (dbpath, S_IRWXU | S_IRWXG); + + if ((ret = fDBenv->open (fDBenv, dbpath, DB_CREATE | DB_INIT_LOCK | DB_INIT_MPOOL | DB_THREAD, 0)) != 0) { jack_error ("cannot open DB environment: %s", db_strerror (ret)); return -1; } @@ -86,8 +112,7 @@ int JackMetadata::PropertyInit(const char* server_name) return -1; } - snprintf (dbpath, sizeof(dbpath), "%s/%s", jack_server_dir /*FIXME:(server_name, server_dir)*/, "metadata.db"); - + snprintf (dbpath, sizeof(dbpath), "%s/jack_db/metadata.db", jack_server_dir); if ((ret = fDB->open (fDB, NULL, dbpath, NULL, DB_HASH, DB_CREATE | DB_THREAD, 0666)) != 0) { jack_error ("Cannot open metadata DB at %s: %s", dbpath, db_strerror (ret)); fDB->close (fDB, 0); @@ -152,7 +177,7 @@ int JackMetadata::SetProperty(JackClient* client, jack_uuid_t subject, const cha return -1; } - if (PropertyInit(NULL)) { + if (PropertyInit()) { return -1; } @@ -227,7 +252,7 @@ int JackMetadata::GetProperty(jack_uuid_t subject, const char* key, char** value return -1; } - if (PropertyInit(NULL)) { + if (PropertyInit()) { return -1; } @@ -319,7 +344,7 @@ int JackMetadata::GetProperties(jack_uuid_t subject, jack_description_t* desc) memset (ustr, 0, JACK_UUID_STRING_SIZE); jack_uuid_unparse (subject, ustr); - if (PropertyInit(NULL)) { + if (PropertyInit()) { return -1; } @@ -447,7 +472,7 @@ int JackMetadata::GetAllProperties(jack_description_t** descriptions) jack_property_t* current_prop = NULL; size_t len1, len2; - if (PropertyInit(NULL)) { + if (PropertyInit()) { return -1; } @@ -604,7 +629,7 @@ int JackMetadata::RemoveProperty(JackClient* client, jack_uuid_t subject, const DBT d_key; int ret; - if (PropertyInit(NULL)) { + if (PropertyInit()) { return -1; } @@ -645,7 +670,7 @@ int JackMetadata::RemoveProperties(JackClient* client, jack_uuid_t subject) memset (ustr, 0, JACK_UUID_STRING_SIZE); jack_uuid_unparse (subject, ustr); - if (PropertyInit(NULL)) { + if (PropertyInit() || fDB == NULL) { return -1; } @@ -720,7 +745,7 @@ int JackMetadata::RemoveAllProperties(JackClient* client) int ret; jack_uuid_t empty_uuid = JACK_UUID_EMPTY_INITIALIZER; - if (PropertyInit(NULL)) { + if (PropertyInit()) { return -1; } diff --git a/common/JackMetadata.h b/common/JackMetadata.h index 6968183d..cd66f8ac 100644 --- a/common/JackMetadata.h +++ b/common/JackMetadata.h @@ -77,9 +77,10 @@ class JackMetadata #if HAVE_DB DB* fDB; DB_ENV* fDBenv; + const bool fIsEngine; #endif - int PropertyInit(const char* server_name); + int PropertyInit(); int PropertyChangeNotify(JackClient* client, jack_uuid_t subject, const char* key, jack_property_change_t change); #if HAVE_DB @@ -88,7 +89,7 @@ class JackMetadata public: - JackMetadata(const char* server_name = NULL); + JackMetadata(bool isEngine); ~JackMetadata(); int GetProperty(jack_uuid_t subject, const char* key, char** value, char** type); -- 2.11.4.GIT