summaryrefslogtreecommitdiffstats
path: root/source3/registry/reg_init_smbconf.c
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2008-01-21 00:40:10 +0100
committerMichael Adam <obnox@samba.org>2008-01-21 08:49:12 +0100
commit99dfd664881f92dd1972f872c7471c5665869b86 (patch)
treef4138117ca0dea4cd0b4f86eb2d3a83b57c24d6f /source3/registry/reg_init_smbconf.c
parent1b4dfc2e7d7841ee0dba95062d5369d37dd85700 (diff)
downloadsamba-99dfd664881f92dd1972f872c7471c5665869b86.tar.gz
samba-99dfd664881f92dd1972f872c7471c5665869b86.tar.xz
samba-99dfd664881f92dd1972f872c7471c5665869b86.zip
Rename lib/util_reg_smbconf.c to registry/reg_init_smbconf.c
This actually is a counterpart to reg_init_full, in that is does open and initialize the registry too, but only registeres the backends necessary to access the SMBCONF key. Michael (This used to be commit 01bda3ab359fb3868c1dc849044f613bf2bc563e)
Diffstat (limited to 'source3/registry/reg_init_smbconf.c')
-rw-r--r--source3/registry/reg_init_smbconf.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/source3/registry/reg_init_smbconf.c b/source3/registry/reg_init_smbconf.c
new file mode 100644
index 00000000000..6452b0b15bc
--- /dev/null
+++ b/source3/registry/reg_init_smbconf.c
@@ -0,0 +1,97 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * Registry helper routines
+ * Copyright (C) Michael Adam 2007
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "includes.h"
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_REGISTRY
+
+extern REGISTRY_OPS smbconf_reg_ops;
+
+/*
+ * create a fake token just with enough rights to
+ * locally access the registry:
+ *
+ * - builtin administrators sid
+ * - disk operators privilege
+ */
+NTSTATUS registry_create_admin_token(TALLOC_CTX *mem_ctx,
+ NT_USER_TOKEN **ptoken)
+{
+ NTSTATUS status;
+ NT_USER_TOKEN *token = NULL;
+
+ if (ptoken == NULL) {
+ return NT_STATUS_INVALID_PARAMETER;
+ }
+
+ token = TALLOC_ZERO_P(mem_ctx, NT_USER_TOKEN);
+ if (token == NULL) {
+ DEBUG(1, ("talloc failed\n"));
+ status = NT_STATUS_NO_MEMORY;
+ goto done;
+ }
+ token->privileges = se_disk_operators;
+ status = add_sid_to_array(token, &global_sid_Builtin_Administrators,
+ &token->user_sids, &token->num_sids);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(1, ("Error adding builtin administrators sid "
+ "to fake token.\n"));
+ goto done;
+ }
+
+ *ptoken = token;
+
+done:
+ return status;
+}
+
+/*
+ * init the smbconf portion of the registry.
+ * for use in places where not the whole registry is needed,
+ * e.g. utils/net_conf.c and loadparm.c
+ */
+bool registry_init_regdb(void)
+{
+ bool ret = false;
+ int saved_errno = 0;
+ static REGISTRY_HOOK smbconf_reg_hook = {KEY_SMBCONF, &smbconf_reg_ops};
+
+ DEBUG(10, ("registry_init_regdb called\n"));
+
+ if (!regdb_init()) {
+ saved_errno = errno;
+ DEBUG(1, ("Can't open the registry"));
+ if (saved_errno) {
+ DEBUGADD(1, (": %s", strerror(saved_errno)));
+ }
+ DEBUGADD(1, (".\n"));
+ goto done;
+ }
+ reghook_cache_init();
+ if (!reghook_cache_add(&smbconf_reg_hook)) {
+ DEBUG(1, ("Error adding smbconf reghooks to reghook cache.\n"));
+ goto done;
+ }
+
+ ret = true;
+
+done:
+ return ret;
+}