diff options
| author | Venky Shankar <venky@gluster.com> | 2011-08-16 12:17:29 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vijay@gluster.com> | 2011-08-24 06:41:39 -0700 | 
| commit | d499cb8064f61b70bc37a7d6cbf0f0c3b219c342 (patch) | |
| tree | 5a93bc707dd7a18e103e0ce686615711323f9775 /libglusterfs/src | |
| parent | 6f1062f3473407cebfd5d902db2d2c6965dcf034 (diff) | |
afr/stripe: collect pathinfo xattr from all childs
Change-Id: Iec8b609e66ef21f4fdd6ee2ff3060f0b71d47ca0
BUG: 3046
Reviewed-on: http://review.gluster.com/237
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Amar Tumballi <amar@gluster.com>
Diffstat (limited to 'libglusterfs/src')
| -rw-r--r-- | libglusterfs/src/dict.c | 96 | ||||
| -rw-r--r-- | libglusterfs/src/dict.h | 2 | 
2 files changed, 98 insertions, 0 deletions
diff --git a/libglusterfs/src/dict.c b/libglusterfs/src/dict.c index 18e62d96f42..7fbacf7c3d0 100644 --- a/libglusterfs/src/dict.c +++ b/libglusterfs/src/dict.c @@ -2610,3 +2610,99 @@ unlock:  out:          return ret;  } + +/** + * _dict_serialize_value_with_delim: serialize the values in the dictionary + * into a buffer separated by delimiter (except the last) + * + * @this      : dictionary to serialize + * @buf       : the buffer to store the serialized data + * @serz_len  : the length of the serialized data (excluding the last delimiter) + * @delimiter : the delimiter to separate the values + * + * @return    : 0 -> success + *            : -errno -> faliure + */ +int +_dict_serialize_value_with_delim (dict_t *this, char *buf, int32_t *serz_len, +                                  char delimiter) +{ +        int          ret       = -1; +        int32_t      count     = 0; +        int32_t      vallen    = 0; +        int32_t      total_len = 0; +        data_pair_t *pair      = NULL; + +        if (!buf) { +                gf_log ("dict", GF_LOG_ERROR, "buf is null"); +                goto out; +        } + +        count = this->count; +        if (count < 0) { +                gf_log ("dict", GF_LOG_ERROR, "count (%d) < 0", count); +                goto out; +        } + +        pair = this->members_list; + +        while (count) { +                if (!pair) { +                        gf_log ("dict", GF_LOG_ERROR, +                                "less than count data pairs found"); +                        goto out; +                } + +                if (!pair->key || !pair->value) { +                        gf_log ("dict", GF_LOG_ERROR, +                                "key or value is null"); +                        goto out; +                } + +                if (!pair->value->data) { +                        gf_log ("dict", GF_LOG_ERROR, +                                "null value found in dict"); +                        goto out; +                } + +                vallen = pair->value->len - 1; // length includes \0 +                memcpy (buf, pair->value->data, vallen); +                buf += vallen; +                *buf++ = delimiter; + +                total_len += (vallen + 1); + +                pair = pair->next; +                count--; +        } + +        *--buf = '\0'; // remove the last delimiter +        total_len--;   // adjust the length +        ret = 0; + +        if (serz_len) +                *serz_len = total_len; + + out: +        return ret; +} + +int +dict_serialize_value_with_delim (dict_t *this, char *buf, int32_t *serz_len, +                                 char delimiter) +{ +        int           ret    = -1; + +        if (!this || !buf) { +                gf_log_callingfn ("dict", GF_LOG_WARNING, "dict is null!"); +                goto out; +        } + +        LOCK (&this->lock); +        { +                ret = _dict_serialize_value_with_delim (this, buf, serz_len, delimiter); +        } +        UNLOCK (&this->lock); +out: +        return ret; +} diff --git a/libglusterfs/src/dict.h b/libglusterfs/src/dict.h index 9ee094eca62..0d404997ee0 100644 --- a/libglusterfs/src/dict.h +++ b/libglusterfs/src/dict.h @@ -184,4 +184,6 @@ GF_MUST_CHECK int dict_set_dynstr (dict_t *this, char *key, char *str);  GF_MUST_CHECK int dict_get_str (dict_t *this, char *key, char **str);  GF_MUST_CHECK int dict_get_str_boolean (dict_t *this, char *key, int default_val); +GF_MUST_CHECK int dict_serialize_value_with_delim (dict_t *this, char *buf, int32_t *serz_len, +                                                    char delimiter);  #endif  | 
