refactor for Pid.Service ptql
This commit is contained in:
		
							parent
							
								
									29ef270b9a
								
							
						
					
					
						commit
						795db98647
					
				@ -1386,15 +1386,6 @@ JNIEXPORT void SIGAR_JNI(SigarLog_setLevel)
 | 
			
		||||
    sigar_log_level_set(sigar, level);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * XXX temporary function for ptql to map windows service to pid.
 | 
			
		||||
 * in the future would better to integrate win32bindings w/ sigar.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
#define sigar_QueryServiceStatusEx \
 | 
			
		||||
    sigar->advapi.query_service_status.func
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
JNIEXPORT jlong SIGAR_JNIx(getServicePid)
 | 
			
		||||
(JNIEnv *env, jobject sigar_obj, jstring jname)
 | 
			
		||||
{
 | 
			
		||||
@ -1402,56 +1393,20 @@ JNIEXPORT jlong SIGAR_JNIx(getServicePid)
 | 
			
		||||
    const char *name;
 | 
			
		||||
    jboolean is_copy;
 | 
			
		||||
    jlong pid = 0;
 | 
			
		||||
    DWORD err = ERROR_SUCCESS;
 | 
			
		||||
    SC_HANDLE mgr;
 | 
			
		||||
    int status;
 | 
			
		||||
    dSIGAR(0);
 | 
			
		||||
 | 
			
		||||
    if (!sigar_QueryServiceStatusEx) {
 | 
			
		||||
        sigar_throw_notimpl(env,
 | 
			
		||||
                            "QueryServiceStatusEx not available");
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    name = JENV->GetStringUTFChars(env, jname, &is_copy);
 | 
			
		||||
 | 
			
		||||
    mgr = OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE,
 | 
			
		||||
                        SC_MANAGER_ALL_ACCESS);
 | 
			
		||||
 | 
			
		||||
    if (mgr) {
 | 
			
		||||
        HANDLE svc = OpenService(mgr, name, SERVICE_ALL_ACCESS);
 | 
			
		||||
 | 
			
		||||
        if (svc) {
 | 
			
		||||
            SERVICE_STATUS_PROCESS status;
 | 
			
		||||
            DWORD bytes;
 | 
			
		||||
 | 
			
		||||
            if (sigar_QueryServiceStatusEx(svc,
 | 
			
		||||
                                           SC_STATUS_PROCESS_INFO,
 | 
			
		||||
                                           (LPBYTE)&status,
 | 
			
		||||
                                           sizeof(status), &bytes))
 | 
			
		||||
            {
 | 
			
		||||
                pid = status.dwProcessId;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                err = GetLastError();
 | 
			
		||||
            }
 | 
			
		||||
            CloseServiceHandle(svc);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            err = GetLastError();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        CloseServiceHandle(mgr);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        err = GetLastError();
 | 
			
		||||
    }
 | 
			
		||||
    status =
 | 
			
		||||
        sigar_service_pid_get(sigar, (char *)name, &pid);
 | 
			
		||||
 | 
			
		||||
    if (is_copy) {
 | 
			
		||||
        JENV->ReleaseStringUTFChars(env, jname, name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (err != ERROR_SUCCESS) {
 | 
			
		||||
        sigar_throw_error(env, jsigar, err);
 | 
			
		||||
    if (status != ERROR_SUCCESS) {
 | 
			
		||||
        sigar_throw_error(env, jsigar, status);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return pid;
 | 
			
		||||
 | 
			
		||||
@ -475,6 +475,8 @@ unsigned int sigar_cpu_count(sigar_t *sigar);
 | 
			
		||||
 | 
			
		||||
int sigar_cpu_info_get(sigar_t *sigar, sigar_cpu_info_t *info);
 | 
			
		||||
 | 
			
		||||
int sigar_service_pid_get(sigar_t *sigar, char *name, sigar_pid_t *pid);
 | 
			
		||||
 | 
			
		||||
#define SIGAR_NO_SUCH_PROCESS (SIGAR_OS_START_ERROR+1)
 | 
			
		||||
 | 
			
		||||
#endif /* SIGAR_OS_H */
 | 
			
		||||
 | 
			
		||||
@ -3187,3 +3187,48 @@ int sigar_os_sys_info_get(sigar_t *sigar,
 | 
			
		||||
 | 
			
		||||
    return SIGAR_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define sigar_QueryServiceStatusEx \
 | 
			
		||||
    sigar->advapi.query_service_status.func
 | 
			
		||||
 | 
			
		||||
int sigar_service_pid_get(sigar_t *sigar, char *name, sigar_pid_t *pid)
 | 
			
		||||
{
 | 
			
		||||
    DWORD rc = ERROR_SUCCESS, len;
 | 
			
		||||
    SC_HANDLE mgr;
 | 
			
		||||
    HANDLE svc;
 | 
			
		||||
    SERVICE_STATUS_PROCESS status;
 | 
			
		||||
 | 
			
		||||
    if (!sigar_QueryServiceStatusEx) {
 | 
			
		||||
        return SIGAR_ENOTIMPL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    mgr = OpenSCManager(NULL,
 | 
			
		||||
                        SERVICES_ACTIVE_DATABASE,
 | 
			
		||||
                        SC_MANAGER_ALL_ACCESS);
 | 
			
		||||
 | 
			
		||||
    if (!mgr) {
 | 
			
		||||
        return GetLastError();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!(svc = OpenService(mgr, name, SERVICE_ALL_ACCESS))) {
 | 
			
		||||
        CloseServiceHandle(mgr);
 | 
			
		||||
        return GetLastError();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (sigar_QueryServiceStatusEx(svc,
 | 
			
		||||
                                   SC_STATUS_PROCESS_INFO,
 | 
			
		||||
                                   (LPBYTE)&status,
 | 
			
		||||
                                   sizeof(status), &len))
 | 
			
		||||
    {
 | 
			
		||||
        *pid = status.dwProcessId;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        *pid = -1;
 | 
			
		||||
        rc = GetLastError();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    CloseServiceHandle(svc);
 | 
			
		||||
    CloseServiceHandle(mgr);
 | 
			
		||||
 | 
			
		||||
    return rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user