improve Args index conversion
This commit is contained in:
parent
7a4f30d48b
commit
75248f9447
|
@ -21,6 +21,9 @@
|
||||||
#include "sigar_util.h"
|
#include "sigar_util.h"
|
||||||
#include "sigar_ptql.h"
|
#include "sigar_ptql.h"
|
||||||
|
|
||||||
|
/* XXX need more specific errors */
|
||||||
|
#define SIGAR_PTQL_MALFORMED_QUERY 1
|
||||||
|
|
||||||
typedef struct ptql_parse_branch_t ptql_parse_branch_t;
|
typedef struct ptql_parse_branch_t ptql_parse_branch_t;
|
||||||
typedef struct ptql_branch_t ptql_branch_t;
|
typedef struct ptql_branch_t ptql_branch_t;
|
||||||
|
|
||||||
|
@ -418,6 +421,25 @@ static int ptql_branch_match(ptql_branch_t *branch)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ptql_args_branch_init(ptql_parse_branch_t *parsed,
|
||||||
|
ptql_branch_t *branch)
|
||||||
|
{
|
||||||
|
if (strEQ(parsed->attr, "*")) {
|
||||||
|
branch->data = NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
char *end;
|
||||||
|
|
||||||
|
branch->data =
|
||||||
|
(void*)strtol(parsed->attr, &end, 10);
|
||||||
|
|
||||||
|
if (end && *end) {
|
||||||
|
/* conversion failed */
|
||||||
|
return SIGAR_PTQL_MALFORMED_QUERY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
static int ptql_args_match(sigar_t *sigar,
|
static int ptql_args_match(sigar_t *sigar,
|
||||||
sigar_pid_t pid,
|
sigar_pid_t pid,
|
||||||
void *data)
|
void *data)
|
||||||
|
@ -425,7 +447,6 @@ static int ptql_args_match(sigar_t *sigar,
|
||||||
ptql_branch_t *branch =
|
ptql_branch_t *branch =
|
||||||
(ptql_branch_t *)data;
|
(ptql_branch_t *)data;
|
||||||
int status, matched=0;
|
int status, matched=0;
|
||||||
char *index = branch->data;
|
|
||||||
sigar_proc_args_t args;
|
sigar_proc_args_t args;
|
||||||
|
|
||||||
status = sigar_proc_args_get(sigar, pid, &args);
|
status = sigar_proc_args_get(sigar, pid, &args);
|
||||||
|
@ -433,8 +454,7 @@ static int ptql_args_match(sigar_t *sigar,
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX cache atoi conversion */
|
if (!branch->data) {
|
||||||
if (strEQ(index, "*")) {
|
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<args.number; i++) {
|
for (i=0; i<args.number; i++) {
|
||||||
matched =
|
matched =
|
||||||
|
@ -446,7 +466,7 @@ static int ptql_args_match(sigar_t *sigar,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int num = atoi(index); /* XXX validate */
|
int num = (int)branch->data;
|
||||||
|
|
||||||
/* e.g. find last element of args: Args.-1.eq=weblogic.Server */
|
/* e.g. find last element of args: Args.-1.eq=weblogic.Server */
|
||||||
if (num < 0) {
|
if (num < 0) {
|
||||||
|
@ -592,7 +612,7 @@ static ptql_lookup_t PTQL_Fd[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static ptql_lookup_t PTQL_Args[] = {
|
static ptql_lookup_t PTQL_Args[] = {
|
||||||
{ NULL, ptql_args_match, 0, 0, PTQL_VALUE_TYPE_ANY, ptql_branch_init_any }
|
{ NULL, ptql_args_match, 0, 0, PTQL_VALUE_TYPE_ANY, ptql_args_branch_init }
|
||||||
};
|
};
|
||||||
|
|
||||||
static ptql_lookup_t PTQL_Env[] = {
|
static ptql_lookup_t PTQL_Env[] = {
|
||||||
|
@ -612,9 +632,6 @@ static ptql_entry_t ptql_map[] = {
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
/* XXX need more specific errors */
|
|
||||||
#define SIGAR_PTQL_MALFORMED_QUERY 1
|
|
||||||
|
|
||||||
static int ptql_branch_parse(char *query, ptql_parse_branch_t *branch)
|
static int ptql_branch_parse(char *query, ptql_parse_branch_t *branch)
|
||||||
{
|
{
|
||||||
char *ptr = strchr(query, '=');
|
char *ptr = strchr(query, '=');
|
||||||
|
|
Loading…
Reference in New Issue