root/lib/smbconf/smbconf_util.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. smbconf_destroy_ctx
  2. smbconf_init_internal
  3. smbconf_add_string_to_array
  4. smbconf_find_in_array
  5. smbconf_reverse_find_in_array

   1 /*
   2  *  Unix SMB/CIFS implementation.
   3  *  libsmbconf - Samba configuration library, utility functions
   4  *  Copyright (C) Michael Adam 2008
   5  *
   6  *  This program is free software; you can redistribute it and/or modify
   7  *  it under the terms of the GNU General Public License as published by
   8  *  the Free Software Foundation; either version 3 of the License, or
   9  *  (at your option) any later version.
  10  *
  11  *  This program is distributed in the hope that it will be useful,
  12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14  *  GNU General Public License for more details.
  15  *
  16  *  You should have received a copy of the GNU General Public License
  17  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
  18  */
  19 
  20 #include "includes.h"
  21 #include "smbconf_private.h"
  22 
  23 
  24 static int smbconf_destroy_ctx(struct smbconf_ctx *ctx)
     /* [<][>][^][v][top][bottom][index][help] */
  25 {
  26         return ctx->ops->shutdown(ctx);
  27 }
  28 
  29 /**
  30  * Initialize the configuration.
  31  *
  32  * This should be the first function in a sequence of calls to smbconf
  33  * functions:
  34  *
  35  * Upon success, this creates and returns the conf context
  36  * that should be passed around in subsequent calls to the other
  37  * smbconf functions.
  38  *
  39  * After the work with the configuration is completed, smbconf_shutdown()
  40  * should be called.
  41  */
  42 WERROR smbconf_init_internal(TALLOC_CTX *mem_ctx, struct smbconf_ctx **conf_ctx,
     /* [<][>][^][v][top][bottom][index][help] */
  43                              const char *path, struct smbconf_ops *ops)
  44 {
  45         WERROR werr = WERR_OK;
  46         struct smbconf_ctx *ctx;
  47 
  48         if (conf_ctx == NULL) {
  49                 return WERR_INVALID_PARAM;
  50         }
  51 
  52         ctx = talloc_zero(mem_ctx, struct smbconf_ctx);
  53         if (ctx == NULL) {
  54                 return WERR_NOMEM;
  55         }
  56 
  57         ctx->ops = ops;
  58 
  59         werr = ctx->ops->init(ctx, path);
  60         if (!W_ERROR_IS_OK(werr)) {
  61                 goto fail;
  62         }
  63 
  64         talloc_set_destructor(ctx, smbconf_destroy_ctx);
  65 
  66         *conf_ctx = ctx;
  67         return werr;
  68 
  69 fail:
  70         talloc_free(ctx);
  71         return werr;
  72 }
  73 
  74 
  75 /**
  76  * add a string to a talloced array of strings.
  77  */
  78 WERROR smbconf_add_string_to_array(TALLOC_CTX *mem_ctx,
     /* [<][>][^][v][top][bottom][index][help] */
  79                                    char ***array,
  80                                    uint32_t count,
  81                                    const char *string)
  82 {
  83         char **new_array = NULL;
  84 
  85         if (array == NULL) {
  86                 return WERR_INVALID_PARAM;
  87         }
  88 
  89         new_array = talloc_realloc(mem_ctx, *array, char *, count + 1);
  90         if (new_array == NULL) {
  91                 return WERR_NOMEM;
  92         }
  93 
  94         if (string == NULL) {
  95                 new_array[count] = NULL;
  96         } else {
  97                 new_array[count] = talloc_strdup(new_array, string);
  98                 if (new_array[count] == NULL) {
  99                         talloc_free(new_array);
 100                         return WERR_NOMEM;
 101                 }
 102         }
 103 
 104         *array = new_array;
 105 
 106         return WERR_OK;
 107 }
 108 
 109 bool smbconf_find_in_array(const char *string, char **list,
     /* [<][>][^][v][top][bottom][index][help] */
 110                            uint32_t num_entries, uint32_t *entry)
 111 {
 112         uint32_t i;
 113 
 114         if (list == NULL) {
 115                 return false;
 116         }
 117 
 118         for (i = 0; i < num_entries; i++) {
 119                 if (((string == NULL) && (list[i] == NULL)) ||
 120                     strequal(string, list[i]))
 121                 {
 122                         if (entry != NULL) {
 123                                 *entry = i;
 124                         }
 125                         return true;
 126                 }
 127         }
 128 
 129         return false;
 130 }
 131 
 132 bool smbconf_reverse_find_in_array(const char *string, char **list,
     /* [<][>][^][v][top][bottom][index][help] */
 133                                    uint32_t num_entries, uint32_t *entry)
 134 {
 135         int32_t i;
 136 
 137         if ((string == NULL) || (list == NULL) || (num_entries == 0)) {
 138                 return false;
 139         }
 140 
 141         for (i = num_entries - 1; i >= 0; i--) {
 142                 if (strequal(string, list[i])) {
 143                         if (entry != NULL) {
 144                                 *entry = i;
 145                         }
 146                         return true;
 147                 }
 148         }
 149 
 150         return false;
 151 }

/* [<][>][^][v][top][bottom][index][help] */