diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/sifp/sss_sifp_attrs.c | 120 |
1 files changed, 77 insertions, 43 deletions
diff --git a/src/lib/sifp/sss_sifp_attrs.c b/src/lib/sifp/sss_sifp_attrs.c index 6d10c4611..1004252e3 100644 --- a/src/lib/sifp/sss_sifp_attrs.c +++ b/src/lib/sifp/sss_sifp_attrs.c @@ -23,41 +23,54 @@ #include "lib/sifp/sss_sifp.h" #include "lib/sifp/sss_sifp_private.h" -#define GET_ATTR(attrs, name, rtype, field, out) do { \ +#define GET_ATTR(attrs, name, rtype, field, out, ret) do { \ sss_sifp_attr *attr = sss_sifp_find_attr(attrs, name); \ \ if (attr == NULL) { \ - return SSS_SIFP_ATTR_MISSING; \ + ret = SSS_SIFP_ATTR_MISSING; \ + break; \ } \ \ if (attr->type != rtype) { \ - return SSS_SIFP_INCORRECT_TYPE; \ + ret = SSS_SIFP_INCORRECT_TYPE; \ + break; \ } \ \ if (attr->data.field == NULL) { \ - return SSS_SIFP_ATTR_NULL; \ + ret = SSS_SIFP_ATTR_NULL; \ + break; \ } \ \ out = attr->data.field[0]; \ + \ + ret = SSS_SIFP_OK; \ } while (0) -#define GET_ATTR_ARRAY(attrs, name, rtype, field, out_num, out_val) do { \ +#define GET_ATTR_ARRAY(attrs, name, rtype, field, out_num, out_val, ret) \ +do { \ sss_sifp_attr *attr = sss_sifp_find_attr(attrs, name); \ \ if (attr == NULL) { \ - return SSS_SIFP_ATTR_MISSING; \ + ret = SSS_SIFP_ATTR_MISSING; \ + break; \ } \ \ if (attr->type != rtype) { \ - return SSS_SIFP_INCORRECT_TYPE; \ + ret = SSS_SIFP_INCORRECT_TYPE; \ + break; \ } \ \ if (attr->data.field == NULL) { \ - return SSS_SIFP_ATTR_NULL; \ + out_num = 0; \ + out_val = NULL; \ + ret = SSS_SIFP_ATTR_NULL; \ + break; \ } \ \ out_num = attr->num_values; \ out_val = attr->data.field; \ + \ + ret = SSS_SIFP_OK; \ } while (0) static sss_sifp_attr *sss_sifp_find_attr(sss_sifp_attr **attrs, @@ -83,8 +96,9 @@ sss_sifp_find_attr_as_bool(sss_sifp_attr **attrs, const char *name, bool *_value) { - GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_BOOL, boolean, *_value); - return SSS_SIFP_OK; + sss_sifp_error ret; + GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_BOOL, boolean, *_value, ret); + return ret; } sss_sifp_error @@ -92,8 +106,9 @@ sss_sifp_find_attr_as_int16(sss_sifp_attr **attrs, const char *name, int16_t *_value) { - GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_INT16, int16, *_value); - return SSS_SIFP_OK; + sss_sifp_error ret; + GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_INT16, int16, *_value, ret); + return ret; } sss_sifp_error @@ -101,8 +116,9 @@ sss_sifp_find_attr_as_uint16(sss_sifp_attr **attrs, const char *name, uint16_t *_value) { - GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_UINT16, uint16, *_value); - return SSS_SIFP_OK; + sss_sifp_error ret; + GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_UINT16, uint16, *_value, ret); + return ret; } sss_sifp_error @@ -110,8 +126,9 @@ sss_sifp_find_attr_as_int32(sss_sifp_attr **attrs, const char *name, int32_t *_value) { - GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_INT32, int32, *_value); - return SSS_SIFP_OK; + sss_sifp_error ret; + GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_INT32, int32, *_value, ret); + return ret; } sss_sifp_error @@ -119,8 +136,9 @@ sss_sifp_find_attr_as_uint32(sss_sifp_attr **attrs, const char *name, uint32_t *_value) { - GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_UINT32, uint32, *_value); - return SSS_SIFP_OK; + sss_sifp_error ret; + GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_UINT32, uint32, *_value, ret); + return ret; } sss_sifp_error @@ -128,8 +146,9 @@ sss_sifp_find_attr_as_int64(sss_sifp_attr **attrs, const char *name, int64_t *_value) { - GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_INT64, int64, *_value); - return SSS_SIFP_OK; + sss_sifp_error ret; + GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_INT64, int64, *_value, ret); + return ret; } sss_sifp_error @@ -137,8 +156,9 @@ sss_sifp_find_attr_as_uint64(sss_sifp_attr **attrs, const char *name, uint64_t *_value) { - GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_UINT64, uint64, *_value); - return SSS_SIFP_OK; + sss_sifp_error ret; + GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_UINT64, uint64, *_value, ret); + return ret; } sss_sifp_error @@ -146,16 +166,18 @@ sss_sifp_find_attr_as_string(sss_sifp_attr **attrs, const char *name, const char **_value) { + sss_sifp_error ret; const char *value = NULL; - GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_STRING, str, value); + GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_STRING, str, value, ret); - if (value == NULL) { - return SSS_SIFP_ATTR_NULL; + if (ret == SSS_SIFP_ATTR_NULL) { + *_value = NULL; + return ret; } *_value = value; - return SSS_SIFP_OK; + return ret; } sss_sifp_error @@ -174,6 +196,7 @@ sss_sifp_find_attr_as_string_dict(sss_sifp_attr **attrs, } if (attr->data.str_dict == NULL) { + *_value = NULL; return SSS_SIFP_ATTR_NULL; } @@ -196,9 +219,10 @@ sss_sifp_find_attr_as_bool_array(sss_sifp_attr **attrs, unsigned int *_num_values, bool **_value) { + sss_sifp_error ret; GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_BOOL, boolean, - *_num_values, *_value); - return SSS_SIFP_OK; + *_num_values, *_value, ret); + return ret; } sss_sifp_error @@ -207,9 +231,10 @@ sss_sifp_find_attr_as_int16_array(sss_sifp_attr **attrs, unsigned int *_num_values, int16_t **_value) { + sss_sifp_error ret; GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_INT16, int16, - *_num_values, *_value); - return SSS_SIFP_OK; + *_num_values, *_value, ret); + return ret; } sss_sifp_error @@ -218,9 +243,10 @@ sss_sifp_find_attr_as_uint16_array(sss_sifp_attr **attrs, unsigned int *_num_values, uint16_t **_value) { + sss_sifp_error ret; GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_UINT16, uint16, - *_num_values, *_value); - return SSS_SIFP_OK; + *_num_values, *_value, ret); + return ret; } sss_sifp_error @@ -229,9 +255,10 @@ sss_sifp_find_attr_as_int32_array(sss_sifp_attr **attrs, unsigned int *_num_values, int32_t **_value) { + sss_sifp_error ret; GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_INT32, int32, - *_num_values, *_value); - return SSS_SIFP_OK; + *_num_values, *_value, ret); + return ret; } sss_sifp_error @@ -240,9 +267,10 @@ sss_sifp_find_attr_as_uint32_array(sss_sifp_attr **attrs, unsigned int *_num_values, uint32_t **_value) { + sss_sifp_error ret; GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_UINT32, uint32, - *_num_values, *_value); - return SSS_SIFP_OK; + *_num_values, *_value, ret); + return ret; } sss_sifp_error @@ -251,9 +279,10 @@ sss_sifp_find_attr_as_int64_array(sss_sifp_attr **attrs, unsigned int *_num_values, int64_t **_value) { + sss_sifp_error ret; GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_INT64, int64, - *_num_values, *_value); - return SSS_SIFP_OK; + *_num_values, *_value, ret); + return ret; } sss_sifp_error @@ -262,9 +291,10 @@ sss_sifp_find_attr_as_uint64_array(sss_sifp_attr **attrs, unsigned int *_num_values, uint64_t **_value) { + sss_sifp_error ret; GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_UINT64, uint64, - *_num_values, *_value); - return SSS_SIFP_OK; + *_num_values, *_value, ret); + return ret; } sss_sifp_error @@ -273,11 +303,15 @@ sss_sifp_find_attr_as_string_array(sss_sifp_attr **attrs, unsigned int *_num_values, const char * const **_value) { + sss_sifp_error ret; char **value; GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_STRING, str, - *_num_values, value); - *_value = (const char * const *)value; + *_num_values, value, ret); - return SSS_SIFP_OK; + if (ret == SSS_SIFP_OK || ret == SSS_SIFP_ATTR_NULL) { + *_value = (const char * const *)value; + } + + return ret; } |