X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsnmp_agent.c;h=d65af1f19b5a2dadc2e8f7b496abd8e3da1ccc4c;hb=52c1dc1c9da2db76bc00d0de8fb2fe47c74b844f;hp=bbc4dcd0fbcfc8506d48a7c48db3fbaf9bb34fd0;hpb=362764225ae3d22ed9a14e27bf95ad762bae8adb;p=collectd.git diff --git a/src/snmp_agent.c b/src/snmp_agent.c index bbc4dcd0..d65af1f1 100644 --- a/src/snmp_agent.c +++ b/src/snmp_agent.c @@ -1,7 +1,7 @@ /** * collectd - src/snmp_agent.c * - * Copyright(c) 2017 Intel Corporation. All rights reserved. + * Copyright(c) 2017-2018 Intel Corporation. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -101,7 +101,7 @@ struct table_definition_s { will be split into sepearate tokens */ - _Bool tokens_done; /* Set to 1 when all tokens are generated */ + bool tokens_done; /* Set to true when all tokens are generated */ }; typedef struct table_definition_s table_definition_t; @@ -134,7 +134,7 @@ struct snmp_agent_ctx_s { typedef struct snmp_agent_ctx_s snmp_agent_ctx_t; static snmp_agent_ctx_t *g_agent; -const char *const index_opts[MAX_KEY_SOURCES] = { +static const char *index_opts[MAX_KEY_SOURCES] = { "Hostname", "Plugin", "PluginInstance", "Type", "TypeInstance"}; #define CHECK_DD_TYPE(_dd, _p, _pi, _t, _ti) \ @@ -340,9 +340,8 @@ static int snmp_agent_validate_config(void) { return 0; } -static int snmp_agent_parse_index_key(const char *input, char *regex, - regex_t *regex_info, int gi, - regmatch_t *m) { +static int snmp_agent_parse_index_key(const char *input, regex_t *regex_info, + int gi, regmatch_t *m) { regmatch_t matches[MAX_MATCHES]; int ret = regexec(regex_info, input, MAX_MATCHES, matches, 0); @@ -384,11 +383,20 @@ static int snmp_agent_create_token(char const *input, int t_off, int n, int ret = 0; token->key = index_key; - token->str = strndup(input + t_off, n); + /* copy at most n bytes from input with offset t_off into token->str */ + input += t_off; + size_t len = strlen(input); + if (n < len) + len = n; + + token->str = malloc(len + 1); if (token->str == NULL) goto free_offset_error; + memcpy(token->str, input, len); + token->str[len] = '\0'; + *offset = t_off; ret = c_avl_insert(tree, (void *)offset, (void *)token); @@ -523,11 +531,10 @@ static int snmp_agent_fill_index_list(table_definition_t *td, /* Parsing input string if necessary */ if (td->index_keys[i].regex) { - regmatch_t m = {-1, -1}; + regmatch_t m; /* Parsing input string */ - ret = snmp_agent_parse_index_key(ptr, td->index_keys[i].regex, - &td->index_keys[i].regex_info, + ret = snmp_agent_parse_index_key(ptr, &td->index_keys[i].regex_info, td->index_keys[i].group, &m); if (ret != 0) { ERROR(PLUGIN_NAME ": Error executing regex"); @@ -535,7 +542,7 @@ static int snmp_agent_fill_index_list(table_definition_t *td, } /* Tokenizing input string if not done yet */ - if (td->tokens_done == 0) + if (td->tokens_done == false) ret = snmp_agent_tokenize(ptr, tokens, &m, key); if (ret != 0) @@ -543,17 +550,31 @@ static int snmp_agent_fill_index_list(table_definition_t *td, if (td->index_keys[i].type == ASN_INTEGER) { int val = strtol(ptr + m.rm_so, NULL, 0); + +#ifdef HAVE_NETSNMP_OLD_API + ret = snmp_set_var_value(key, (const u_char *)&val, sizeof(val)); +#else ret = snmp_set_var_value(key, &val, sizeof(val)); +#endif } else +#ifdef HAVE_NETSNMP_OLD_API + ret = snmp_set_var_value(key, (const u_char *)(ptr + m.rm_so), + m.rm_eo - m.rm_so); +#else ret = snmp_set_var_value(key, ptr + m.rm_so, m.rm_eo - m.rm_so); +#endif } else +#ifdef HAVE_NETSNMP_OLD_API + ret = snmp_set_var_value(key, (const u_char *)ptr, strlen(ptr)); +#else ret = snmp_set_var_value(key, ptr, strlen(ptr)); +#endif key = key->next_variable; } /* Tokens for all source strings are generated */ for (i = 0; i < MAX_KEY_SOURCES; i++) - td->tokens_done = 1; + td->tokens_done = true; return 0; } @@ -671,15 +692,20 @@ static void snmp_agent_table_data_remove(data_definition_t *dd, pthread_mutex_lock(&g_agent->agentx_lock); + int reg_oids = -1; /* Number of registered oids for given instance */ + for (size_t i = 0; i < dd->oids_len; i++) { if (td->index_oid.oid_len) snmp_agent_unregister_oid_index(&dd->oids[i], *index); else snmp_agent_unregister_oid_string(&dd->oids[i], index_oid); + + reg_oids = + snmp_agent_update_instance_oids(td->instance_oids, index_oid, -1); } /* Checking if any metrics are left registered */ - if (snmp_agent_update_instance_oids(td->instance_oids, index_oid, -1) > 0) { + if (reg_oids != 0) { pthread_mutex_unlock(&g_agent->agentx_lock); return; } @@ -1036,12 +1062,24 @@ static int snmp_agent_form_reply(struct netsnmp_request_info_s *requests, requests->requestvb->type = td->index_keys[dd->index_key_pos].type; if (requests->requestvb->type == ASN_INTEGER) +#ifdef HAVE_NETSNMP_OLD_API + snmp_set_var_typed_value(requests->requestvb, requests->requestvb->type, + (const u_char *)key->val.integer, + sizeof(*key->val.integer)); +#else snmp_set_var_typed_value(requests->requestvb, requests->requestvb->type, key->val.integer, sizeof(*key->val.integer)); +#endif else /* OCTET_STR */ +#ifdef HAVE_NETSNMP_OLD_API snmp_set_var_typed_value(requests->requestvb, requests->requestvb->type, (const u_char *)key->val.string, strlen((const char *)key->val.string)); +#else + snmp_set_var_typed_value(requests->requestvb, requests->requestvb->type, + key->val.string, + strlen((const char *)key->val.string)); +#endif pthread_mutex_unlock(&g_agent->lock); @@ -1471,7 +1509,7 @@ static int snmp_agent_config_index_key_source(table_definition_t *td, if (ret != 0) return -1; - _Bool match = 0; + bool match = false; for (int i = 0; i < MAX_KEY_SOURCES; i++) { if (strcasecmp(index_opts[i], (const char *)val) == 0) { @@ -1491,7 +1529,7 @@ static int snmp_agent_config_index_key_source(table_definition_t *td, sfree(val); dd->index_key_pos = td->index_keys_len++; - dd->is_index_key = 1; + dd->is_index_key = true; return 0; } @@ -1570,14 +1608,14 @@ static int snmp_agent_config_table_column(table_definition_t *td, dd->shift = 0.0; /* NULL if it's a scalar */ dd->table = td; - dd->is_index_key = 0; + dd->is_index_key = false; for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; /* First 3 options are reserved for table entry only */ if (td != NULL && strcasecmp("IndexKey", option->key) == 0) { - dd->is_index_key = 1; + dd->is_index_key = true; option_tmp = option; } else if (strcasecmp("Plugin", option->key) == 0) ret = cf_util_get_string(option, &dd->plugin); @@ -1676,7 +1714,7 @@ static int snmp_agent_config_table(oconfig_item_t *ci) { for (int i = 0; i < MAX_KEY_SOURCES; i++) td->tokens[i] = NULL; - td->tokens_done = 0; + td->tokens_done = false; for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; @@ -1851,11 +1889,11 @@ static int snmp_agent_update_index(data_definition_t *dd, int ret; int *index = NULL; int *value = NULL; - _Bool free_index_oid = 1; + bool do_free_index_oid = true; if (c_avl_get(td->instance_index, (void *)*index_oid, (void **)&index) != 0) { /* Processing new instance */ - free_index_oid = 0; + do_free_index_oid = false; /* need to generate index for the table */ if (td->index_oid.oid_len) { @@ -1969,7 +2007,7 @@ static int snmp_agent_update_index(data_definition_t *dd, plugin_dispatch_notification(&n); } - if (free_index_oid) + if (do_free_index_oid) sfree(*index_oid); return 0;