use callback in service query
This commit is contained in:
parent
6d7b04b6e8
commit
42459486f7
|
@ -591,6 +591,15 @@ int sigar_services_status_get(sigar_services_status_t *ss, DWORD state);
|
||||||
|
|
||||||
void sigar_services_status_close(sigar_services_status_t *ss);
|
void sigar_services_status_close(sigar_services_status_t *ss);
|
||||||
|
|
||||||
|
typedef struct sigar_services_walker_t sigar_services_walker_t;
|
||||||
|
|
||||||
|
struct sigar_services_walker_t {
|
||||||
|
sigar_t *sigar;
|
||||||
|
int flags;
|
||||||
|
void *data; /* user data */
|
||||||
|
int (*add_service)(sigar_services_walker_t *walker, char *name);
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -751,9 +751,8 @@ static int ptql_service_query_config(SC_HANDLE scm_handle,
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ptql_pid_service_list_get(sigar_t *sigar,
|
static int sigar_services_walk(sigar_services_walker_t *walker,
|
||||||
ptql_branch_t *branch,
|
ptql_branch_t *branch)
|
||||||
sigar_proc_list_t *proclist)
|
|
||||||
{
|
{
|
||||||
sigar_services_status_t ss;
|
sigar_services_status_t ss;
|
||||||
char buffer[QUERY_SC_SIZE];
|
char buffer[QUERY_SC_SIZE];
|
||||||
|
@ -761,7 +760,7 @@ static int ptql_pid_service_list_get(sigar_t *sigar,
|
||||||
DWORD i, status;
|
DWORD i, status;
|
||||||
|
|
||||||
SIGAR_ZERO(&ss);
|
SIGAR_ZERO(&ss);
|
||||||
status = sigar_services_status_get(&ss, SERVICE_ACTIVE);
|
status = sigar_services_status_get(&ss, walker->flags);
|
||||||
if (status != SIGAR_OK) {
|
if (status != SIGAR_OK) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -789,16 +788,9 @@ static int ptql_pid_service_list_get(sigar_t *sigar,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ptql_str_match(sigar, branch, value)) {
|
if (ptql_str_match(walker->sigar, branch, value)) {
|
||||||
sigar_pid_t service_pid;
|
if (walker->add_service(walker, name) != SIGAR_OK) {
|
||||||
int status =
|
break;
|
||||||
sigar_service_pid_get(sigar,
|
|
||||||
name,
|
|
||||||
&service_pid);
|
|
||||||
|
|
||||||
if (status == SIGAR_OK) {
|
|
||||||
SIGAR_PROC_LIST_GROW(proclist);
|
|
||||||
proclist->data[proclist->number++] = service_pid;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -807,6 +799,38 @@ static int ptql_pid_service_list_get(sigar_t *sigar,
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ptql_pid_service_add(sigar_services_walker_t *walker,
|
||||||
|
char *name)
|
||||||
|
{
|
||||||
|
sigar_pid_t service_pid;
|
||||||
|
sigar_proc_list_t *proclist =
|
||||||
|
(sigar_proc_list_t *)walker->data;
|
||||||
|
int status =
|
||||||
|
sigar_service_pid_get(walker->sigar,
|
||||||
|
name,
|
||||||
|
&service_pid);
|
||||||
|
|
||||||
|
if (status == SIGAR_OK) {
|
||||||
|
SIGAR_PROC_LIST_GROW(proclist);
|
||||||
|
proclist->data[proclist->number++] = service_pid;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ptql_pid_service_list_get(sigar_t *sigar,
|
||||||
|
ptql_branch_t *branch,
|
||||||
|
sigar_proc_list_t *proclist)
|
||||||
|
{
|
||||||
|
sigar_services_walker_t walker;
|
||||||
|
walker.sigar = sigar;
|
||||||
|
walker.flags = SERVICE_ACTIVE;
|
||||||
|
walker.data = proclist;
|
||||||
|
walker.add_service = ptql_pid_service_add;
|
||||||
|
|
||||||
|
return sigar_services_walk(&walker, branch);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int ptql_pid_get(sigar_t *sigar,
|
static int ptql_pid_get(sigar_t *sigar,
|
||||||
|
|
Loading…
Reference in New Issue