X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Ffilecount.c;h=7842aa610c786719f61762b11ca55ad6d9565941;hp=ba6835b7b91e391d6446dd53f1cbb73976706118;hb=7111bb6df7628edce3a8e538b386fbe27633a191;hpb=c08de9dfe347cfb3f3e1404de58ff90cbf761c51 diff --git a/src/filecount.c b/src/filecount.c index ba6835b7..7842aa61 100644 --- a/src/filecount.c +++ b/src/filecount.c @@ -34,6 +34,7 @@ #define FC_RECURSIVE 1 #define FC_HIDDEN 2 +#define FC_REGULAR 4 struct fc_directory_conf_s { char *path; @@ -70,14 +71,14 @@ void fc_free_dir(fc_directory_conf_t *dir) { sfree(dir->files_num_type); sfree(dir->type_instance); sfree(dir->name); - + sfree(dir); } /* void fc_free_dir */ static void fc_submit_dir(const fc_directory_conf_t *dir) { value_list_t vl = VALUE_LIST_INIT; - sstrncpy (vl.plugin, dir->plugin_name, sizeof (vl.plugin)); + sstrncpy(vl.plugin, dir->plugin_name, sizeof(vl.plugin)); if (dir->instance != NULL) sstrncpy(vl.plugin_instance, dir->instance, sizeof(vl.plugin_instance)); if (dir->type_instance != NULL) @@ -86,15 +87,15 @@ static void fc_submit_dir(const fc_directory_conf_t *dir) { vl.values_len = 1; if (dir->files_num_type != NULL) { - vl.values = &(value_t) {.gauge = (gauge_t)dir->files_num}; - sstrncpy (vl.type, dir->files_num_type, sizeof(vl.type)); + vl.values = &(value_t){.gauge = (gauge_t)dir->files_num}; + sstrncpy(vl.type, dir->files_num_type, sizeof(vl.type)); plugin_dispatch_values(&vl); } if (dir->files_size_type != NULL) { - vl.values = &(value_t) {.gauge = (gauge_t)dir->files_size}; - sstrncpy (vl.type, dir->files_size_type, sizeof(vl.type)); - plugin_dispatch_values (&vl); + vl.values = &(value_t){.gauge = (gauge_t)dir->files_size}; + sstrncpy(vl.type, dir->files_size_type, sizeof(vl.type)); + plugin_dispatch_values(&vl); } } /* void fc_submit_dir */ @@ -123,7 +124,6 @@ static void fc_submit_dir(const fc_directory_conf_t *dir) { static int fc_config_set_instance(fc_directory_conf_t *dir, const char *str) { char buffer[1024]; char *ptr; - char *copy; sstrncpy(buffer, str, sizeof(buffer)); for (ptr = buffer; *ptr != 0; ptr++) @@ -133,7 +133,7 @@ static int fc_config_set_instance(fc_directory_conf_t *dir, const char *str) { for (ptr = buffer; *ptr == '_'; ptr++) /* do nothing */; - copy = strdup(ptr); + char *copy = strdup(ptr); if (copy == NULL) return -1; @@ -156,15 +156,13 @@ static int fc_config_add_dir_instance(fc_directory_conf_t *dir, static int fc_config_add_dir_name(fc_directory_conf_t *dir, oconfig_item_t *ci) { - char *temp; - if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) { WARNING("filecount plugin: The `Name' config option needs exactly one " "string argument."); return -1; } - temp = strdup(ci->values[0].value.string); + char *temp = strdup(ci->values[0].value.string); if (temp == NULL) { ERROR("filecount plugin: strdup failed."); return -1; @@ -178,9 +176,6 @@ static int fc_config_add_dir_name(fc_directory_conf_t *dir, static int fc_config_add_dir_mtime(fc_directory_conf_t *dir, oconfig_item_t *ci) { - char *endptr; - double temp; - if ((ci->values_num != 1) || ((ci->values[0].type != OCONFIG_TYPE_STRING) && (ci->values[0].type != OCONFIG_TYPE_NUMBER))) { WARNING("filecount plugin: The `MTime' config option needs exactly one " @@ -194,8 +189,8 @@ static int fc_config_add_dir_mtime(fc_directory_conf_t *dir, } errno = 0; - endptr = NULL; - temp = strtod(ci->values[0].value.string, &endptr); + char *endptr = NULL; + double temp = strtod(ci->values[0].value.string, &endptr); if ((errno != 0) || (endptr == NULL) || (endptr == ci->values[0].value.string)) { WARNING("filecount plugin: Converting `%s' to a number failed.", @@ -246,9 +241,6 @@ static int fc_config_add_dir_mtime(fc_directory_conf_t *dir, static int fc_config_add_dir_size(fc_directory_conf_t *dir, oconfig_item_t *ci) { - char *endptr; - double temp; - if ((ci->values_num != 1) || ((ci->values[0].type != OCONFIG_TYPE_STRING) && (ci->values[0].type != OCONFIG_TYPE_NUMBER))) { WARNING("filecount plugin: The `Size' config option needs exactly one " @@ -262,8 +254,8 @@ static int fc_config_add_dir_size(fc_directory_conf_t *dir, } errno = 0; - endptr = NULL; - temp = strtod(ci->values[0].value.string, &endptr); + char *endptr = NULL; + double temp = strtod(ci->values[0].value.string, &endptr); if ((errno != 0) || (endptr == NULL) || (endptr == ci->values[0].value.string)) { WARNING("filecount plugin: Converting `%s' to a number failed.", @@ -329,9 +321,6 @@ static int fc_config_add_dir_option(fc_directory_conf_t *dir, } /* int fc_config_add_dir_option */ static int fc_config_add_dir(oconfig_item_t *ci) { - fc_directory_conf_t *dir, **temp; - int status; - if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) { WARNING("filecount plugin: `Directory' needs exactly one string " "argument."); @@ -339,7 +328,7 @@ static int fc_config_add_dir(oconfig_item_t *ci) { } /* Initialize `dir' */ - dir = calloc(1, sizeof(*dir)); + fc_directory_conf_t *dir = calloc(1, sizeof(*dir)); if (dir == NULL) { ERROR("filecount plugin: calloc failed."); return -1; @@ -352,7 +341,7 @@ static int fc_config_add_dir(oconfig_item_t *ci) { return -1; } - dir->options = FC_RECURSIVE; + dir->options = FC_RECURSIVE | FC_REGULAR; dir->name = NULL; dir->plugin_name = strdup("filecount"); @@ -364,15 +353,14 @@ static int fc_config_add_dir(oconfig_item_t *ci) { dir->files_size_type = strdup("bytes"); dir->files_num_type = strdup("files"); - if (dir->plugin_name == NULL - || dir->files_size_type == NULL - || dir->files_num_type == NULL) { + if (dir->plugin_name == NULL || dir->files_size_type == NULL || + dir->files_num_type == NULL) { ERROR("filecount plugin: strdup failed."); fc_free_dir(dir); return -1; } - status = 0; + int status = 0; for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *option = ci->children + i; @@ -390,12 +378,14 @@ static int fc_config_add_dir(oconfig_item_t *ci) { status = fc_config_add_dir_option(dir, option, FC_RECURSIVE); else if (strcasecmp("IncludeHidden", option->key) == 0) status = fc_config_add_dir_option(dir, option, FC_HIDDEN); + else if (strcasecmp("RegularOnly", option->key) == 0) + status = fc_config_add_dir_option(dir, option, FC_REGULAR); else if (strcasecmp("FilesSizeType", option->key) == 0) - status = cf_util_get_string (option, &dir->files_size_type); + status = cf_util_get_string(option, &dir->files_size_type); else if (strcasecmp("FilesCountType", option->key) == 0) - status = cf_util_get_string (option, &dir->files_num_type); + status = cf_util_get_string(option, &dir->files_num_type); else if (strcasecmp("TypeInstance", option->key) == 0) - status = cf_util_get_string (option, &dir->type_instance); + status = cf_util_get_string(option, &dir->type_instance); else { WARNING("filecount plugin: fc_config_add_dir: " "Option `%s' not allowed here.", @@ -441,7 +431,8 @@ static int fc_config_add_dir(oconfig_item_t *ci) { } /* Ready to add it to list */ - temp = realloc(directories, sizeof(*directories) * (directories_num + 1)); + fc_directory_conf_t **temp = + realloc(directories, sizeof(*directories) * (directories_num + 1)); if (temp == NULL) { ERROR("filecount plugin: realloc failed."); fc_free_dir(dir); @@ -483,14 +474,13 @@ static int fc_read_dir_callback(const char *dirname, const char *filename, fc_directory_conf_t *dir = user_data; char abs_path[PATH_MAX]; struct stat statbuf; - int status; if (dir == NULL) return -1; snprintf(abs_path, sizeof(abs_path), "%s/%s", dirname, filename); - status = lstat(abs_path, &statbuf); + int status = lstat(abs_path, &statbuf); if (status != 0) { ERROR("filecount plugin: stat (%s) failed.", abs_path); return -1; @@ -501,7 +491,7 @@ static int fc_read_dir_callback(const char *dirname, const char *filename, abs_path, fc_read_dir_callback, dir, /* include hidden = */ (dir->options & FC_HIDDEN) ? 1 : 0); return status; - } else if (!S_ISREG(statbuf.st_mode)) { + } else if ((dir->options & FC_REGULAR) && !S_ISREG(statbuf.st_mode)) { return 0; } @@ -511,6 +501,11 @@ static int fc_read_dir_callback(const char *dirname, const char *filename, return 0; } + if (!S_ISREG(statbuf.st_mode)) { + dir->files_num++; + return 0; + } + if (dir->mtime != 0) { time_t mtime = dir->now; @@ -547,15 +542,13 @@ static int fc_read_dir_callback(const char *dirname, const char *filename, } /* int fc_read_dir_callback */ static int fc_read_dir(fc_directory_conf_t *dir) { - int status; - dir->files_num = 0; dir->files_size = 0; if (dir->mtime != 0) dir->now = time(NULL); - status = + int status = walk_directory(dir->path, fc_read_dir_callback, dir, /* include hidden */ (dir->options & FC_HIDDEN) ? 1 : 0); if (status != 0) {