diff --git a/common/JackChannel.h b/common/JackChannel.h index ded58814..40cfd264 100644 --- a/common/JackChannel.h +++ b/common/JackChannel.h @@ -50,7 +50,7 @@ class JackClientChannelInterface {} // Open the Server/Client connection - virtual int Open(const char* server_name, const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) + virtual int Open(const char* server_name, const char* name, int uuid, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) { return 0; } @@ -74,7 +74,7 @@ class JackClientChannelInterface return -1; } - virtual void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result) + virtual void ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status, int* result) {} virtual void ClientOpen(const char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result) {} diff --git a/common/JackEngine.cpp b/common/JackEngine.cpp index e9dd4fd3..1b1bf2c5 100644 --- a/common/JackEngine.cpp +++ b/common/JackEngine.cpp @@ -389,7 +389,7 @@ int JackEngine::InternalClientUnload(int refnum, int* status) // Client management //------------------- -int JackEngine::ClientCheck(const char* name, char* name_res, int protocol, int options, int* status) +int JackEngine::ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status) { // Clear status *status = 0; @@ -403,7 +403,11 @@ int JackEngine::ClientCheck(const char* name, char* name_res, int protocol, int return -1; } - if (ClientCheckName(name)) { + std::map::iterator res = fReservationMap.find(uuid); + + if (res != fReservationMap.end()) { + strncpy( name_res, res->second.c_str(), JACK_CLIENT_NAME_SIZE ); + } else if (ClientCheckName(name)) { *status |= JackNameNotUnique; @@ -531,7 +535,7 @@ int JackEngine::ClientExternalOpen(const char* name, int pid, int uuid, int* ref EnsureUUID(uuid); } - jack_log("JackEngine::ClientExternalOpen: name = %s ", real_name); + jack_log("JackEngine::ClientExternalOpen: uuid=%d, name = %s ", uuid, real_name); int refnum = AllocateRefnum(); if (refnum < 0) { @@ -1023,13 +1027,17 @@ void JackEngine::GetClientNameForUUID(const char *uuid, char *name_res, int *res void JackEngine::ReserveClientName(const char *name, const char *uuid, int *result) { + jack_log( "JackEngine::ReserveClientName ( name = %s, uuid = %s )", name, uuid ); + if (ClientCheckName(name)) { *result = -1; + jack_log( "name already taken" ); return; } EnsureUUID(atoi(uuid)); fReservationMap[atoi(uuid)] = name; + *result = 0; } } // end of namespace diff --git a/common/JackEngine.h b/common/JackEngine.h index 4b76ad99..7e2f16ba 100644 --- a/common/JackEngine.h +++ b/common/JackEngine.h @@ -98,7 +98,7 @@ class SERVER_EXPORT JackEngine : public JackLockAble int Close(); // Client management - int ClientCheck(const char* name, char* name_res, int protocol, int options, int* status); + int ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status); int ClientExternalOpen(const char* name, int pid, int uuid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager); int ClientInternalOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, bool wait); diff --git a/common/JackInternalClient.cpp b/common/JackInternalClient.cpp index 355fbf69..0f0e3e2a 100644 --- a/common/JackInternalClient.cpp +++ b/common/JackInternalClient.cpp @@ -71,7 +71,7 @@ int JackInternalClient::Open(const char* server_name, const char* name, int uuid strncpy(fServerName, server_name, sizeof(fServerName)); - fChannel->ClientCheck(name, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result); + fChannel->ClientCheck(name, uuid, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result); if (result < 0) { int status1 = *status; if (status1 & JackVersionError) diff --git a/common/JackInternalClientChannel.h b/common/JackInternalClientChannel.h index bef06007..6a5debfc 100644 --- a/common/JackInternalClientChannel.h +++ b/common/JackInternalClientChannel.h @@ -52,7 +52,7 @@ class JackInternalClientChannel : public detail::JackClientChannelInterface void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result) { - *result = fEngine->ClientCheck(name, name_res, protocol, options, status); + *result = fEngine->ClientCheck(name, -1, name_res, protocol, options, status); } void ClientOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, int* result) { diff --git a/common/JackLibClient.cpp b/common/JackLibClient.cpp index 14dbc733..2b54aa16 100644 --- a/common/JackLibClient.cpp +++ b/common/JackLibClient.cpp @@ -76,7 +76,7 @@ int JackLibClient::Open(const char* server_name, const char* name, int uuid, jac // Open server/client channel char name_res[JACK_CLIENT_NAME_SIZE + 1]; - if (fChannel->Open(server_name, name, name_res, this, options, status) < 0) { + if (fChannel->Open(server_name, name, uuid, name_res, this, options, status) < 0) { jack_error("Cannot connect to the server"); goto error; } diff --git a/common/JackLockedEngine.h b/common/JackLockedEngine.h index 0e646654..b1620859 100644 --- a/common/JackLockedEngine.h +++ b/common/JackLockedEngine.h @@ -96,11 +96,11 @@ class SERVER_EXPORT JackLockedEngine } // Client management - int ClientCheck(const char* name, char* name_res, int protocol, int options, int* status) + int ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status) { TRY_CALL JackLock lock(&fEngine); - return fEngine.ClientCheck(name, name_res, protocol, options, status); + return fEngine.ClientCheck(name, uuid, name_res, protocol, options, status); CATCH_EXCEPTION_RETURN } int ClientExternalOpen(const char* name, int pid, int uuid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager) diff --git a/common/JackRequest.h b/common/JackRequest.h index e27c9bb5..24f77b6b 100644 --- a/common/JackRequest.h +++ b/common/JackRequest.h @@ -135,11 +135,12 @@ struct JackClientCheckRequest : public JackRequest char fName[JACK_CLIENT_NAME_SIZE + 1]; int fProtocol; int fOptions; + int fUUID; JackClientCheckRequest() {} - JackClientCheckRequest(const char* name, int protocol, int options) - : JackRequest(JackRequest::kClientCheck), fProtocol(protocol), fOptions(options) + JackClientCheckRequest(const char* name, int protocol, int options, int uuid) + : JackRequest(JackRequest::kClientCheck), fProtocol(protocol), fOptions(options), fUUID(uuid) { snprintf(fName, sizeof(fName), "%s", name); } @@ -148,7 +149,8 @@ struct JackClientCheckRequest : public JackRequest { CheckRes(trans->Read(&fName, sizeof(fName))); CheckRes(trans->Read(&fProtocol, sizeof(int))); - return trans->Read(&fOptions, sizeof(int)); + CheckRes(trans->Read(&fOptions, sizeof(int))); + return trans->Read(&fUUID, sizeof(int)); } int Write(JackChannelTransaction* trans) @@ -156,7 +158,8 @@ struct JackClientCheckRequest : public JackRequest CheckRes(JackRequest::Write(trans)); CheckRes(trans->Write(&fName, sizeof(fName))); CheckRes(trans->Write(&fProtocol, sizeof(int))); - return trans->Write(&fOptions, sizeof(int)); + CheckRes(trans->Write(&fOptions, sizeof(int))); + return trans->Write(&fUUID, sizeof(int)); } }; diff --git a/posix/JackSocketClientChannel.cpp b/posix/JackSocketClientChannel.cpp index 832feb2c..1a6d7ad5 100644 --- a/posix/JackSocketClientChannel.cpp +++ b/posix/JackSocketClientChannel.cpp @@ -51,7 +51,7 @@ int JackSocketClientChannel::ServerCheck(const char* server_name) } } -int JackSocketClientChannel::Open(const char* server_name, const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) +int JackSocketClientChannel::Open(const char* server_name, const char* name, int uuid, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) { int result = 0; jack_log("JackSocketClientChannel::Open name = %s", name); @@ -62,7 +62,7 @@ int JackSocketClientChannel::Open(const char* server_name, const char* name, cha } // Check name in server - ClientCheck(name, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result); + ClientCheck(name, uuid, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result); if (result < 0) { int status1 = *status; if (status1 & JackVersionError) @@ -142,9 +142,9 @@ void JackSocketClientChannel::ServerAsyncCall(JackRequest* req, JackResult* res, } } -void JackSocketClientChannel::ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result) +void JackSocketClientChannel::ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status, int* result) { - JackClientCheckRequest req(name, protocol, options); + JackClientCheckRequest req(name, protocol, options, uuid); JackClientCheckResult res; ServerSyncCall(&req, &res, result); *status = res.fStatus; diff --git a/posix/JackSocketClientChannel.h b/posix/JackSocketClientChannel.h index 208d4a8f..225887e7 100644 --- a/posix/JackSocketClientChannel.h +++ b/posix/JackSocketClientChannel.h @@ -52,7 +52,7 @@ class JackSocketClientChannel : public detail::JackClientChannelInterface, publi JackSocketClientChannel(); virtual ~JackSocketClientChannel(); - int Open(const char* server_name, const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status); + int Open(const char* server_name, const char* name, int uuid, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status); void Close(); int Start(); @@ -60,7 +60,7 @@ class JackSocketClientChannel : public detail::JackClientChannelInterface, publi int ServerCheck(const char* server_name); - void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result); + void ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status, int* result); void ClientOpen(const char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result); void ClientOpen(const char* name, int* ref, int uuid, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, int* result) {} diff --git a/posix/JackSocketServerChannel.cpp b/posix/JackSocketServerChannel.cpp index 49c3c94c..4e76fdc7 100644 --- a/posix/JackSocketServerChannel.cpp +++ b/posix/JackSocketServerChannel.cpp @@ -176,7 +176,7 @@ bool JackSocketServerChannel::HandleRequest(int fd) JackClientCheckRequest req; JackClientCheckResult res; if (req.Read(socket) == 0) - res.fResult = fServer->GetEngine()->ClientCheck(req.fName, res.fName, req.fProtocol, req.fOptions, &res.fStatus); + res.fResult = fServer->GetEngine()->ClientCheck(req.fName, req.fUUID, res.fName, req.fProtocol, req.fOptions, &res.fStatus); if (res.Write(socket) < 0) jack_error("JackRequest::ClientCheck write error name = %s", req.fName); break;