change branch.data to union to better handle various types
This commit is contained in:
		
							parent
							
								
									165ab47afd
								
							
						
					
					
						commit
						f18113ec22
					
				@ -79,6 +79,7 @@ typedef enum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define PTQL_OP_FLAG_PARENT 1
 | 
					#define PTQL_OP_FLAG_PARENT 1
 | 
				
			||||||
#define PTQL_OP_FLAG_REF    2
 | 
					#define PTQL_OP_FLAG_REF    2
 | 
				
			||||||
 | 
					#define PTQL_OP_FLAG_GLOB   4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ptql_parse_branch_t {
 | 
					struct ptql_parse_branch_t {
 | 
				
			||||||
    char *name;
 | 
					    char *name;
 | 
				
			||||||
@ -98,16 +99,25 @@ typedef struct {
 | 
				
			|||||||
} ptql_lookup_t;
 | 
					} ptql_lookup_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DATA_PTR(branch) \
 | 
					#define DATA_PTR(branch) \
 | 
				
			||||||
    ((char *)branch->data + branch->lookup->offset)
 | 
					    ((char *)branch->data.ptr + branch->lookup->offset)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void data_free(void *data)
 | 
					static void data_free(void *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    free(data);
 | 
					    free(data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef union {
 | 
				
			||||||
 | 
					    sigar_pid_t pid;
 | 
				
			||||||
 | 
					    sigar_uint64_t ui64;
 | 
				
			||||||
 | 
					    sigar_uint32_t ui32;
 | 
				
			||||||
 | 
					    char chr[4];
 | 
				
			||||||
 | 
					    char *str;
 | 
				
			||||||
 | 
					    void *ptr;
 | 
				
			||||||
 | 
					} any_value_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ptql_branch_t {
 | 
					struct ptql_branch_t {
 | 
				
			||||||
    ptql_lookup_t *lookup;
 | 
					    ptql_lookup_t *lookup;
 | 
				
			||||||
    void *data;
 | 
					    any_value_t data;
 | 
				
			||||||
    unsigned int data_size;
 | 
					    unsigned int data_size;
 | 
				
			||||||
    void (*data_free)(void *);
 | 
					    void (*data_free)(void *);
 | 
				
			||||||
    unsigned int flags;
 | 
					    unsigned int flags;
 | 
				
			||||||
@ -119,13 +129,7 @@ struct ptql_branch_t {
 | 
				
			|||||||
        ptql_op_chr_t chr;
 | 
					        ptql_op_chr_t chr;
 | 
				
			||||||
        ptql_op_str_t str;
 | 
					        ptql_op_str_t str;
 | 
				
			||||||
    } match;
 | 
					    } match;
 | 
				
			||||||
    union {
 | 
					    any_value_t value;
 | 
				
			||||||
        sigar_uint64_t ui64;
 | 
					 | 
				
			||||||
        sigar_uint32_t ui32;
 | 
					 | 
				
			||||||
        char chr[4];
 | 
					 | 
				
			||||||
        char *str;
 | 
					 | 
				
			||||||
        void *ptr;
 | 
					 | 
				
			||||||
    } value;
 | 
					 | 
				
			||||||
    void (*value_free)(void *);
 | 
					    void (*value_free)(void *);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -442,8 +446,8 @@ static int ptql_branch_list_destroy(sigar_t *sigar,
 | 
				
			|||||||
            ptql_branch_t *branch =
 | 
					            ptql_branch_t *branch =
 | 
				
			||||||
                &branches->data[i];
 | 
					                &branches->data[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (branch->data_size && branch->data) {
 | 
					            if (branch->data_size && branch->data.ptr) {
 | 
				
			||||||
                branch->data_free(branch->data);
 | 
					                branch->data_free(branch->data.ptr);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (branch->lookup &&
 | 
					            if (branch->lookup &&
 | 
				
			||||||
@ -466,7 +470,7 @@ static int ptql_branch_list_destroy(sigar_t *sigar,
 | 
				
			|||||||
static int ptql_branch_init_any(ptql_parse_branch_t *parsed,
 | 
					static int ptql_branch_init_any(ptql_parse_branch_t *parsed,
 | 
				
			||||||
                                ptql_branch_t *branch)
 | 
					                                ptql_branch_t *branch)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    branch->data = strdup(parsed->attr);
 | 
					    branch->data.str = strdup(parsed->attr);
 | 
				
			||||||
    branch->data_size = strlen(parsed->attr);
 | 
					    branch->data_size = strlen(parsed->attr);
 | 
				
			||||||
    return SIGAR_OK;
 | 
					    return SIGAR_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -527,29 +531,35 @@ enum {
 | 
				
			|||||||
    PTQL_PID_SERVICE
 | 
					    PTQL_PID_SERVICE
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef SIGAR_64BIT
 | 
				
			||||||
 | 
					#define str2pid(value) strtoull(value, NULL, 10)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define str2pid(value) strtoul(value, NULL, 10)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int ptql_branch_init_pid(ptql_parse_branch_t *parsed,
 | 
					static int ptql_branch_init_pid(ptql_parse_branch_t *parsed,
 | 
				
			||||||
                                ptql_branch_t *branch)
 | 
					                                ptql_branch_t *branch)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (strEQ(parsed->attr, "Pid")) {
 | 
					    if (strEQ(parsed->attr, "Pid")) {
 | 
				
			||||||
        branch->flags = PTQL_PID_PID;
 | 
					        branch->flags = PTQL_PID_PID;
 | 
				
			||||||
        if (strEQ(parsed->value, "$$")) {
 | 
					        if (strEQ(parsed->value, "$$")) {
 | 
				
			||||||
            branch->data = (void*)getpid();
 | 
					            branch->data.pid = getpid();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            branch->data = (void*)atoi(parsed->value); /*XXX*/
 | 
					            branch->data.pid = str2pid(parsed->value);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return SIGAR_OK;
 | 
					        return SIGAR_OK;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else if (strEQ(parsed->attr, "PidFile")) {
 | 
					    else if (strEQ(parsed->attr, "PidFile")) {
 | 
				
			||||||
        branch->flags = PTQL_PID_FILE;
 | 
					        branch->flags = PTQL_PID_FILE;
 | 
				
			||||||
        branch->data = strdup(parsed->value);
 | 
					        branch->data.str = strdup(parsed->value);
 | 
				
			||||||
        branch->data_size = strlen(parsed->value);
 | 
					        branch->data_size = strlen(parsed->value);
 | 
				
			||||||
        return SIGAR_OK;
 | 
					        return SIGAR_OK;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else if (strEQ(parsed->attr, "Service")) {
 | 
					    else if (strEQ(parsed->attr, "Service")) {
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
        branch->flags = PTQL_PID_SERVICE;
 | 
					        branch->flags = PTQL_PID_SERVICE;
 | 
				
			||||||
        branch->data = strdup(parsed->value);
 | 
					        branch->data.str = strdup(parsed->value);
 | 
				
			||||||
        branch->data_size = strlen(parsed->value);
 | 
					        branch->data_size = strlen(parsed->value);
 | 
				
			||||||
        return SIGAR_OK;
 | 
					        return SIGAR_OK;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
@ -572,7 +582,7 @@ static int ptql_pid_match(sigar_t *sigar,
 | 
				
			|||||||
    if (branch->flags == PTQL_PID_FILE) {
 | 
					    if (branch->flags == PTQL_PID_FILE) {
 | 
				
			||||||
        char buffer[SIGAR_PATH_MAX+1];
 | 
					        char buffer[SIGAR_PATH_MAX+1];
 | 
				
			||||||
        int status =
 | 
					        int status =
 | 
				
			||||||
            sigar_file2str((const char *)branch->data,
 | 
					            sigar_file2str((const char *)branch->data.str,
 | 
				
			||||||
                           buffer, sizeof(buffer)-1);
 | 
					                           buffer, sizeof(buffer)-1);
 | 
				
			||||||
        if (status != SIGAR_OK) {
 | 
					        if (status != SIGAR_OK) {
 | 
				
			||||||
            return status;
 | 
					            return status;
 | 
				
			||||||
@ -587,7 +597,7 @@ static int ptql_pid_match(sigar_t *sigar,
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
        match_pid = (sigar_pid_t)branch->data;
 | 
					        match_pid = branch->data.pid;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (pid == match_pid) ? SIGAR_OK : !SIGAR_OK;
 | 
					    return (pid == match_pid) ? SIGAR_OK : !SIGAR_OK;
 | 
				
			||||||
@ -597,13 +607,13 @@ static int ptql_args_branch_init(ptql_parse_branch_t *parsed,
 | 
				
			|||||||
                                 ptql_branch_t *branch)
 | 
					                                 ptql_branch_t *branch)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (strEQ(parsed->attr, "*")) {
 | 
					    if (strEQ(parsed->attr, "*")) {
 | 
				
			||||||
        branch->data = NULL;
 | 
					        branch->op_flags |= PTQL_OP_FLAG_GLOB;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
        char *end;
 | 
					        char *end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        branch->data =
 | 
					        branch->data.ui32 =
 | 
				
			||||||
            (void*)strtol(parsed->attr, &end, 10);
 | 
					            strtol(parsed->attr, &end, 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (end && *end) {
 | 
					        if (end && *end) {
 | 
				
			||||||
            /* conversion failed */
 | 
					            /* conversion failed */
 | 
				
			||||||
@ -627,7 +637,7 @@ static int ptql_args_match(sigar_t *sigar,
 | 
				
			|||||||
        return status;
 | 
					        return status;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!branch->data) {
 | 
					    if (branch->op_flags & PTQL_OP_FLAG_GLOB) {
 | 
				
			||||||
        int i;
 | 
					        int i;
 | 
				
			||||||
        for (i=0; i<args.number; i++) {
 | 
					        for (i=0; i<args.number; i++) {
 | 
				
			||||||
            matched = 
 | 
					            matched = 
 | 
				
			||||||
@ -640,7 +650,7 @@ static int ptql_args_match(sigar_t *sigar,
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
        int num = (int)branch->data;
 | 
					        int num = branch->data.ui32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* 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) {
 | 
				
			||||||
@ -695,12 +705,12 @@ static int ptql_env_match(sigar_t *sigar,
 | 
				
			|||||||
    sigar_proc_env_entry_t entry;
 | 
					    sigar_proc_env_entry_t entry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* XXX ugh this is klunky */
 | 
					    /* XXX ugh this is klunky */
 | 
				
			||||||
    entry.key = branch->data;
 | 
					    entry.key = branch->data.str;
 | 
				
			||||||
    entry.klen = branch->data_size;
 | 
					    entry.klen = branch->data_size;
 | 
				
			||||||
    entry.val = NULL;
 | 
					    entry.val = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    procenv.type = SIGAR_PROC_ENV_KEY;
 | 
					    procenv.type = SIGAR_PROC_ENV_KEY;
 | 
				
			||||||
    procenv.key  = branch->data;
 | 
					    procenv.key  = branch->data.str;
 | 
				
			||||||
    procenv.klen = branch->data_size;
 | 
					    procenv.klen = branch->data_size;
 | 
				
			||||||
    procenv.env_getter = sigar_proc_env_get_key;
 | 
					    procenv.env_getter = sigar_proc_env_get_key;
 | 
				
			||||||
    procenv.data = &entry;
 | 
					    procenv.data = &entry;
 | 
				
			||||||
@ -734,7 +744,7 @@ static int ptql_branch_init_port(ptql_parse_branch_t *parsed,
 | 
				
			|||||||
        return SIGAR_PTQL_MALFORMED_QUERY;        
 | 
					        return SIGAR_PTQL_MALFORMED_QUERY;        
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    branch->data = (void*)atoi(parsed->value); /*XXX*/
 | 
					    branch->data.ui32 = atoi(parsed->value); /*XXX*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return SIGAR_OK;
 | 
					    return SIGAR_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -746,7 +756,7 @@ static int ptql_port_match(sigar_t *sigar,
 | 
				
			|||||||
    ptql_branch_t *branch =
 | 
					    ptql_branch_t *branch =
 | 
				
			||||||
        (ptql_branch_t *)data;
 | 
					        (ptql_branch_t *)data;
 | 
				
			||||||
    unsigned long port =
 | 
					    unsigned long port =
 | 
				
			||||||
        (unsigned long)branch->data;
 | 
					        branch->data.ui32;
 | 
				
			||||||
    int status;
 | 
					    int status;
 | 
				
			||||||
    sigar_pid_t match_pid=0;
 | 
					    sigar_pid_t match_pid=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -922,7 +932,7 @@ static int ptql_branch_add(ptql_parse_branch_t *parsed,
 | 
				
			|||||||
    PTQL_BRANCH_LIST_GROW(branches);
 | 
					    PTQL_BRANCH_LIST_GROW(branches);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    branch = &branches->data[branches->number++];
 | 
					    branch = &branches->data[branches->number++];
 | 
				
			||||||
    branch->data = NULL;
 | 
					    branch->data.ptr = NULL;
 | 
				
			||||||
    branch->data_size = 0;
 | 
					    branch->data_size = 0;
 | 
				
			||||||
    branch->data_free = data_free;
 | 
					    branch->data_free = data_free;
 | 
				
			||||||
    branch->value_free = data_free;
 | 
					    branch->value_free = data_free;
 | 
				
			||||||
@ -1151,11 +1161,11 @@ SIGAR_DECLARE(int) sigar_ptql_query_match(sigar_t *sigar,
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            /* standard sigar_proc_*_get / structptr + offset */
 | 
					            /* standard sigar_proc_*_get / structptr + offset */
 | 
				
			||||||
            if (!branch->data) {
 | 
					            if (!branch->data.ptr) {
 | 
				
			||||||
                branch->data_size = lookup->data_size;
 | 
					                branch->data_size = lookup->data_size;
 | 
				
			||||||
                branch->data = malloc(branch->data_size);
 | 
					                branch->data.ptr = malloc(branch->data_size);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            status = lookup->get(sigar, pid, branch->data);
 | 
					            status = lookup->get(sigar, pid, branch->data.ptr);
 | 
				
			||||||
            if (status != SIGAR_OK) {
 | 
					            if (status != SIGAR_OK) {
 | 
				
			||||||
                return status;
 | 
					                return status;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user