diff --git a/src/connection_unix.cpp b/src/connection_unix.cpp index 38c5fe2..e3c01bb 100644 --- a/src/connection_unix.cpp +++ b/src/connection_unix.cpp @@ -32,7 +32,7 @@ static const char* GetTempPath() /*static*/ BaseConnection* BaseConnection::Create() { - snprintf(PipeAddr.sun_path, sizeof(PipeAddr.sun_path), "%s/discord-ipc-0", GetTempPath()); + PipeAddr.sun_family = AF_UNIX; return &Connection; } @@ -46,18 +46,22 @@ static const char* GetTempPath() bool BaseConnection::Open() { + const char* tempPath = GetTempPath(); auto self = reinterpret_cast(this); self->sock = socket(AF_UNIX, SOCK_STREAM, 0); if (self->sock == -1) { return false; } fcntl(self->sock, F_SETFL, O_NONBLOCK); - int err = connect(self->sock, (const sockaddr*)&PipeAddr, sizeof(PipeAddr)); - if (err != 0) { - self->Close(); - return false; + for (int pipeNum = 0; pipeNum < 10; ++pipeNum) { + snprintf(PipeAddr.sun_path, sizeof(PipeAddr.sun_path), "%s/discord-ipc-%d", tempPath, pipeNum); + int err = connect(self->sock, (const sockaddr*)&PipeAddr, sizeof(PipeAddr)); + if (err == 0) { + return true; + } } - return true; + self->Close(); + return false; } bool BaseConnection::Close() diff --git a/src/connection_win.cpp b/src/connection_win.cpp index 55a1a39..a2d7361 100644 --- a/src/connection_win.cpp +++ b/src/connection_win.cpp @@ -16,8 +16,6 @@ struct BaseConnectionWin : public BaseConnection { }; static BaseConnectionWin Connection; -// static const wchar_t* PipeName = L"\\\\?\\pipe\\discord-ipc"; -static const wchar_t* PipeName = L"\\\\?\\pipe\\discord-ipc-0"; /*static*/ BaseConnection* BaseConnection::Create() { @@ -33,21 +31,31 @@ static const wchar_t* PipeName = L"\\\\?\\pipe\\discord-ipc-0"; bool BaseConnection::Open() { + wchar_t pipeName[]{L"\\\\?\\pipe\\discord-ipc-0"}; + const size_t pipeDigit = sizeof(pipeName) / sizeof(wchar_t) - 2; + pipeName[pipeDigit] = L'0'; auto self = reinterpret_cast(this); for (;;) { self->pipe = ::CreateFileW( - PipeName, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr); + pipeName, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr); if (self->pipe != INVALID_HANDLE_VALUE) { return true; } - if (GetLastError() != ERROR_PIPE_BUSY) { - return false; + auto lastError = GetLastError(); + if (lastError == ERROR_FILE_NOT_FOUND) { + if (pipeName[pipeDigit] < L'9') { + pipeName[pipeDigit]++; + continue; + } } - - if (!WaitNamedPipeW(PipeName, 10000)) { - return false; + else if (lastError == ERROR_PIPE_BUSY) { + if (!WaitNamedPipeW(pipeName, 10000)) { + return false; + } + continue; } + return false; } }