aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2018-06-07 11:52:10 +0300
committerSergey Poznyakoff <gray@gnu.org>2018-06-07 11:52:10 +0300
commit4dd8c727f47c6a53d5d691348b6ad74a4d0c52c1 (patch)
tree0b1ebb125b88dfde8fe4887368b257963b79e5be
parent367783da2d1a962bf7dc2aa1d651b5475b3847e6 (diff)
downloadtallyman-4dd8c727f47c6a53d5d691348b6ad74a4d0c52c1.tar.gz
tallyman-4dd8c727f47c6a53d5d691348b6ad74a4d0c52c1.tar.bz2
Allocate volatile data in the cache table
-rw-r--r--src/servdb.c55
-rw-r--r--src/tallyman_mib.mib2c1
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

Return to:

Send suggestions and report system problems to the System administrator.