X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_vl_lookup.c;h=8a2e5671110f196e9ba72166303d9fbd436826b9;hb=444438552db9fa889fb0b15e8c68ed1804312c1f;hp=b15dcf0225bb66257fbb4303a663df9e49bebc31;hpb=c1219a1c9db2e8400e2ee94b87f86ccd441485d5;p=collectd.git diff --git a/src/utils_vl_lookup.c b/src/utils_vl_lookup.c index b15dcf02..8a2e5671 100644 --- a/src/utils_vl_lookup.c +++ b/src/utils_vl_lookup.c @@ -1,6 +1,6 @@ /** * collectd - src/utils_vl_lookup.c - * Copyright (C) 2012 Florian Forster + * Copyright (C) 2012 Florian Forster * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -33,6 +33,10 @@ #include "utils_vl_lookup.h" #include "utils_avltree.h" +#if HAVE_LIBKSTAT +kstat_ctl_t *kc; +#endif /* HAVE_LIBKSTAT */ + #if BUILD_TEST # define sstrncpy strncpy # define plugin_log(s, ...) do { \ @@ -153,7 +157,7 @@ static int lu_copy_ident_to_match_part (part_match_t *match_part, /* {{{ */ assert (sizeof (match_part->str) > len); /* strip trailing slash */ match_part->str[len - 2] = 0; - + status = regcomp (&match_part->regex, match_part->str, /* flags = */ REG_EXTENDED); if (status != 0) @@ -165,7 +169,7 @@ static int lu_copy_ident_to_match_part (part_match_t *match_part, /* {{{ */ return (EINVAL); } match_part->is_regex = 1; - + return (0); } /* }}} int lu_copy_ident_to_match_part */ @@ -200,13 +204,12 @@ static void *lu_create_user_obj (lookup_t *obj, /* {{{ */ { user_obj_t *user_obj; - user_obj = malloc (sizeof (*user_obj)); + user_obj = calloc (1, sizeof (*user_obj)); if (user_obj == NULL) { - ERROR ("utils_vl_lookup: malloc failed."); + ERROR ("utils_vl_lookup: calloc failed."); return (NULL); } - memset (user_obj, 0, sizeof (*user_obj)); user_obj->next = NULL; user_obj->user_obj = obj->cb_user_class (ds, vl, user_class->user_class); @@ -333,7 +336,7 @@ static int lu_handle_user_class_list (lookup_t *obj, /* {{{ */ { user_class_list_t *ptr; int retval = 0; - + for (ptr = user_class_list; ptr != NULL; ptr = ptr->next) { int status; @@ -369,16 +372,15 @@ static by_type_entry_t *lu_search_by_type (lookup_t *obj, /* {{{ */ return (NULL); } - by_type = malloc (sizeof (*by_type)); + by_type = calloc (1, sizeof (*by_type)); if (by_type == NULL) { - ERROR ("utils_vl_lookup: malloc failed."); + ERROR ("utils_vl_lookup: calloc failed."); sfree (type_copy); return (NULL); } - memset (by_type, 0, sizeof (*by_type)); by_type->wildcard_plugin_list = NULL; - + by_type->by_plugin_tree = c_avl_create ((void *) strcmp); if (by_type->by_plugin_tree == NULL) { @@ -399,7 +401,7 @@ static by_type_entry_t *lu_search_by_type (lookup_t *obj, /* {{{ */ sfree (type_copy); return (NULL); } - + return (by_type); } /* }}} by_type_entry_t *lu_search_by_type */ @@ -493,6 +495,21 @@ static void lu_destroy_user_class_list (lookup_t *obj, /* {{{ */ obj->cb_free_class (user_class_list->entry.user_class); user_class_list->entry.user_class = NULL; +#define CLEAR_FIELD(field) do { \ + if (user_class_list->entry.match.field.is_regex) { \ + regfree (&user_class_list->entry.match.field.regex); \ + user_class_list->entry.match.field.is_regex = 0; \ + } \ +} while (0) + + CLEAR_FIELD (host); + CLEAR_FIELD (plugin); + CLEAR_FIELD (plugin_instance); + CLEAR_FIELD (type); + CLEAR_FIELD (type_instance); + +#undef CLEAR_FIELD + lu_destroy_user_obj (obj, user_class_list->entry.user_obj_list); user_class_list->entry.user_obj_list = NULL; pthread_mutex_destroy (&user_class_list->entry.lock); @@ -505,7 +522,7 @@ static void lu_destroy_user_class_list (lookup_t *obj, /* {{{ */ static void lu_destroy_by_type (lookup_t *obj, /* {{{ */ by_type_entry_t *by_type) { - + while (42) { char *plugin = NULL; @@ -540,13 +557,12 @@ lookup_t *lookup_create (lookup_class_callback_t cb_user_class, /* {{{ */ lookup_free_class_callback_t cb_free_class, lookup_free_obj_callback_t cb_free_obj) { - lookup_t *obj = malloc (sizeof (*obj)); + lookup_t *obj = calloc (1, sizeof (*obj)); if (obj == NULL) { - ERROR ("utils_vl_lookup: malloc failed."); + ERROR ("utils_vl_lookup: calloc failed."); return (NULL); } - memset (obj, 0, sizeof (*obj)); obj->by_type_tree = c_avl_create ((void *) strcmp); if (obj->by_type_tree == NULL) @@ -601,13 +617,12 @@ int lookup_add (lookup_t *obj, /* {{{ */ if (by_type == NULL) return (-1); - user_class_obj = malloc (sizeof (*user_class_obj)); + user_class_obj = calloc (1, sizeof (*user_class_obj)); if (user_class_obj == NULL) { - ERROR ("utils_vl_lookup: malloc failed."); + ERROR ("utils_vl_lookup: calloc failed."); return (ENOMEM); } - memset (user_class_obj, 0, sizeof (*user_class_obj)); pthread_mutex_init (&user_class_obj->entry.lock, /* attr = */ NULL); user_class_obj->entry.user_class = user_class; lu_copy_ident_to_match (&user_class_obj->entry.match, ident, group_by); @@ -651,6 +666,6 @@ int lookup_search (lookup_t *obj, /* {{{ */ return (status); retval += status; } - + return (retval); } /* }}} lookup_search */