LCOV - code coverage report
Current view: top level - lib/sifp - sss_sifp_attrs.c (source / functions) Hit Total Coverage
Test: .coverage.total Lines: 59 73 80.8 %
Date: 2015-10-19 Functions: 16 18 88.9 %

          Line data    Source code
       1             : /*
       2             :     Authors:
       3             :         Pavel Březina <pbrezina@redhat.com>
       4             : 
       5             :     Copyright (C) 2014 Red Hat
       6             : 
       7             :     This program is free software; you can redistribute it and/or modify
       8             :     it under the terms of the GNU General Public License as published by
       9             :     the Free Software Foundation; either version 3 of the License, or
      10             :     (at your option) any later version.
      11             : 
      12             :     This program is distributed in the hope that it will be useful,
      13             :     but WITHOUT ANY WARRANTY; without even the implied warranty of
      14             :     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15             :     GNU General Public License for more details.
      16             : 
      17             :     You should have received a copy of the GNU General Public License
      18             :     along with this program.  If not, see <http://www.gnu.org/licenses/>.
      19             : */
      20             : 
      21             : #include <string.h>
      22             : 
      23             : #include "lib/sifp/sss_sifp.h"
      24             : #include "lib/sifp/sss_sifp_private.h"
      25             : 
      26             : #define GET_ATTR(attrs, name, rtype, field, out, ret) do {                  \
      27             :     sss_sifp_attr *attr = sss_sifp_find_attr(attrs, name);                  \
      28             :                                                                             \
      29             :     if (attr == NULL) {                                                     \
      30             :         ret = SSS_SIFP_ATTR_MISSING;                                        \
      31             :         break;                                                              \
      32             :     }                                                                       \
      33             :                                                                             \
      34             :     if (attr->type != rtype) {                                              \
      35             :         ret = SSS_SIFP_INCORRECT_TYPE;                                      \
      36             :         break;                                                              \
      37             :     }                                                                       \
      38             :                                                                             \
      39             :     if (attr->data.field == NULL) {                                         \
      40             :         ret = SSS_SIFP_ATTR_NULL;                                           \
      41             :         break;                                                              \
      42             :     }                                                                       \
      43             :                                                                             \
      44             :     out = attr->data.field[0];                                              \
      45             :                                                                             \
      46             :     ret = SSS_SIFP_OK;                                                      \
      47             : } while (0)
      48             : 
      49             : #define GET_ATTR_ARRAY(attrs, name, rtype, field, out_num, out_val, ret)    \
      50             : do {                                                                        \
      51             :     sss_sifp_attr *attr = sss_sifp_find_attr(attrs, name);                  \
      52             :                                                                             \
      53             :     if (attr == NULL) {                                                     \
      54             :         ret = SSS_SIFP_ATTR_MISSING;                                        \
      55             :         break;                                                              \
      56             :     }                                                                       \
      57             :                                                                             \
      58             :     if (attr->type != rtype) {                                              \
      59             :         ret = SSS_SIFP_INCORRECT_TYPE;                                      \
      60             :         break;                                                              \
      61             :     }                                                                       \
      62             :                                                                             \
      63             :     if (attr->data.field == NULL) {                                         \
      64             :         out_num = 0;                                                        \
      65             :         out_val = NULL;                                                     \
      66             :         ret = SSS_SIFP_ATTR_NULL;                                           \
      67             :         break;                                                              \
      68             :     }                                                                       \
      69             :                                                                             \
      70             :     out_num = attr->num_values;                                             \
      71             :     out_val = attr->data.field;                                             \
      72             :                                                                             \
      73             :     ret = SSS_SIFP_OK;                                                      \
      74             : } while (0)
      75             : 
      76          41 : static sss_sifp_attr *sss_sifp_find_attr(sss_sifp_attr **attrs,
      77             :                                          const char *name)
      78             : {
      79             :     int i;
      80             : 
      81          41 :     if (attrs == NULL || name == NULL) {
      82           0 :         return NULL;
      83             :     }
      84             : 
      85          53 :     for (i = 0; attrs[i] != NULL; i++) {
      86          53 :         if (strcmp(attrs[i]->name, name) == 0) {
      87          41 :             return attrs[i];
      88             :         }
      89             :     }
      90             : 
      91           0 :     return NULL;
      92             : }
      93             : 
      94             : sss_sifp_error
      95           1 : sss_sifp_find_attr_as_bool(sss_sifp_attr **attrs,
      96             :                            const char *name,
      97             :                            bool *_value)
      98             : {
      99             :     sss_sifp_error ret;
     100           1 :     GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_BOOL, boolean, *_value, ret);
     101           1 :     return ret;
     102             : }
     103             : 
     104             : sss_sifp_error
     105           1 : sss_sifp_find_attr_as_int16(sss_sifp_attr **attrs,
     106             :                             const char *name,
     107             :                             int16_t *_value)
     108             : {
     109             :     sss_sifp_error ret;
     110           1 :     GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_INT16, int16, *_value, ret);
     111           1 :     return ret;
     112             : }
     113             : 
     114             : sss_sifp_error
     115           1 : sss_sifp_find_attr_as_uint16(sss_sifp_attr **attrs,
     116             :                              const char *name,
     117             :                              uint16_t *_value)
     118             : {
     119             :     sss_sifp_error ret;
     120           1 :     GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_UINT16, uint16, *_value, ret);
     121           1 :     return ret;
     122             : }
     123             : 
     124             : sss_sifp_error
     125           1 : sss_sifp_find_attr_as_int32(sss_sifp_attr **attrs,
     126             :                             const char *name,
     127             :                             int32_t *_value)
     128             : {
     129             :     sss_sifp_error ret;
     130           1 :     GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_INT32, int32, *_value, ret);
     131           1 :     return ret;
     132             : }
     133             : 
     134             : sss_sifp_error
     135           8 : sss_sifp_find_attr_as_uint32(sss_sifp_attr **attrs,
     136             :                              const char *name,
     137             :                              uint32_t *_value)
     138             : {
     139             :     sss_sifp_error ret;
     140           8 :     GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_UINT32, uint32, *_value, ret);
     141           8 :     return ret;
     142             : }
     143             : 
     144             : sss_sifp_error
     145           1 : sss_sifp_find_attr_as_int64(sss_sifp_attr **attrs,
     146             :                             const char *name,
     147             :                             int64_t *_value)
     148             : {
     149             :     sss_sifp_error ret;
     150           1 :     GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_INT64, int64, *_value, ret);
     151           1 :     return ret;
     152             : }
     153             : 
     154             : sss_sifp_error
     155           1 : sss_sifp_find_attr_as_uint64(sss_sifp_attr **attrs,
     156             :                              const char *name,
     157             :                              uint64_t *_value)
     158             : {
     159             :     sss_sifp_error ret;
     160           1 :     GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_UINT64, uint64, *_value, ret);
     161           1 :     return ret;
     162             : }
     163             : 
     164             : sss_sifp_error
     165          12 : sss_sifp_find_attr_as_string(sss_sifp_attr **attrs,
     166             :                              const char *name,
     167             :                              const char **_value)
     168             : {
     169             :     sss_sifp_error ret;
     170          12 :     const char *value = NULL;
     171             : 
     172          12 :     GET_ATTR(attrs, name, SSS_SIFP_ATTR_TYPE_STRING, str, value, ret);
     173             : 
     174          12 :     if (ret == SSS_SIFP_ATTR_NULL) {
     175           0 :         *_value = NULL;
     176           0 :         return ret;
     177             :     }
     178             : 
     179          12 :     *_value = value;
     180          12 :     return ret;
     181             : }
     182             : 
     183             : sss_sifp_error
     184           1 : sss_sifp_find_attr_as_string_dict(sss_sifp_attr **attrs,
     185             :                                   const char *name,
     186             :                                   hash_table_t **_value)
     187             : {
     188           1 :     sss_sifp_attr *attr = sss_sifp_find_attr(attrs, name);
     189             : 
     190           1 :     if (attr == NULL) {
     191           0 :         return SSS_SIFP_ATTR_MISSING;
     192             :     }
     193             : 
     194           1 :     if (attr->type != SSS_SIFP_ATTR_TYPE_STRING_DICT) {
     195           0 :         return SSS_SIFP_INCORRECT_TYPE;
     196             :     }
     197             : 
     198           1 :     if (attr->data.str_dict == NULL) {
     199           0 :         *_value = NULL;
     200           0 :         return SSS_SIFP_ATTR_NULL;
     201             :     }
     202             : 
     203           1 :     *_value = attr->data.str_dict;
     204             : 
     205           1 :     return SSS_SIFP_OK;
     206             : }
     207             : 
     208             : /**
     209             :  * @brief Find attribute in list and return its values.
     210             :  *
     211             :  * @param[in] attrs Attributes
     212             :  * @param[in] name Name of the attribute to find
     213             :  *
     214             :  * @return Attribute values or NULL if it is not found.
     215             :  */
     216             : sss_sifp_error
     217           2 : sss_sifp_find_attr_as_bool_array(sss_sifp_attr **attrs,
     218             :                                  const char *name,
     219             :                                  unsigned int *_num_values,
     220             :                                  bool **_value)
     221             : {
     222             :     sss_sifp_error ret;
     223           2 :     GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_BOOL, boolean,
     224             :                    *_num_values, *_value, ret);
     225           2 :     return ret;
     226             : }
     227             : 
     228             : sss_sifp_error
     229           0 : sss_sifp_find_attr_as_int16_array(sss_sifp_attr **attrs,
     230             :                                   const char *name,
     231             :                                   unsigned int *_num_values,
     232             :                                   int16_t **_value)
     233             : {
     234             :     sss_sifp_error ret;
     235           0 :     GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_INT16, int16,
     236             :                    *_num_values, *_value, ret);
     237           0 :     return ret;
     238             : }
     239             : 
     240             : sss_sifp_error
     241           0 : sss_sifp_find_attr_as_uint16_array(sss_sifp_attr **attrs,
     242             :                                    const char *name,
     243             :                                    unsigned int *_num_values,
     244             :                                    uint16_t **_value)
     245             : {
     246             :     sss_sifp_error ret;
     247           0 :     GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_UINT16, uint16,
     248             :                    *_num_values, *_value, ret);
     249           0 :     return ret;
     250             : }
     251             : 
     252             : sss_sifp_error
     253           2 : sss_sifp_find_attr_as_int32_array(sss_sifp_attr **attrs,
     254             :                                   const char *name,
     255             :                                   unsigned int *_num_values,
     256             :                                   int32_t **_value)
     257             : {
     258             :     sss_sifp_error ret;
     259           2 :     GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_INT32, int32,
     260             :                    *_num_values, *_value, ret);
     261           2 :     return ret;
     262             : }
     263             : 
     264             : sss_sifp_error
     265           2 : sss_sifp_find_attr_as_uint32_array(sss_sifp_attr **attrs,
     266             :                                    const char *name,
     267             :                                    unsigned int *_num_values,
     268             :                                    uint32_t **_value)
     269             : {
     270             :     sss_sifp_error ret;
     271           2 :     GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_UINT32, uint32,
     272             :                    *_num_values, *_value, ret);
     273           2 :     return ret;
     274             : }
     275             : 
     276             : sss_sifp_error
     277           2 : sss_sifp_find_attr_as_int64_array(sss_sifp_attr **attrs,
     278             :                                   const char *name,
     279             :                                   unsigned int *_num_values,
     280             :                                   int64_t **_value)
     281             : {
     282             :     sss_sifp_error ret;
     283           2 :     GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_INT64, int64,
     284             :                    *_num_values, *_value, ret);
     285           2 :     return ret;
     286             : }
     287             : 
     288             : sss_sifp_error
     289           2 : sss_sifp_find_attr_as_uint64_array(sss_sifp_attr **attrs,
     290             :                                    const char *name,
     291             :                                    unsigned int *_num_values,
     292             :                                    uint64_t **_value)
     293             : {
     294             :     sss_sifp_error ret;
     295           2 :     GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_UINT64, uint64,
     296             :                    *_num_values, *_value, ret);
     297           2 :     return ret;
     298             : }
     299             : 
     300             : sss_sifp_error
     301           4 : sss_sifp_find_attr_as_string_array(sss_sifp_attr **attrs,
     302             :                                    const char *name,
     303             :                                    unsigned int *_num_values,
     304             :                                    const char * const **_value)
     305             : {
     306             :     sss_sifp_error ret;
     307             :     char **value;
     308             : 
     309           4 :     GET_ATTR_ARRAY(attrs, name, SSS_SIFP_ATTR_TYPE_STRING, str,
     310             :                    *_num_values, value, ret);
     311             : 
     312           4 :     if (ret == SSS_SIFP_OK || ret == SSS_SIFP_ATTR_NULL) {
     313           4 :         *_value = (const char * const *)value;
     314             :     }
     315             : 
     316           4 :     return ret;
     317             : }

Generated by: LCOV version 1.10