Line data Source code
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 640 : static int smbconf_destroy_ctx(struct smbconf_ctx *ctx) 25 : { 26 640 : 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 1080 : sbcErr smbconf_init_internal(TALLOC_CTX *mem_ctx, struct smbconf_ctx **conf_ctx, 43 : const char *path, struct smbconf_ops *ops) 44 : { 45 1080 : sbcErr err = SBC_ERR_OK; 46 21 : struct smbconf_ctx *ctx; 47 : 48 1080 : if (conf_ctx == NULL) { 49 0 : return SBC_ERR_INVALID_PARAM; 50 : } 51 : 52 1080 : ctx = talloc_zero(mem_ctx, struct smbconf_ctx); 53 1080 : if (ctx == NULL) { 54 0 : return SBC_ERR_NOMEM; 55 : } 56 : 57 1080 : ctx->ops = ops; 58 : 59 1080 : err = ctx->ops->init(ctx, path); 60 1080 : if (!SBC_ERROR_IS_OK(err)) { 61 0 : goto fail; 62 : } 63 : 64 1080 : talloc_set_destructor(ctx, smbconf_destroy_ctx); 65 : 66 1080 : *conf_ctx = ctx; 67 1080 : return err; 68 : 69 0 : fail: 70 0 : talloc_free(ctx); 71 0 : return err; 72 : } 73 : 74 : 75 : /** 76 : * add a string to a talloced array of strings. 77 : */ 78 68545 : sbcErr smbconf_add_string_to_array(TALLOC_CTX *mem_ctx, 79 : char ***array, 80 : uint32_t count, 81 : const char *string) 82 : { 83 68545 : char **new_array = NULL; 84 : 85 68545 : if (array == NULL) { 86 0 : return SBC_ERR_INVALID_PARAM; 87 : } 88 : 89 68545 : new_array = talloc_realloc(mem_ctx, *array, char *, count + 1); 90 68545 : if (new_array == NULL) { 91 0 : return SBC_ERR_NOMEM; 92 : } 93 : 94 68545 : if (string == NULL) { 95 0 : new_array[count] = NULL; 96 : } else { 97 68545 : new_array[count] = talloc_strdup(new_array, string); 98 68545 : if (new_array[count] == NULL) { 99 0 : talloc_free(new_array); 100 0 : return SBC_ERR_NOMEM; 101 : } 102 : } 103 : 104 68545 : *array = new_array; 105 : 106 68545 : return SBC_ERR_OK; 107 : } 108 : 109 2855 : bool smbconf_find_in_array(const char *string, char **list, 110 : uint32_t num_entries, uint32_t *entry) 111 : { 112 53 : uint32_t i; 113 : 114 2855 : if (list == NULL) { 115 24 : return false; 116 : } 117 : 118 150311 : for (i = 0; i < num_entries; i++) { 119 296280 : if (((string == NULL) && (list[i] == NULL)) || 120 148140 : strequal(string, list[i])) 121 : { 122 652 : if (entry != NULL) { 123 643 : *entry = i; 124 : } 125 652 : return true; 126 : } 127 : } 128 : 129 2136 : return false; 130 : } 131 : 132 0 : bool smbconf_reverse_find_in_array(const char *string, char **list, 133 : uint32_t num_entries, uint32_t *entry) 134 : { 135 0 : int32_t i; 136 : 137 0 : if ((string == NULL) || (list == NULL) || (num_entries == 0)) { 138 0 : return false; 139 : } 140 : 141 0 : for (i = num_entries - 1; i >= 0; i--) { 142 0 : if (strequal(string, list[i])) { 143 0 : if (entry != NULL) { 144 0 : *entry = i; 145 : } 146 0 : return true; 147 : } 148 : } 149 : 150 0 : return false; 151 : }