/** * Get the services that depend on @arg svc. All dependent service info * is returned in an array of ENUM_SERVICE_STATUS structures via @arg deps. * * @retval The number of dependent services. */ DWORD SCM::getDependentServices(SC_HANDLE svc, std::auto_ptr<ENUM_SERVICE_STATUS>& deps) { DWORD bytesNeeded; DWORD numEntries; // Pass a zero-length buffer to get the required buffer size. if (::EnumDependentServices(svc, SERVICE_ACTIVE, 0, 0, &bytesNeeded, &numEntries)) { // If the Enum call succeeds, then there are no dependent // services, so do nothing. return 0; } if (::GetLastError() != ERROR_MORE_DATA) throw QPID_WINDOWS_ERROR((::GetLastError())); // Allocate a buffer for the dependencies. deps.reset((LPENUM_SERVICE_STATUS)(new char[bytesNeeded])); // Enumerate the dependencies. if (!::EnumDependentServices(svc, SERVICE_ACTIVE, deps.get(), bytesNeeded, &bytesNeeded, &numEntries)) throw QPID_WINDOWS_ERROR((::GetLastError())); return numEntries; }
DWORD SCM::waitForStateChangeFrom(SC_HANDLE svc, DWORD originalState) { SERVICE_STATUS_PROCESS ssStatus; DWORD bytesNeeded; DWORD waitTime; if (!::QueryServiceStatusEx(svc, // handle to service SC_STATUS_PROCESS_INFO, // information level (LPBYTE)&ssStatus, // address of structure sizeof(ssStatus), // size of structure &bytesNeeded)) // size needed if buffer is too small throw QPID_WINDOWS_ERROR(::GetLastError()); // Save the tick count and initial checkpoint. DWORD startTickCount = ::GetTickCount(); DWORD oldCheckPoint = ssStatus.dwCheckPoint; // Wait for the service to change out of the noted state. while (ssStatus.dwCurrentState == originalState) { // Do not wait longer than the wait hint. A good interval is // one-tenth of the wait hint but not less than 1 second // and not more than 10 seconds. waitTime = ssStatus.dwWaitHint / 10; if (waitTime < 1000) waitTime = 1000; else if (waitTime > 10000) waitTime = 10000; ::Sleep(waitTime); // Check the status until the service is no longer stop pending. if (!::QueryServiceStatusEx(svc, SC_STATUS_PROCESS_INFO, (LPBYTE) &ssStatus, sizeof(ssStatus), &bytesNeeded)) throw QPID_WINDOWS_ERROR(::GetLastError()); if (ssStatus.dwCheckPoint > oldCheckPoint) { // Continue to wait and check. startTickCount = ::GetTickCount(); oldCheckPoint = ssStatus.dwCheckPoint; } else { if ((::GetTickCount() - startTickCount) > ssStatus.dwWaitHint) break; } } return ssStatus.dwCurrentState; }
Socket* Socket::accept() const { SOCKET afd = ::accept(impl->fd, 0, 0); if (afd != INVALID_SOCKET) return new Socket(new IOHandlePrivate(afd)); else if (WSAGetLastError() == EAGAIN) return 0; else throw QPID_WINDOWS_ERROR(WSAGetLastError()); }
Socket* WinSocket::accept() const { SOCKET afd = ::accept(handle->fd, 0, 0); if (afd != INVALID_SOCKET) return new WinSocket(afd); else if (WSAGetLastError() == EAGAIN) return 0; else throw QPID_WINDOWS_ERROR(WSAGetLastError()); }
Socket* Socket::createSameTypeSocket() const { SOCKET& socket = impl->fd; // Socket currently has no actual socket attached if (socket == INVALID_SOCKET) return new Socket; ::sockaddr_storage sa; ::socklen_t salen = sizeof(sa); QPID_WINSOCK_CHECK(::getsockname(socket, (::sockaddr*)&sa, &salen)); SOCKET s = ::socket(sa.ss_family, SOCK_STREAM, 0); // Currently only work with SOCK_STREAM if (s == INVALID_SOCKET) throw QPID_WINDOWS_ERROR(WSAGetLastError()); return new Socket(new IOHandlePrivate(s)); }
void Socket::createSocket(const SocketAddress& sa) const { SOCKET& socket = impl->fd; if (socket != INVALID_SOCKET) Socket::close(); SOCKET s = ::socket (getAddrInfo(sa).ai_family, getAddrInfo(sa).ai_socktype, 0); if (s == INVALID_SOCKET) throw QPID_WINDOWS_ERROR(WSAGetLastError()); socket = s; try { if (nonblocking) setNonblocking(); if (nodelay) setTcpNoDelay(); } catch (std::exception&) { ::closesocket(s); socket = INVALID_SOCKET; throw; } }
bool SslCredential::load(const std::string& certName) { cert = findCertificate(certName); if (cert != NULL) { // assign the certificate into the credentials cred.paCred = &cert; cred.cCreds = 1; } SECURITY_STATUS status = ::AcquireCredentialsHandle(NULL, UNISP_NAME, SECPKG_CRED_OUTBOUND, NULL, &cred, NULL, NULL, &credHandle, &credExpiry); if (status != SEC_E_OK) throw QPID_WINDOWS_ERROR(status); return (cert != NULL); }