Beispiel #1
0
/**
  * 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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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());
}
Beispiel #4
0
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());
}
Beispiel #5
0
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));
}
Beispiel #6
0
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);
}