diff options
author | Dmitri Pal <dpal@redhat.com> | 2010-08-30 10:10:02 -0400 |
---|---|---|
committer | Dmitri Pal <dpal@redhat.com> | 2010-08-30 10:10:02 -0400 |
commit | 8ed793f9cdf2b7ccc90b3d2d6319a58f7843991a (patch) | |
tree | 1f789e235200adf8a05b8b9a85e62afcd81e0d0c /common/ini/ini_valueobj.c | |
parent | 1e137bae0f30ff57636a2c9489992050e5a9515a (diff) | |
download | sssd-master.tar.gz sssd-master.tar.xz sssd-master.zip |
Diffstat (limited to 'common/ini/ini_valueobj.c')
-rw-r--r-- | common/ini/ini_valueobj.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/common/ini/ini_valueobj.c b/common/ini/ini_valueobj.c index 02b9732..4659faa 100644 --- a/common/ini/ini_valueobj.c +++ b/common/ini/ini_valueobj.c @@ -195,8 +195,15 @@ static int value_fold(struct simplebuffer *unfolded, /* Get the buffer info */ len = simplebuffer_get_len(unfolded); + if (!len) { + /* Nothing to fold */ + TRACE_FLOW_EXIT(); + return EOK; + } + buf = (const char *)simplebuffer_get_buf(unfolded); + /* Make sure that we have at least one character to fold */ if (fold_bound == 0) fold_bound++; @@ -564,6 +571,84 @@ int value_create_new(const char *strvalue, return error; } +/* Create a copy of the value */ +int value_copy(struct value_obj *vo + struct value_obj **copy_vo) +{ + + int error = EOK; + struct value_obj *new_vo = NULL; + struct simplebuffer *oneline = NULL; + + TRACE_FLOW_ENTRY(); + + if ((!copy_vo) || (!vo)) { + TRACE_ERROR_NUMBER("Invalid argument", EINVAL); + return EINVAL; + } + + /* Create buffer to hold the value */ + error = simplebuffer_alloc(&oneline); + if (error) { + TRACE_ERROR_NUMBER("Failed to allocate dynamic string.", error); + return error; + } + + /* Put value into the buffer */ + error = simplebuffer_add_str(oneline, + simplebuffer_get_buf(vo->unfolded), + simplebuffer_get_len(vo->unfolded), + INI_VALUE_BLOCK); + if (error) { + TRACE_ERROR_NUMBER("Failed to add string", error); + simplebuffer_free(oneline); + return error; + } + + /* Acllocate new INI value structure */ + new_vo = malloc(sizeof(struct value_obj)); + if (!new_vo) { + TRACE_ERROR_NUMBER("No memory", ENOMEM); + simplebuffer_free(oneline); + return ENOMEM; + } + + new_vo->origin = vo->origin; + new_vo->line = vo->line; + new_vo->unfolded = oneline; + new_vo->keylen = vo->key_len; + new_vo->boundary = vo->boundary; + new_vo->raw_lines = NULL; + new_vo->raw_lengths = NULL; + + error = value_create_arrays(&(new_vo->raw_lines), + &(new_vo->raw_lengths)); + + if (error) { + TRACE_ERROR_NUMBER("Failed to fold", error); + value_destroy(new_vo); + return error; + } + + /* Create arrays by folding the value */ + error = value_fold(new_vo->unfolded, + new_vo->keylen, + new_vo->boundary, + new_vo->raw_lines, + new_vo->raw_lengths); + if (error) { + TRACE_ERROR_NUMBER("Failed to fold", error); + value_destroy(new_vo); + return error; + } + + *vo = new_vo; + + TRACE_FLOW_EXIT(); + + return error; +} + /* Get concatenated value */ int value_get_concatenated(struct value_obj *vo, const char **fullstr) @@ -643,6 +728,35 @@ int value_set_keylen(struct value_obj *vo, uint32_t key_len) return EOK; } +/* Change boundary */ +int value_set_boundary(struct value_obj *vo, uint32_t boundary) +{ + int error = EOK; + TRACE_FLOW_ENTRY(); + + if (!vo) { + TRACE_ERROR_NUMBER("Invalid object", EINVAL); + return EINVAL; + } + + vo->boundary = boundary; + + /* Fold in new value */ + error = value_fold(vo->unfolded, + vo->keylen, + vo->boundary, + vo->raw_lines, + vo->raw_lengths); + if (error) { + TRACE_ERROR_NUMBER("Failed to fold", error); + /* In this case nothing to free here but + * the object might be unusable */ + return error; + } + + TRACE_FLOW_EXIT(); + return EOK; +} /* Update value */ int value_update(struct value_obj *vo, |