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 if (strcmp("NTFS", lp_fstype(s
->snum
)) == 0) {
90 return lp_fstype(s
->snum
);
96 int sclassic_int_option(struct share_config
*scfg
, const char *opt_name
, int defval
)
98 struct sclassic_snum
*s
= talloc_get_type(scfg
->opaque
, struct sclassic_snum
);
102 if (strchr(opt_name
, ':')) {
103 parm
= talloc_strdup(scfg
, opt_name
);
107 val
= strchr(parm
, ':');
111 ret
= lp_parm_int(s
->snum
, parm
, val
, defval
);
119 if (strcmp(opt_name
, SHARE_CSC_POLICY
) == 0) {
120 ret
= lp_csc_policy(s
->snum
);
126 if (strcmp(opt_name
, SHARE_MAX_CONNECTIONS
) == 0) {
127 ret
= lp_max_connections(s
->snum
);
136 BOOL
sclassic_bool_option(struct share_config
*scfg
, const char *opt_name
, BOOL defval
)
138 struct sclassic_snum
*s
= talloc_get_type(scfg
->opaque
, struct sclassic_snum
);
142 if (strchr(opt_name
, ':')) {
143 parm
= talloc_strdup(scfg
, opt_name
);
147 val
= strchr(parm
, ':');
151 ret
= lp_parm_bool(s
->snum
, parm
, val
, defval
);
156 if (strcmp(opt_name
, SHARE_AVAILABLE
) == 0) {
157 return lp_snum_ok(s
->snum
);
160 if (strcmp(opt_name
, SHARE_BROWSEABLE
) == 0) {
161 return lp_browseable(s
->snum
);
164 if (strcmp(opt_name
, SHARE_READONLY
) == 0) {
165 return lp_readonly(s
->snum
);
168 if (strcmp(opt_name
, SHARE_MAP_SYSTEM
) == 0) {
169 return lp_map_system(s
->snum
);
172 if (strcmp(opt_name
, SHARE_MAP_HIDDEN
) == 0) {
173 return lp_map_hidden(s
->snum
);
176 if (strcmp(opt_name
, SHARE_MAP_ARCHIVE
) == 0) {
177 return lp_map_archive(s
->snum
);
180 if (strcmp(opt_name
, SHARE_STRICT_LOCKING
) == 0) {
181 return lp_strict_locking(s
->snum
);
184 if (strcmp(opt_name
, SHARE_STRICT_SYNC
) == 0) {
185 return lp_strict_sync(s
->snum
);
188 if (strcmp(opt_name
, SHARE_MSDFS_ROOT
) == 0) {
189 return lp_msdfs_root(s
->snum
);
192 if (strcmp(opt_name
, SHARE_CI_FILESYSTEM
) == 0) {
193 return lp_ci_filesystem(s
->snum
);
199 const char **sclassic_string_list_option(TALLOC_CTX
*mem_ctx
, struct share_config
*scfg
, const char *opt_name
)
201 struct sclassic_snum
*s
= talloc_get_type(scfg
->opaque
, struct sclassic_snum
);
205 if (strchr(opt_name
, ':')) {
206 parm
= talloc_strdup(scfg
, opt_name
);
210 val
= strchr(parm
, ':');
214 ret
= lp_parm_string_list(s
->snum
, parm
, val
, ",;");
219 if (strcmp(opt_name
, SHARE_HOSTS_ALLOW
) == 0) {
220 return lp_hostsallow(s
->snum
);
223 if (strcmp(opt_name
, SHARE_HOSTS_DENY
) == 0) {
224 return lp_hostsdeny(s
->snum
);
227 if (strcmp(opt_name
, SHARE_NTVFS_HANDLER
) == 0) {
228 return lp_ntvfs_handler(s
->snum
);
234 NTSTATUS
sclassic_list_all(TALLOC_CTX
*mem_ctx
,
235 struct share_context
*ctx
,
243 num_services
= lp_numservices();
245 n
= talloc_array(mem_ctx
, const char *, num_services
);
247 DEBUG(0,("ERROR: Out of memory!\n"));
248 return NT_STATUS_NO_MEMORY
;
251 for (i
= 0; i
< num_services
; i
++) {
252 n
[i
] = talloc_strdup(n
, lp_servicename(i
));
254 DEBUG(0,("ERROR: Out of memory!\n"));
256 return NT_STATUS_NO_MEMORY
;
261 *count
= num_services
;
266 NTSTATUS
sclassic_get_config(TALLOC_CTX
*mem_ctx
,
267 struct share_context
*ctx
,
269 struct share_config
**scfg
)
272 struct share_config
*s
;
273 struct sclassic_snum
*scnum
;
276 for (i
= 0; i
< lp_numservices(); i
++) {
277 if (strcasecmp_m(name
, lp_servicename(i
)) == 0) {
284 return NT_STATUS_OBJECT_NAME_NOT_FOUND
;
287 s
= talloc(mem_ctx
, struct share_config
);
289 DEBUG(0,("ERROR: Out of memory!\n"));
290 return NT_STATUS_NO_MEMORY
;
293 s
->name
= talloc_strdup(s
, lp_servicename(snum
));
295 DEBUG(0,("ERROR: Out of memory!\n"));
297 return NT_STATUS_NO_MEMORY
;
300 scnum
= talloc(s
, struct sclassic_snum
);
302 DEBUG(0,("ERROR: Out of memory!\n"));
304 return NT_STATUS_NO_MEMORY
;
308 s
->opaque
= (void *)scnum
;
316 NTSTATUS
share_classic_init(void)
318 static struct share_ops ops
= {
320 .init
= sclassic_init
,
321 .string_option
= sclassic_string_option
,
322 .int_option
= sclassic_int_option
,
323 .bool_option
= sclassic_bool_option
,
324 .string_list_option
= sclassic_string_list_option
,
325 .list_all
= sclassic_list_all
,
326 .get_config
= sclassic_get_config
329 return share_register(&ops
);