[SIGAR-90] Add ptql support for Service.Path
This commit is contained in:
		
							parent
							
								
									0aed0d800e
								
							
						
					
					
						commit
						02753e3933
					
				@ -71,6 +71,7 @@ public class TestPTQL extends SigarTestCase {
 | 
			
		||||
        "Service.Name.eq=NOSUCHSERVICE",
 | 
			
		||||
        "Service.Name.ct=Oracle",
 | 
			
		||||
        "Service.DisplayName.re=DHCP|DNS",
 | 
			
		||||
        "Service.Path.ct=svchost",
 | 
			
		||||
        OTHER_JAVA_PROCESS, //all java procs cept this one
 | 
			
		||||
        "Cpu.Percent.ge=0.2",
 | 
			
		||||
        "State.Name.sw=java,Args.*.eq=org.jboss.Main", //jboss
 | 
			
		||||
 | 
			
		||||
@ -646,7 +646,8 @@ enum {
 | 
			
		||||
    PTQL_PID_PID,
 | 
			
		||||
    PTQL_PID_FILE,
 | 
			
		||||
    PTQL_PID_SERVICE,
 | 
			
		||||
    PTQL_PID_SERVICE_DISPLAY
 | 
			
		||||
    PTQL_PID_SERVICE_DISPLAY,
 | 
			
		||||
    PTQL_PID_SERVICE_PATH
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifdef SIGAR_64BIT
 | 
			
		||||
@ -677,6 +678,9 @@ static int ptql_branch_init_service(ptql_parse_branch_t *parsed,
 | 
			
		||||
    else if (strEQ(parsed->attr, "DisplayName")) {
 | 
			
		||||
        branch->flags = PTQL_PID_SERVICE_DISPLAY;
 | 
			
		||||
    }
 | 
			
		||||
    else if (strEQ(parsed->attr, "Path")) {
 | 
			
		||||
        branch->flags = PTQL_PID_SERVICE_PATH;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        return ptql_error(error, "Unsupported %s attribute: %s",
 | 
			
		||||
                          parsed->name, parsed->attr);
 | 
			
		||||
@ -721,6 +725,32 @@ static int ptql_branch_init_pid(ptql_parse_branch_t *parsed,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
#define QUERY_SC_SIZE 8192
 | 
			
		||||
 | 
			
		||||
static int ptql_service_query_config(SC_HANDLE scm_handle,
 | 
			
		||||
                                     char *name,
 | 
			
		||||
                                     LPQUERY_SERVICE_CONFIG config)
 | 
			
		||||
{
 | 
			
		||||
    int status;
 | 
			
		||||
    DWORD bytes;
 | 
			
		||||
    SC_HANDLE handle =
 | 
			
		||||
        OpenService(scm_handle, name, SERVICE_QUERY_CONFIG);
 | 
			
		||||
 | 
			
		||||
    if (!handle) {
 | 
			
		||||
        return GetLastError();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (QueryServiceConfig(handle, config, QUERY_SC_SIZE, &bytes)) {
 | 
			
		||||
        status = SIGAR_OK;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        status = GetLastError();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    CloseServiceHandle(handle);
 | 
			
		||||
    return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ptql_pid_service_list_get(sigar_t *sigar,
 | 
			
		||||
                                     ptql_branch_t *branch,
 | 
			
		||||
                                     sigar_proc_list_t *proclist)
 | 
			
		||||
@ -728,6 +758,8 @@ static int ptql_pid_service_list_get(sigar_t *sigar,
 | 
			
		||||
    SC_HANDLE handle =
 | 
			
		||||
        OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
 | 
			
		||||
    ENUM_SERVICE_STATUS services[4096];
 | 
			
		||||
    char buffer[QUERY_SC_SIZE];
 | 
			
		||||
    LPQUERY_SERVICE_CONFIG config = (LPQUERY_SERVICE_CONFIG)buffer;
 | 
			
		||||
    BOOL retval;
 | 
			
		||||
    DWORD bytes, count, resume=0, i;
 | 
			
		||||
 | 
			
		||||
@ -742,15 +774,26 @@ static int ptql_pid_service_list_get(sigar_t *sigar,
 | 
			
		||||
                                &bytes, &count, &resume);
 | 
			
		||||
 | 
			
		||||
    for (i=0; i<count; i++) {
 | 
			
		||||
        int status;
 | 
			
		||||
        char *value;
 | 
			
		||||
        char *name = services[i].lpServiceName;
 | 
			
		||||
 | 
			
		||||
        switch (branch->flags) {
 | 
			
		||||
          case PTQL_PID_SERVICE_DISPLAY:
 | 
			
		||||
            value = services[i].lpDisplayName;
 | 
			
		||||
            break;
 | 
			
		||||
          case PTQL_PID_SERVICE_PATH:
 | 
			
		||||
            status = ptql_service_query_config(handle, name, config);
 | 
			
		||||
            if (status == SIGAR_OK) {
 | 
			
		||||
                value = config->lpBinaryPathName;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
          case PTQL_PID_SERVICE:
 | 
			
		||||
          default:
 | 
			
		||||
            value = services[i].lpServiceName;
 | 
			
		||||
            value = name;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -758,7 +801,7 @@ static int ptql_pid_service_list_get(sigar_t *sigar,
 | 
			
		||||
            sigar_pid_t service_pid;
 | 
			
		||||
            int status =
 | 
			
		||||
                sigar_service_pid_get(sigar,
 | 
			
		||||
                                      services[i].lpServiceName,
 | 
			
		||||
                                      name,
 | 
			
		||||
                                      &service_pid);
 | 
			
		||||
 | 
			
		||||
            if (status == SIGAR_OK) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user