[SIGAR-90] Add ptql support for Service.Path

This commit is contained in:
Doug MacEachern 2008-03-06 00:33:36 +00:00
parent 0aed0d800e
commit 02753e3933
2 changed files with 47 additions and 3 deletions

View File

@ -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

View File

@ -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) {