}
/**
- * Free cache manager
- * @arg mngr Cache manager
+ * Free cache manager and all caches.
+ * @arg mngr Cache manager.
*
* Release all resources after usage of a cache manager.
*/
void nl_cache_mngr_free(struct nl_cache_mngr *mngr)
{
+ int i;
+
if (!mngr)
return;
- if (mngr->cm_handle) {
+ if (mngr->cm_handle)
nl_close(mngr->cm_handle);
- nl_handle_destroy(mngr->cm_handle);
- }
+
+ for (i = 0; i < mngr->cm_nassocs; i++)
+ if (mngr->cm_assocs[i].ca_cache)
+ nl_cache_free(mngr->cm_assocs[i].ca_cache);
free(mngr->cm_assocs);
free(mngr);
#include "../src/utils.h"
+#include <signal.h>
+
+static int quit = 0;
static void change_cb(struct nl_cache *cache, struct nl_object *obj,
int action)
nl_object_dump(obj, &dp);
}
+static void sigint(int arg)
+{
+ quit = 1;
+}
+
int main(int argc, char *argv[])
{
struct nl_cache_mngr *mngr;
struct nl_cache *lc, *nc, *ac, *rc;
struct nl_handle *handle;
+ signal(SIGINT, sigint);
+
nltool_init(argc, argv);
handle = nltool_alloc_handle();
return -1;
}
- for (;;) {
+ while (!quit) {
int err = nl_cache_mngr_poll(mngr, 5000);
- if (err < 0) {
+ if (err < 0 && err != -EINTR) {
nl_perror("nl_cache_mngr_poll()");
return -1;
}
}
nl_cache_mngr_free(mngr);
+ nl_handle_destroy(handle);
return 0;
}