diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-06-07 11:52:10 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-06-07 11:52:10 +0300 |
commit | 4dd8c727f47c6a53d5d691348b6ad74a4d0c52c1 (patch) | |
tree | 0b1ebb125b88dfde8fe4887368b257963b79e5be | |
parent | 367783da2d1a962bf7dc2aa1d651b5475b3847e6 (diff) | |
download | tallyman-4dd8c727f47c6a53d5d691348b6ad74a4d0c52c1.tar.gz tallyman-4dd8c727f47c6a53d5d691348b6ad74a4d0c52c1.tar.bz2 |
Allocate volatile data in the cache table
-rw-r--r-- | src/servdb.c | 55 | ||||
-rw-r--r-- | src/tallyman_mib.mib2c | 1 |
2 files changed, 39 insertions, 17 deletions
diff --git a/src/servdb.c b/src/servdb.c index 092830b..b4ae6d6 100644 --- a/src/servdb.c +++ b/src/servdb.c @@ -435,37 +435,55 @@ setDateAndTime(time_t t, char **pbuf, size_t *plen) } static int +instanceTable_entry_load(size_t idx, + struct instance *inst, char const *service_id, + struct instanceTable_entry *ent) +{ + memset(ent, 0, sizeof(*ent)); + ent->instanceIndex = idx; + ent->instanceName = strdup(inst->hostname); + if (!ent->instanceName) + return -1; + ent->instanceName_len = strlen(ent->instanceName); + ent->instanceService = (char*) service_id; + ent->instanceService_len = strlen(service_id); + ent->instanceState = inst->state; + setDateAndTime(inst->timestamp, &ent->instanceTimeStamp, + &ent->instanceTimeStamp_len); + ent->instanceErrorMessage = strdup(inst->error_message + ? inst->error_message + : ""); + if (!ent->instanceErrorMessage) + return -1; + ent->instanceErrorMessage_len = strlen(ent->instanceErrorMessage); + return 0; +} + +static int instanceTable_load_row(size_t idx, struct instance *inst, char const *service_id, netsnmp_tdata *table) { netsnmp_tdata_row *data_row; struct instanceTable_entry *ent; - + ent = SNMP_MALLOC_TYPEDEF(struct instanceTable_entry); - if (!ent) + if (!ent) return SNMP_ERR_GENERR; + if (instanceTable_entry_load(idx, inst, service_id, ent)) { + instanceTable_entry_free(ent); + SNMP_FREE(ent); + return SNMP_ERR_GENERR; + } + data_row = netsnmp_tdata_create_row(); if (!data_row) { + instanceTable_entry_free(ent); SNMP_FREE(ent); return SNMP_ERR_GENERR; } data_row->data = ent; - - ent->instanceIndex = idx; - ent->instanceName = inst->hostname; - ent->instanceName_len = strlen(inst->hostname); - ent->instanceService = (char*) service_id; - ent->instanceService_len = strlen(service_id); - ent->instanceState = inst->state; - setDateAndTime(inst->timestamp, &ent->instanceTimeStamp, - &ent->instanceTimeStamp_len); - ent->instanceErrorMessage = inst->error_message - ? inst->error_message - : ""; - ent->instanceErrorMessage_len = strlen(ent->instanceErrorMessage); - netsnmp_tdata_row_add_index(data_row, ASN_INTEGER, &ent->instanceIndex, sizeof(ent->instanceIndex)); @@ -508,7 +526,9 @@ instanceTable_load(netsnmp_cache *cache, void *vmagic) void instanceTable_entry_free(void *data) { - /* nothing */ + struct instanceTable_entry *ent = data; + free(ent->instanceName); + free(ent->instanceErrorMessage); } void * @@ -532,4 +552,5 @@ invalidator_thread(void *p) } sleep(ttl_instance_state); } + return NULL; } diff --git a/src/tallyman_mib.mib2c b/src/tallyman_mib.mib2c index c8eeb8d..7adf3f4 100644 --- a/src/tallyman_mib.mib2c +++ b/src/tallyman_mib.mib2c @@ -268,6 +268,7 @@ struct ${i}_entry { int ${i}_load(netsnmp_cache *cache, void *vmagic); void ${i}_entry_free(void *data); +void ${i}_free(netsnmp_cache *cache, void *vmagic); @pop@ void |