static BOOL docmdStopService()

in src/native/windows/apps/prunsrv/prunsrv.c [930:978]


static BOOL docmdStopService(LPAPXCMDLINE lpCmdline)
{
    APXHANDLE hService;
    BOOL  rv = FALSE;

    apxLogWrite(APXLOG_MARK_INFO "Stopping service '%S'...",
                lpCmdline->szApplication);
    hService = apxCreateService(gPool, GENERIC_ALL, FALSE);
    if (IS_INVALID_HANDLE(hService)) {
        apxLogWrite(APXLOG_MARK_ERROR "Unable to open the Service Manager.");
        return FALSE;
    }

    SetLastError(ERROR_SUCCESS);
    /* Open the service */
    if (apxServiceOpen(hService, lpCmdline->szApplication,
                       GENERIC_READ | GENERIC_EXECUTE)) {
        rv = apxServiceControl(hService,
                               SERVICE_CONTROL_STOP,
                               0,
                               NULL,
                               NULL);
        if (!rv) {
            /* Wait for the timeout if any */
            int  timeout     = SO_STOPTIMEOUT;
            if (timeout) {
                int i;
                for (i = 0; i < timeout; i++) {
                    rv = apxServiceCheckStop(hService);
                    apxLogWrite(APXLOG_MARK_DEBUG "apxServiceCheck returns %d.", rv);
                    if (rv)
                        break;
                }
            }
        }
        if (rv)
            apxLogWrite(APXLOG_MARK_INFO "Service '%S' stopped.",
                        lpCmdline->szApplication);
        else
            apxLogWrite(APXLOG_MARK_ERROR "Failed to stop service '%S'.",
                        lpCmdline->szApplication);
    }
    else
        apxDisplayError(FALSE, NULL, 0, "Unable to open service '%S'.",
                        lpCmdline->szApplication);
    apxCloseHandle(hService);
    apxLogWrite(APXLOG_MARK_INFO "Stop service finished.");
    return rv;
}