static int ts_create (const oconfig_item_t *ci, void **user_data) /* {{{ */ { ts_data_t *data; int status; int i; data = (ts_data_t *) malloc (sizeof (*data)); if (data == NULL) { ERROR ("ts_create: malloc failed."); return (-ENOMEM); } memset (data, 0, sizeof (*data)); data->factor = NAN; data->offset = NAN; status = 0; for (i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp ("Factor", child->key) == 0) status = ts_config_set_double (&data->factor, child); else if (strcasecmp ("Offset", child->key) == 0) status = ts_config_set_double (&data->offset, child); else { ERROR ("Target `scale': The `%s' configuration option is not understood " "and will be ignored.", child->key); status = 0; } if (status != 0) break; } /* Additional sanity-checking */ while (status == 0) { if (isnan (data->factor) && isnan (data->offset)) { ERROR ("Target `scale': You need to at least set either the `Factor' " "or `Offset' option!"); status = -1; } break; } if (status != 0) { ts_destroy ((void *) &data); return (status); } *user_data = data; return (0); } /* }}} int ts_create */
static int ts_create(const oconfig_item_t *ci, void **user_data) /* {{{ */ { ts_data_t *data; int status; data = calloc(1, sizeof(*data)); if (data == NULL) { ERROR("ts_create: calloc failed."); return (-ENOMEM); } data->host = NULL; data->plugin = NULL; data->plugin_instance = NULL; /* data->type = NULL; */ data->type_instance = NULL; data->meta = NULL; data->meta_delete = NULL; status = 0; for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if ((strcasecmp("Host", child->key) == 0) || (strcasecmp("Hostname", child->key) == 0)) status = ts_config_add_string(&data->host, child, /* may be empty = */ 0); else if (strcasecmp("Plugin", child->key) == 0) status = ts_config_add_string(&data->plugin, child, /* may be empty = */ 0); else if (strcasecmp("PluginInstance", child->key) == 0) status = ts_config_add_string(&data->plugin_instance, child, /* may be empty = */ 1); #if 0 else if (strcasecmp ("Type", child->key) == 0) status = ts_config_add_string (&data->type, child, /* may be empty = */ 0); #endif else if (strcasecmp("TypeInstance", child->key) == 0) status = ts_config_add_string(&data->type_instance, child, /* may be empty = */ 1); else if (strcasecmp("MetaData", child->key) == 0) status = ts_config_add_meta(&data->meta, child, /* may be empty = */ 1); else if (strcasecmp("DeleteMetaData", child->key) == 0) status = ts_config_add_meta_delete(&data->meta_delete, child); else { ERROR("Target `set': The `%s' configuration option is not understood " "and will be ignored.", child->key); status = 0; } if (status != 0) break; } /* Additional sanity-checking */ while (status == 0) { if ((data->host == NULL) && (data->plugin == NULL) && (data->plugin_instance == NULL) /* && (data->type == NULL) */ && (data->type_instance == NULL) && (data->meta == NULL) && (data->meta_delete == NULL)) { ERROR("Target `set': You need to set at least one of `Host', " "`Plugin', `PluginInstance', `TypeInstance', " "`MetaData', or `DeleteMetaData'."); status = -1; } if (data->meta != NULL) { /* If data->meta_delete is NULL, this loop is a no-op. */ for (ts_key_list_t *l = data->meta_delete; l != NULL; l = l->next) { if (meta_data_type(data->meta, l->key) != 0) { /* MetaData and DeleteMetaData for the same key. */ ERROR("Target `set': Can only have one of `MetaData' or " "`DeleteMetaData' for any given key."); status = -1; } } } break; } if (status != 0) { ts_destroy((void *)&data); return (status); } *user_data = data; return (0); } /* }}} int ts_create */
static int ts_create (const oconfig_item_t *ci, void **user_data) /* {{{ */ { ts_data_t *data; int status; int i; data = (ts_data_t *) malloc (sizeof (*data)); if (data == NULL) { ERROR ("ts_create: malloc failed."); return (-ENOMEM); } memset (data, 0, sizeof (*data)); data->host = NULL; data->plugin = NULL; data->plugin_instance = NULL; /* data->type = NULL; */ data->type_instance = NULL; status = 0; for (i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if ((strcasecmp ("Host", child->key) == 0) || (strcasecmp ("Hostname", child->key) == 0)) status = ts_config_add_string (&data->host, child, /* may be empty = */ 0); else if (strcasecmp ("Plugin", child->key) == 0) status = ts_config_add_string (&data->plugin, child, /* may be empty = */ 0); else if (strcasecmp ("PluginInstance", child->key) == 0) status = ts_config_add_string (&data->plugin_instance, child, /* may be empty = */ 1); #if 0 else if (strcasecmp ("Type", child->key) == 0) status = ts_config_add_string (&data->type, child, /* may be empty = */ 0); #endif else if (strcasecmp ("TypeInstance", child->key) == 0) status = ts_config_add_string (&data->type_instance, child, /* may be empty = */ 1); else { ERROR ("Target `set': The `%s' configuration option is not understood " "and will be ignored.", child->key); status = 0; } if (status != 0) break; } /* Additional sanity-checking */ while (status == 0) { if ((data->host == NULL) && (data->plugin == NULL) && (data->plugin_instance == NULL) /* && (data->type == NULL) */ && (data->type_instance == NULL)) { ERROR ("Target `set': You need to set at least one of `Host', " "`Plugin', `PluginInstance' or `TypeInstance'."); status = -1; } break; } if (status != 0) { ts_destroy ((void *) &data); return (status); } *user_data = data; return (0); } /* }}} int ts_create */
int main(int argc, char *argv[]) { LinkedList *ll = NULL; TreeSet *ts = NULL; char *sp; char pattern[4096]; RegExp *reg; Iterator *it; if (argc < 2) { fprintf(stderr, "Usage: ./fileCrawler pattern [dir] ...\n"); return -1; } /* * convert bash expression to regular expression and compile */ cvtPattern(pattern, argv[1]); if ((reg = re_create()) == NULL) { fprintf(stderr, "Error creating Regular Expression Instance\n"); return -1; } if (! re_compile(reg, pattern)) { char eb[4096]; re_status(reg, eb, sizeof eb); fprintf(stderr, "Compile error - pattern: `%s', error message: `%s'\n", pattern, eb); re_destroy(reg); return -1; } /* * create linked list and treeset */ if ((ll = ll_create()) == NULL) { fprintf(stderr, "Unable to create linked list\n"); goto done; } if ((ts = ts_create(scmp)) == NULL) { fprintf(stderr, "Unable to create tree set\n"); goto done; } /* * populate linked list */ if (argc == 2) { if (! processDirectory(".", ll, 1)) goto done; } else { int i; for (i = 2; i < argc; i++) { if (! processDirectory(argv[i], ll, 1)) goto done; } } /* * for each directory in the linked list, apply regular expression */ while (ll_removeFirst(ll, (void **)&sp)) { int stat = applyRe(sp, reg, ts); free(sp); if (! stat) break; } /* * create iterator to traverse files matching pattern in sorted order */ if ((it = ts_it_create(ts)) == NULL) { fprintf(stderr, "Unable to create iterator over tree set\n"); goto done; } while (it_hasNext(it)) { char *s; (void) it_next(it, (void **)&s); printf("%s\n", s); } it_destroy(it); /* * cleanup after ourselves so there are no memory leaks */ done: if (ll != NULL) ll_destroy(ll, free); if (ts != NULL) ts_destroy(ts, free); re_destroy(reg); return 0; }