/** * idmef_message_get_string: * @message: Pointer to an #idmef_message_t object. * @path: Path to retrieve the string from within @message. * @result: Pointer where the result should be stored. * * Retrieve the string stored within @path of @message and store it * in the user provided @result. * * The caller is responssible for freeing @result. * * Returns: A positive value in case @path was successfully retrieved * 0 if the path is empty, or a negative value if an error occured. */ int idmef_message_get_string(idmef_message_t *message, const char *path, char **result) { int ret; idmef_value_t *iv; prelude_string_t *str; ret = idmef_message_get_value(message, path, &iv); if ( ret <= 0 ) return ret; if ( idmef_value_get_type(iv) != IDMEF_VALUE_TYPE_STRING ) { ret = _idmef_value_cast(iv, IDMEF_VALUE_TYPE_STRING, 0); if ( ret < 0 ) goto err; } if ( ! (str = idmef_value_get_string(iv)) ) { ret = -1; goto err; } ret = prelude_string_get_string_released(str, result); err: idmef_value_destroy(iv); return ret; }
/* * Loads filename into memory, we use append_line() for that. */ static int load_file_in_memory(config_t *cfg) { int ret; FILE *fd; size_t len; prelude_string_t *out; char line[1024], *ptr, *tmp; ret = prelude_string_new(&out); if ( ret < 0 ) return ret; fd = fopen(cfg->filename, "r"); if ( ! fd ) { prelude_string_destroy(out); return prelude_error_verbose(prelude_error_code_from_errno(errno), "could not open '%s' for reading: %s", cfg->filename, strerror(errno)); } do { len = 0; ptr = fgets(line, sizeof(line), fd); if ( ptr ) { len = strlen(line); if ( line[len - 1] == '\n' ) line[len - 1] = 0; ret = prelude_string_cat(out, line); if ( ret < 0 ) goto err; if ( line[len - 1] != 0 ) continue; } ret = prelude_string_get_string_released(out, &tmp); if ( ret < 0 ) goto err; if ( ! tmp ) tmp = strdup(""); ret = op_append_line(cfg, tmp); if ( ret < 0 ) { free(tmp); goto err; } prelude_string_clear(out); } while ( ptr ); err: prelude_string_destroy(out); fclose(fd); return 0; }
static int default_table_name_resolver(const idmef_path_t *path, char **table_name) { char c; int ret; const char *class_name; prelude_string_t *string; prelude_bool_t next_is_maj = TRUE; class_name = idmef_class_get_name(idmef_path_get_class(path, idmef_path_get_depth(path) - 2)); ret = prelude_string_new(&string); if ( ret < 0 ) return ret; ret = prelude_string_cat(string, "Prelude_"); if ( ret < 0 ) goto error; while ( *class_name ) { c = *class_name++; if ( c == '_' ) { next_is_maj = TRUE; continue; } if ( next_is_maj ) { c += 'A' - 'a'; next_is_maj = FALSE; } ret = prelude_string_ncat(string, &c, 1); if ( ret < 0 ) goto error; } ret = prelude_string_get_string_released(string, table_name); error: prelude_string_destroy(string); return ret; }
static int value_resolve_variable(const char *ptr, char **out_p) { int ret; size_t i; char buf[512]; const char *tmp; prelude_string_t *out; ret = prelude_string_new(&out); if ( ret < 0 ) return ret; while ( *ptr ) { if ( *ptr == '$' ) { tmp = ptr; i = 0; do { buf[i++] = *ptr++; } while ( *ptr && *ptr != ' ' && *ptr != '$' && i < sizeof(buf) - 1); buf[i] = 0; if ( ! variable_get(buf + 1) ) ptr = tmp; else { prelude_string_cat(out, variable_get(buf + 1)); continue; } } prelude_string_ncat(out, ptr, 1); ptr++; } ret = prelude_string_get_string_released(out, out_p); prelude_string_destroy(out); return ret; }