ctdb-common: Fix memory leak in run_proc
[samba.git] / lib / ldb-samba / samba_extensions.c
blob45b01e1b447acb3d4bb1e76f0bf3469bc3fffdd5
1 /*
2 ldb database library - samba extensions
4 Copyright (C) Andrew Tridgell 2010
6 ** NOTE! The following LGPL license applies to the ldb
7 ** library. This does NOT imply that all of Samba is released
8 ** under the LGPL
10 This library is free software; you can redistribute it and/or
11 modify it under the terms of the GNU Lesser General Public
12 License as published by the Free Software Foundation; either
13 version 3 of the License, or (at your option) any later version.
15 This library is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
20 You should have received a copy of the GNU Lesser General Public
21 License along with this library; if not, see <http://www.gnu.org/licenses/>.
25 #include "includes.h"
26 #include "ldb_module.h"
27 #include "lib/cmdline/popt_common.h"
28 #include "auth/gensec/gensec.h"
29 #include "auth/auth.h"
30 #include "param/param.h"
31 #include "dsdb/samdb/samdb.h"
32 #include "dsdb/common/util.h"
33 #include "ldb_wrap.h"
34 #include "popt.h"
39 work out the length of a popt array
41 static unsigned calculate_popt_array_length(struct poptOption *opts)
43 unsigned i;
44 struct poptOption zero_opt = { NULL };
45 for (i=0; memcmp(&zero_opt, &opts[i], sizeof(zero_opt)) != 0; i++) ;
46 return i;
49 static struct poptOption cmdline_extensions[] = {
50 POPT_COMMON_SAMBA
51 POPT_COMMON_CREDENTIALS
52 POPT_COMMON_CONNECTION
53 POPT_COMMON_VERSION
54 { NULL }
58 called to register additional command line options
60 static int extensions_hook(struct ldb_context *ldb, enum ldb_module_hook_type t)
62 switch (t) {
63 case LDB_MODULE_HOOK_CMDLINE_OPTIONS: {
64 unsigned len1, len2;
65 struct poptOption **popt_options = ldb_module_popt_options(ldb);
66 struct poptOption *new_array;
68 len1 = calculate_popt_array_length(*popt_options);
69 len2 = calculate_popt_array_length(cmdline_extensions);
70 new_array = talloc_array(NULL, struct poptOption, len1+len2+1);
71 if (NULL == new_array) {
72 return ldb_oom(ldb);
75 memcpy(new_array, *popt_options, len1*sizeof(struct poptOption));
76 memcpy(new_array+len1, cmdline_extensions, (1+len2)*sizeof(struct poptOption));
77 (*popt_options) = new_array;
78 return LDB_SUCCESS;
81 case LDB_MODULE_HOOK_CMDLINE_PRECONNECT: {
82 int r = ldb_register_samba_handlers(ldb);
83 if (r != LDB_SUCCESS) {
84 return ldb_operr(ldb);
86 gensec_init();
88 if (ldb_set_opaque(
89 ldb,
90 DSDB_SESSION_INFO,
91 system_session(cmdline_lp_ctx))) {
93 return ldb_operr(ldb);
95 if (ldb_set_opaque(ldb, "credentials",
96 popt_get_cmdline_credentials())) {
97 return ldb_operr(ldb);
99 if (ldb_set_opaque(ldb, "loadparm", cmdline_lp_ctx)) {
100 return ldb_operr(ldb);
103 ldb_set_utf8_fns(ldb, NULL, wrap_casefold);
104 break;
107 case LDB_MODULE_HOOK_CMDLINE_POSTCONNECT:
108 /* get the domain SID into the cache for SDDL processing */
109 samdb_domain_sid(ldb);
110 break;
113 return LDB_SUCCESS;
118 initialise the module
120 _PUBLIC_ int ldb_samba_extensions_init(const char *ldb_version)
122 ldb_register_hook(extensions_hook);
124 return LDB_SUCCESS;