summaryrefslogtreecommitdiffstats
path: root/src/lib/sifp/sss_sifp_attrs.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 05:31:45 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 05:31:45 +0000
commit74aa0bc6779af38018a03fd2cf4419fe85917904 (patch)
tree9cb0681aac9a94a49c153d5823e7a55d1513d91f /src/lib/sifp/sss_sifp_attrs.c
parentInitial commit. (diff)
downloadsssd-74aa0bc6779af38018a03fd2cf4419fe85917904.tar.xz
sssd-74aa0bc6779af38018a03fd2cf4419fe85917904.zip
Adding upstream version 2.9.4.upstream/2.9.4
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/lib/sifp/sss_sifp_attrs.c')
-rw-r--r--src/lib/sifp/sss_sifp_attrs.c317
1 files changed, 317 insertions, 0 deletions
diff --git a/src/lib/sifp/sss_sifp_attrs.c b/src/lib/sifp/sss_sifp_attrs.c
new file mode 100644
index 0000000..8bc9c5d
--- /dev/null
+++ b/src/lib/sifp/sss_sifp_attrs.c
@@ -0,0 +1,317 @@
+/*
+ Authors:
+ Pavel Březina <pbrezina@redhat.com>
+
+ Copyright (C) 2014 Red Hat
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <string.h>
+
+#include "lib/sifp/sss_sifp.h"
+#include "lib/sifp/sss_sifp_private.h"
+
+#define GET_ATTR(attrs, name, rtype, field, out, ret) do { \
+ sss_sifp_attr *attr = sss_sifp_find_attr(attrs, name); \
+ \
+ if (attr == NULL) { \
+ ret = SSS_SIFP_ATTR_MISSING; \
+ break; \
+ } \
+ \
+ if (attr->type != rtype) { \
+ ret = SSS_SIFP_INCORRECT_TYPE; \
+ break; \
+ } \
+ \
+ if (attr->data.field == 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, ret) \
+do { \
+ sss_sifp_attr *attr = sss_sifp_find_attr(attrs, name); \
+ \
+ if (attr == NULL) { \
+ ret = SSS_SIFP_ATTR_MISSING; \
+ break; \
+ } \
+ \
+ if (attr->type != rtype) { \
+ ret = SSS_SIFP_INCORRECT_TYPE; \
+ break; \
+ } \
+ \
+ if (attr->data.field == 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,
+ const char *name)
+{
+ int i;
+
+ if (attrs == NULL || name == NULL) {
+ return NULL;
+ }
+
+ for (i = 0; attrs[i] != NULL; i++) {
+ if (strcmp(attrs[i]->name, name) == 0) {
+ return attrs[i];
+ }
+ }
+
+ return NULL;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_bool(sss_sifp_attr **attrs,
+ const char *name,
+ bool *_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_BOOL, boolean, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_int16(sss_sifp_attr **attrs,
+ const char *name,
+ int16_t *_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_INT16, int16, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_uint16(sss_sifp_attr **attrs,
+ const char *name,
+ uint16_t *_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_UINT16, uint16, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_int32(sss_sifp_attr **attrs,
+ const char *name,
+ int32_t *_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_INT32, int32, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_uint32(sss_sifp_attr **attrs,
+ const char *name,
+ uint32_t *_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_UINT32, uint32, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_int64(sss_sifp_attr **attrs,
+ const char *name,
+ int64_t *_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_INT64, int64, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_uint64(sss_sifp_attr **attrs,
+ const char *name,
+ uint64_t *_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_UINT64, uint64, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_string(sss_sifp_attr **attrs,
+ const char *name,
+ const char **_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ const char *value = NULL;
+
+ GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_STRING, str, value, ret);
+
+ if (ret == SSS_SIFP_ATTR_NULL) {
+ *_value = NULL;
+ return ret;
+ }
+
+ *_value = value;
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_string_dict(sss_sifp_attr **attrs,
+ const char *name,
+ hash_table_t **_value)
+{
+ sss_sifp_attr *attr = sss_sifp_find_attr(attrs, name);
+
+ if (attr == NULL) {
+ return SSS_SIFP_ATTR_MISSING;
+ }
+
+ if (attr->type != SSS_SIFP_ATTR_TYPE_STRING_DICT) {
+ return SSS_SIFP_INCORRECT_TYPE;
+ }
+
+ if (attr->data.str_dict == NULL) {
+ *_value = NULL;
+ return SSS_SIFP_ATTR_NULL;
+ }
+
+ *_value = attr->data.str_dict;
+
+ return SSS_SIFP_OK;
+}
+
+/**
+ * @brief Find attribute in list and return its values.
+ *
+ * @param[in] attrs Attributes
+ * @param[in] name Name of the attribute to find
+ *
+ * @return Attribute values or NULL if it is not found.
+ */
+sss_sifp_error
+sss_sifp_find_attr_as_bool_array(sss_sifp_attr **attrs,
+ const char *name,
+ unsigned int *_num_values,
+ bool **_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_BOOL, boolean,
+ *_num_values, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_int16_array(sss_sifp_attr **attrs,
+ const char *name,
+ unsigned int *_num_values,
+ int16_t **_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_INT16, int16,
+ *_num_values, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_uint16_array(sss_sifp_attr **attrs,
+ const char *name,
+ unsigned int *_num_values,
+ uint16_t **_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_UINT16, uint16,
+ *_num_values, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_int32_array(sss_sifp_attr **attrs,
+ const char *name,
+ unsigned int *_num_values,
+ int32_t **_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_INT32, int32,
+ *_num_values, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_uint32_array(sss_sifp_attr **attrs,
+ const char *name,
+ unsigned int *_num_values,
+ uint32_t **_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_UINT32, uint32,
+ *_num_values, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_int64_array(sss_sifp_attr **attrs,
+ const char *name,
+ unsigned int *_num_values,
+ int64_t **_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_INT64, int64,
+ *_num_values, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_uint64_array(sss_sifp_attr **attrs,
+ const char *name,
+ unsigned int *_num_values,
+ uint64_t **_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_UINT64, uint64,
+ *_num_values, *_value, ret);
+ return ret;
+}
+
+sss_sifp_error
+sss_sifp_find_attr_as_string_array(sss_sifp_attr **attrs,
+ const char *name,
+ unsigned int *_num_values,
+ const char * const **_value)
+{
+ sss_sifp_error ret = SSS_SIFP_ATTR_MISSING;
+ char **value = NULL;
+
+ GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_STRING, str,
+ *_num_values, value, ret);
+
+ if (ret == SSS_SIFP_OK || ret == SSS_SIFP_ATTR_NULL) {
+ *_value = (const char * const *)value;
+ }
+
+ return ret;
+}