2 Unix SMB/CIFS implementation.
4 Classic file based services configuration
6 Copyright (C) Simo Sorce 2006
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "param/share.h"
26 struct sclassic_snum {
30 static NTSTATUS sclassic_init(TALLOC_CTX *mem_ctx, const struct share_ops *ops, struct share_context **ctx)
32 *ctx = talloc(mem_ctx, struct share_context);
34 DEBUG(0, ("ERROR: Out of memory!\n"));
35 return NT_STATUS_NO_MEMORY;
39 (*ctx)->priv_data = NULL;
44 static const char *sclassic_string_option(struct share_config *scfg, const char *opt_name, const char *defval)
46 struct sclassic_snum *s = talloc_get_type(scfg->opaque, struct sclassic_snum);
50 if (strchr(opt_name, ':')) {
51 parm = talloc_strdup(scfg, opt_name);
55 val = strchr(parm, ':');
59 ret = lp_parm_string(s->snum, parm, val);
67 if (strcmp(opt_name, SHARE_NAME) == 0) {
71 if (strcmp(opt_name, SHARE_PATH) == 0) {
72 return lp_pathname(s->snum);
75 if (strcmp(opt_name, SHARE_COMMENT) == 0) {
76 return lp_comment(s->snum);
79 if (strcmp(opt_name, SHARE_VOLUME) == 0) {
80 return volume_label(s->snum);
83 if (strcmp(opt_name, SHARE_TYPE) == 0) {
84 if (lp_print_ok(s->snum)) {
87 return lp_fstype(s->snum);
93 int sclassic_int_option(struct share_config *scfg, const char *opt_name, int defval)
95 struct sclassic_snum *s = talloc_get_type(scfg->opaque, struct sclassic_snum);
99 if (strchr(opt_name, ':')) {
100 parm = talloc_strdup(scfg, opt_name);
104 val = strchr(parm, ':');
108 ret = lp_parm_int(s->snum, parm, val, defval);
116 if (strcmp(opt_name, SHARE_CSC_POLICY) == 0) {
117 ret = lp_csc_policy(s->snum);
123 if (strcmp(opt_name, SHARE_MAX_CONNECTIONS) == 0) {
124 ret = lp_max_connections(s->snum);
133 BOOL sclassic_bool_option(struct share_config *scfg, const char *opt_name, BOOL defval)
135 struct sclassic_snum *s = talloc_get_type(scfg->opaque, struct sclassic_snum);
139 if (strchr(opt_name, ':')) {
140 parm = talloc_strdup(scfg, opt_name);
144 val = strchr(parm, ':');
148 ret = lp_parm_bool(s->snum, parm, val, defval);
153 if (strcmp(opt_name, SHARE_AVAILABLE) == 0) {
154 return lp_snum_ok(s->snum);
157 if (strcmp(opt_name, SHARE_BROWSEABLE) == 0) {
158 return lp_browseable(s->snum);
161 if (strcmp(opt_name, SHARE_READONLY) == 0) {
162 return lp_readonly(s->snum);
165 if (strcmp(opt_name, SHARE_MAP_SYSTEM) == 0) {
166 return lp_map_system(s->snum);
169 if (strcmp(opt_name, SHARE_MAP_HIDDEN) == 0) {
170 return lp_map_hidden(s->snum);
173 if (strcmp(opt_name, SHARE_MAP_ARCHIVE) == 0) {
174 return lp_map_archive(s->snum);
177 if (strcmp(opt_name, SHARE_STRICT_LOCKING) == 0) {
178 return lp_strict_locking(s->snum);
181 if (strcmp(opt_name, SHARE_STRICT_SYNC) == 0) {
182 return lp_strict_sync(s->snum);
185 if (strcmp(opt_name, SHARE_MSDFS_ROOT) == 0) {
186 return lp_msdfs_root(s->snum);
189 if (strcmp(opt_name, SHARE_CI_FILESYSTEM) == 0) {
190 return lp_ci_filesystem(s->snum);
196 const char **sclassic_string_list_option(TALLOC_CTX *mem_ctx, struct share_config *scfg, const char *opt_name)
198 struct sclassic_snum *s = talloc_get_type(scfg->opaque, struct sclassic_snum);
202 if (strchr(opt_name, ':')) {
203 parm = talloc_strdup(scfg, opt_name);
207 val = strchr(parm, ':');
211 ret = lp_parm_string_list(s->snum, parm, val, ",;");
216 if (strcmp(opt_name, SHARE_HOSTS_ALLOW) == 0) {
217 return lp_hostsallow(s->snum);
220 if (strcmp(opt_name, SHARE_HOSTS_DENY) == 0) {
221 return lp_hostsdeny(s->snum);
224 if (strcmp(opt_name, SHARE_NTVFS_HANDLER) == 0) {
225 return lp_ntvfs_handler(s->snum);
231 NTSTATUS sclassic_list_all(TALLOC_CTX *mem_ctx,
232 struct share_context *ctx,
240 num_services = lp_numservices();
242 n = talloc_array(mem_ctx, const char *, num_services);
244 DEBUG(0,("ERROR: Out of memory!\n"));
245 return NT_STATUS_NO_MEMORY;
248 for (i = 0; i < num_services; i++) {
249 n[i] = talloc_strdup(n, lp_servicename(i));
251 DEBUG(0,("ERROR: Out of memory!\n"));
253 return NT_STATUS_NO_MEMORY;
258 *count = num_services;
263 NTSTATUS sclassic_get_config(TALLOC_CTX *mem_ctx,
264 struct share_context *ctx,
266 struct share_config **scfg)
269 struct share_config *s;
270 struct sclassic_snum *scnum;
273 for (i = 0; i < lp_numservices(); i++) {
274 if (strcasecmp_m(name, lp_servicename(i)) == 0) {
281 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
284 s = talloc(mem_ctx, struct share_config);
286 DEBUG(0,("ERROR: Out of memory!\n"));
287 return NT_STATUS_NO_MEMORY;
290 s->name = talloc_strdup(s, lp_servicename(snum));
292 DEBUG(0,("ERROR: Out of memory!\n"));
294 return NT_STATUS_NO_MEMORY;
297 scnum = talloc(s, struct sclassic_snum);
299 DEBUG(0,("ERROR: Out of memory!\n"));
301 return NT_STATUS_NO_MEMORY;
305 s->opaque = (void *)scnum;
313 NTSTATUS share_classic_init(void)
315 struct share_ops ops;
317 ops.name = "classic";
318 ops.init = sclassic_init;
319 ops.string_option = sclassic_string_option;
320 ops.int_option = sclassic_int_option;
321 ops.bool_option = sclassic_bool_option;
322 ops.string_list_option = sclassic_string_list_option;
323 ops.list_all = sclassic_list_all;
324 ops.get_config = sclassic_get_config;
326 return share_register(&ops);