add Env support
This commit is contained in:
parent
7fea14b407
commit
5bfb7b3cc7
|
@ -361,7 +361,9 @@ static int ptql_branch_list_destroy(sigar_t *sigar,
|
|||
free(branch->data);
|
||||
}
|
||||
|
||||
if (branch->lookup->type == PTQL_VALUE_TYPE_STR) {
|
||||
if (branch->lookup &&
|
||||
(branch->lookup->type == PTQL_VALUE_TYPE_STR))
|
||||
{
|
||||
if (branch->value.str) {
|
||||
free(branch->value.str);
|
||||
}
|
||||
|
@ -442,6 +444,67 @@ static int ptql_args_match(sigar_t *sigar,
|
|||
return matched ? SIGAR_OK : !SIGAR_OK;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
const char *key;
|
||||
int klen;
|
||||
char *val;
|
||||
int vlen;
|
||||
} sigar_proc_env_entry_t;
|
||||
|
||||
static int sigar_proc_env_get_key(void *data,
|
||||
const char *key, int klen,
|
||||
char *val, int vlen)
|
||||
{
|
||||
sigar_proc_env_entry_t *entry =
|
||||
(sigar_proc_env_entry_t *)data;
|
||||
|
||||
if ((entry->klen == klen) &&
|
||||
(strcmp(entry->key, key) == 0))
|
||||
{
|
||||
entry->val = val;
|
||||
entry->vlen = vlen;
|
||||
return !SIGAR_OK; /* foundit; stop iterating */
|
||||
}
|
||||
|
||||
return SIGAR_OK;
|
||||
}
|
||||
|
||||
static int ptql_env_match(sigar_t *sigar,
|
||||
sigar_pid_t pid,
|
||||
void *data)
|
||||
{
|
||||
ptql_branch_t *branch =
|
||||
(ptql_branch_t *)data;
|
||||
int status, matched=0;
|
||||
sigar_proc_env_t procenv;
|
||||
sigar_proc_env_entry_t entry;
|
||||
|
||||
/* XXX ugh this is klunky */
|
||||
entry.key = branch->data;
|
||||
entry.klen = branch->data_size;
|
||||
entry.val = NULL;
|
||||
|
||||
procenv.type = SIGAR_PROC_ENV_KEY;
|
||||
procenv.key = branch->data;
|
||||
procenv.klen = branch->data_size;
|
||||
procenv.env_getter = sigar_proc_env_get_key;
|
||||
procenv.data = &entry;
|
||||
|
||||
status = sigar_proc_env_get(sigar, pid, &procenv);
|
||||
if (status != SIGAR_OK) {
|
||||
return status;
|
||||
}
|
||||
else {
|
||||
if (entry.val) {
|
||||
matched =
|
||||
branch->match.str(entry.val,
|
||||
branch->value.str);
|
||||
}
|
||||
}
|
||||
|
||||
return matched ? SIGAR_OK : !SIGAR_OK;
|
||||
}
|
||||
|
||||
#define PTQL_LOOKUP_ENTRY(cname, member, type) \
|
||||
(ptql_get_t)sigar_##cname##_get, \
|
||||
sigar_offsetof(sigar_##cname##_t, member), \
|
||||
|
@ -511,6 +574,10 @@ static ptql_lookup_t PTQL_Args[] = {
|
|||
{ NULL, ptql_args_match, 0, 0, PTQL_VALUE_TYPE_ANY }
|
||||
};
|
||||
|
||||
static ptql_lookup_t PTQL_Env[] = {
|
||||
{ NULL, ptql_env_match, 0, 0, PTQL_VALUE_TYPE_ANY }
|
||||
};
|
||||
|
||||
static ptql_entry_t ptql_map[] = {
|
||||
{ "Time", PTQL_Time },
|
||||
{ "CredName", PTQL_CredName },
|
||||
|
@ -520,6 +587,7 @@ static ptql_entry_t ptql_map[] = {
|
|||
{ "State", PTQL_State },
|
||||
{ "Fd", PTQL_Fd },
|
||||
{ "Args", PTQL_Args },
|
||||
{ "Env", PTQL_Env },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue