2 Unix SMB/CIFS implementation.
4 Modular shares configuration system
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 3 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, see <http://www.gnu.org/licenses/>.
23 #include "param/share.h"
24 #include "param/param.h"
25 #include "lib/util/samba_modules.h"
27 char *share_string_option(TALLOC_CTX
*mem_ctx
, struct share_config
*scfg
, const char *opt_name
, const char *defval
)
29 return scfg
->ctx
->ops
->string_option(mem_ctx
, scfg
, opt_name
, defval
);
32 int share_int_option(struct share_config
*scfg
, const char *opt_name
, int defval
)
34 return scfg
->ctx
->ops
->int_option(scfg
, opt_name
, defval
);
37 bool share_bool_option(struct share_config
*scfg
, const char *opt_name
, bool defval
)
39 return scfg
->ctx
->ops
->bool_option(scfg
, opt_name
, defval
);
42 const char **share_string_list_option(TALLOC_CTX
*mem_ctx
, struct share_config
*scfg
, const char *opt_name
)
44 return scfg
->ctx
->ops
->string_list_option(mem_ctx
, scfg
, opt_name
);
47 NTSTATUS
share_list_all(TALLOC_CTX
*mem_ctx
, struct share_context
*sctx
, int *count
, const char ***names
)
49 return sctx
->ops
->list_all(mem_ctx
, sctx
, count
, names
);
52 NTSTATUS
share_get_config(TALLOC_CTX
*mem_ctx
, struct share_context
*sctx
, const char *name
, struct share_config
**scfg
)
54 return sctx
->ops
->get_config(mem_ctx
, sctx
, name
, scfg
);
57 NTSTATUS
share_create(struct share_context
*sctx
, const char *name
, struct share_info
*info
, int count
)
59 if (sctx
->ops
->create
) {
60 return sctx
->ops
->create(sctx
, name
, info
, count
);
62 return NT_STATUS_NOT_IMPLEMENTED
;
65 NTSTATUS
share_set(struct share_context
*sctx
, const char *name
, struct share_info
*info
, int count
)
68 return sctx
->ops
->set(sctx
, name
, info
, count
);
70 return NT_STATUS_NOT_IMPLEMENTED
;
73 NTSTATUS
share_remove(struct share_context
*sctx
, const char *name
)
75 if (sctx
->ops
->remove
) {
76 return sctx
->ops
->remove(sctx
, name
);
78 return NT_STATUS_NOT_IMPLEMENTED
;
81 /* List of currently available share backends */
82 static struct share_ops
**backends
= NULL
;
84 static const struct share_ops
*share_backend_by_name(const char *name
)
88 for (i
= 0; backends
&& backends
[i
]; i
++) {
89 if (strcmp(backends
[i
]->name
, name
) == 0) {
98 Register the share backend
100 NTSTATUS
share_register(const struct share_ops
*ops
)
104 if (share_backend_by_name(ops
->name
) != NULL
) {
105 DEBUG(0,("SHARE backend [%s] already registered\n", ops
->name
));
106 return NT_STATUS_OBJECT_NAME_COLLISION
;
110 while (backends
&& backends
[i
]) {
114 backends
= realloc_p(backends
, struct share_ops
*, i
+ 2);
116 smb_panic("out of memory in share_register");
119 backends
[i
] = (struct share_ops
*)smb_xmemdup(ops
, sizeof(*ops
));
120 backends
[i
]->name
= smb_xstrdup(ops
->name
);
122 backends
[i
+ 1] = NULL
;
124 DEBUG(3, ("SHARE backend [%s] registered.\n", ops
->name
));
129 NTSTATUS
share_get_context_by_name(TALLOC_CTX
*mem_ctx
, const char *backend_name
,
130 struct tevent_context
*event_ctx
,
131 struct loadparm_context
*lp_ctx
,
132 struct share_context
**ctx
)
134 const struct share_ops
*ops
;
136 ops
= share_backend_by_name(backend_name
);
138 DEBUG(0, ("share_init_connection: share backend [%s] not found!\n", backend_name
));
139 return NT_STATUS_INTERNAL_ERROR
;
142 return ops
->init(mem_ctx
, ops
, event_ctx
, lp_ctx
, ctx
);
146 initialise the SHARE subsystem
148 NTSTATUS
share_init(void)
150 #define _MODULE_PROTO(init) extern NTSTATUS init(void);
151 STATIC_share_MODULES_PROTO
;
152 init_module_fn static_init
[] = { STATIC_share_MODULES
};
154 run_init_functions(static_init
);