/**
 * 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;
}
示例#2
0
/*
 * 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;
}
示例#4
0
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;
}