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