~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to lib/smbconf/smbconf_util.c

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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)
 
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,
 
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,
 
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,
 
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,
 
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
}