summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/sifp/sss_sifp_attrs.c120
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;
}