void netsnmp_table_data_delete_table( netsnmp_table_data *table ) { netsnmp_table_row *row, *nextrow; if (!table) return; snmp_free_varbind(table->indexes_template); table->indexes_template = NULL; for (row = table->first_row; row; row=nextrow) { nextrow = row->next; row->next = NULL; netsnmp_table_data_delete_row(row); /* Can't delete table-specific entry memory */ } table->first_row = NULL; if (table->name) { SNMP_FREE(table->name); table->name = NULL; } SNMP_FREE(table); return; }
/** deletes all the data from this node and beyond in the linked list */ NETSNMP_INLINE void netsnmp_table_dataset_delete_row(netsnmp_table_row *row) { netsnmp_table_data_set_storage *data; if (!row) return; data = netsnmp_table_data_delete_row(row); netsnmp_table_dataset_delete_all_data(data); }
/** * removes and frees a row of data to a given table and returns the void * * * returns the void * data on successful deletion. * or NULL on failure (bad arguments) */ void * netsnmp_table_data_remove_and_delete_row(netsnmp_table_data *table, netsnmp_table_row *row) { if (!row || !table) return NULL; /* * remove it from the list */ netsnmp_table_data_remove_row(table, row); return netsnmp_table_data_delete_row(row); }
/* Handles creation of new rows for the table */ static int sipOtherStatsTable_newRow(struct sip_snmp_handler *h) { netsnmp_table_row *row; /* XXX: make sure applIndex is an index for your table */ static int applIndex = -1; const char *func = "snmp_mod"; register struct sip_snmp_handler *c; struct sip_snmp_obj *o; int i, col; /* get applIndex first */ if(applIndex == -1) { applIndex = ser_getApplIndex(); if(applIndex == -1) { LOG(L_ERR,"%s: Couldn't get application index, cannot create " "new row\n", func); return -1; } } /* create the row */ row = netsnmp_create_table_data_row(); if(!row) { LOG(L_ERR, "%s: Couldn't create new row, out of memory?\n", func); return -1; } /* add indexes */ netsnmp_table_row_add_index(row, ASN_INTEGER, &applIndex, sizeof(applIndex)); c = h; for(i=1; i<SIPOTHERSTATSTABLE_INDEXES; i++) { if(!c) { LOG(L_ERR, "%s: Not enought indexes passed, need %d\n", func, SIPOTHERSTATSTABLE_INDEXES); netsnmp_table_data_delete_row(row); return -1; } if(!c->sip_obj || !c->sip_obj->value.voidp) { LOG(L_ERR, "%s: Invalid index passed\n", func); netsnmp_table_data_delete_row(row); return -1; } if(!netsnmp_table_row_add_index(row, ser_types[c->sip_obj->type], c->sip_obj->value.voidp, c->sip_obj->val_len)) { LOG(L_ERR, "%s: Error adding index to row\n", func); netsnmp_table_data_delete_row(row); return -1; } c = c->next; } /* add the data. We start from the last index, all the way to the * end of the linked list */ c = h; for(i=2; i<SIPOTHERSTATSTABLE_INDEXES; i++) c = c->next; col = 1; while(c) { if(col > SIPOTHERSTATSTABLE_COLUMNS) { LOG(L_ERR, "%s: Too many columns for new row\n", func); netsnmp_table_data_delete_row(row); return -1; } o = c->sip_obj; if(!o || !o->value.voidp) { LOG(L_ERR, "%s: Invalid object to add to new row\n", func); netsnmp_table_data_delete_row(row); return -1; } if(netsnmp_set_row_column(row, col, ser_types[o->type], o->value.voidp, o->val_len) != SNMPERR_SUCCESS) { LOG(L_ERR, "%s: Error adding object to row\n", func); netsnmp_table_data_delete_row(row); return -1; } if(c->on_set) netsnmp_mark_row_column_writable(row, col, 1); /* next, please... */ c = c->next; col++; } /* add the row to the table */ if(netsnmp_table_data_add_row(sipOtherStatsTable->table, row) != SNMPERR_SUCCESS) { LOG(L_ERR, "%s: Error adding new row to table\n", func); netsnmp_table_data_delete_row(row); return -1; } return 0; }
/* Adds a new object to the table. If the row doesn't exist is created. * Assumes all objects go to the same row, and all the objects are * new (replacing is done silently) */ static int sipOtherStatsTable_addObj(struct sip_snmp_handler *h, int col) { static netsnmp_table_row *row = NULL; int applIndex; /* Default index for most tables */ int first = 0; const char *func = "snmp_mod"; if(!row) { /* First time. Create row and add indexes */ /* Get index (applIndex). First since we don't need to undo it * but it's still possible that it fails (e.g. if we get called * at the wrong time) */ applIndex = ser_getApplIndex(); if(applIndex == -1) { LOG(L_ERR, "%s: Failed getting table index\n", func); return -1; } /* XXX: If table has more indexes init them here and add * a similar call to row_add_index() as below */ /* Create the row */ row = netsnmp_create_table_data_row(); if(!row) { LOG(L_ERR, "%s: failed creating table row\n", func); return -1; } /* add the index(es) to the table */ if(!netsnmp_table_row_add_index(row, ASN_INTEGER, &applIndex, sizeof(applIndex))) { LOG(L_ERR, "%s: Error adding index to row\n", func); netsnmp_table_data_delete_row(row); row = NULL; return -1; } first = 1; } /* sanity checks */ if(col < 1 || col > SIPOTHERSTATSTABLE_COLUMNS) { LOG(L_ERR, "%s: Invalid column %d to add new object\n", func, col); return -1; } if(!h || !h->sip_obj || !h->sip_obj->value.voidp) { LOG(L_ERR, "%s: Invalid object to add\n", func); return -1; } /* add object to row */ if(netsnmp_set_row_column(row, col, ser_types[h->sip_obj->type], h->sip_obj->value.voidp, h->sip_obj->val_len) != SNMPERR_SUCCESS) { LOG(L_ERR, "%s: Error adding new object to table\n", func); return -1; } /* is it writable? */ if(h->on_set) netsnmp_mark_row_column_writable(row, col, 1); /* If first time, add the row. Subsequent times don't need to do * anything since the table just has a pointer to our local row. * However, if indexes were to change then the row needs to be * replaced */ if(first) { if(netsnmp_table_data_add_row(sipOtherStatsTable->table, row) != SNMPERR_SUCCESS) { LOG(L_ERR, "%s: Error adding new row to table\n",func); return -1; } } /* Fin */ return 0; }