Add a registry backend perflib that replaces the former dynamic overlay.
authorMichael Adam <obnox@samba.org>
Sun, 20 Jan 2008 02:39:27 +0000 (03:39 +0100)
committerMichael Adam <obnox@samba.org>
Sun, 20 Jan 2008 02:47:37 +0000 (03:47 +0100)
Michael
(This used to be commit c3fba415951329ee90c7250b4e8d539f91b227f6)

source3/Makefile.in
source3/include/reg_objects.h
source3/registry/reg_backend_perflib.c [new file with mode: 0644]
source3/registry/reg_db.c
source3/registry/reg_dynamic.c
source3/registry/reg_frontend.c

index fa40d9294834ba6a38f1d84af7d4b0dfde3d8cff..1dcf75847f34f678bf1b1480a5693e339599f569 100644 (file)
@@ -423,6 +423,7 @@ REGISTRY_OBJ = registry/reg_frontend.o registry/reg_cachehook.o registry/reg_pri
               registry/reg_backend_tcpip_params.o \
               registry/reg_backend_hkpt_params.o \
               registry/reg_backend_current_version.o \
+              registry/reg_backend_perflib.o \
               $(UTIL_REG_API_OBJ) $(UTIL_REG_SMBCONF_OBJ)
 
 RPC_LSA_OBJ = rpc_server/srv_lsa.o rpc_server/srv_lsa_nt.o librpc/gen_ndr/srv_lsa.o
index 24db16261d8851f8affa4494458d433ce517303e..3df701f61cced8fc79fe60fe062b1a45f721108c 100644 (file)
@@ -103,6 +103,8 @@ typedef struct {
 #define KEY_PRINTING_2K                "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers"
 #define KEY_PRINTING_PORTS     "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Ports"
 #define KEY_CURRENT_VERSION    "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"
+#define KEY_PERFLIB            "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib"
+#define KEY_PERFLIB_009                "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib\\009"
 #define KEY_SMBCONF            "HKLM\\SOFTWARE\\Samba\\smbconf"
 #define KEY_TREE_ROOT          ""
 
diff --git a/source3/registry/reg_backend_perflib.c b/source3/registry/reg_backend_perflib.c
new file mode 100644 (file)
index 0000000..999bca2
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ *  Unix SMB/CIFS implementation.
+ *  Virtual Windows Registry Layer
+ *  Copyright (C) Gerald Carter     2002-2005
+ *  Copyright (C) Michael Adam      2008
+ *
+ *  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/>.
+ */
+
+/*
+ * perflib registry backend.
+ *
+ * This is a virtual overlay, dynamically presenting perflib values.
+ */
+
+#include "includes.h"
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_REGISTRY
+
+extern REGISTRY_OPS regdb_ops;
+
+#define KEY_PERFLIB_NORM       "HKLM/SOFTWARE/MICROSOFT/WINDOWS NT/CURRENTVERSION/PERFLIB"
+#define KEY_PERFLIB_009_NORM   "HKLM/SOFTWARE/MICROSOFT/WINDOWS NT/CURRENTVERSION/PERFLIB/009"
+
+static int perflib_params( REGVAL_CTR *regvals )
+{
+       int base_index = -1;
+       int last_counter = -1;
+       int last_help = -1;
+       int version = 0x00010001;
+       
+       base_index = reg_perfcount_get_base_index();
+       regval_ctr_addvalue(regvals, "Base Index", REG_DWORD, (char *)&base_index, sizeof(base_index));
+       last_counter = reg_perfcount_get_last_counter(base_index);
+       regval_ctr_addvalue(regvals, "Last Counter", REG_DWORD, (char *)&last_counter, sizeof(last_counter));
+       last_help = reg_perfcount_get_last_help(last_counter);
+       regval_ctr_addvalue(regvals, "Last Help", REG_DWORD, (char *)&last_help, sizeof(last_help));
+       regval_ctr_addvalue(regvals, "Version", REG_DWORD, (char *)&version, sizeof(version));
+
+       return regval_ctr_numvals( regvals );
+}
+
+static int perflib_009_params( REGVAL_CTR *regvals )
+{
+       int base_index;
+       int buffer_size;
+       char *buffer = NULL;
+
+       base_index = reg_perfcount_get_base_index();
+       buffer_size = reg_perfcount_get_counter_names(base_index, &buffer);
+       regval_ctr_addvalue(regvals, "Counter", REG_MULTI_SZ, buffer, buffer_size);
+       if(buffer_size > 0)
+               SAFE_FREE(buffer);
+       buffer_size = reg_perfcount_get_counter_help(base_index, &buffer);
+       regval_ctr_addvalue(regvals, "Help", REG_MULTI_SZ, buffer, buffer_size);
+       if(buffer_size > 0)
+               SAFE_FREE(buffer);
+       
+       return regval_ctr_numvals( regvals );
+}
+
+static int perflib_fetch_values(const char *key, REGVAL_CTR *regvals)
+{
+       char *path = NULL;
+       TALLOC_CTX *ctx = talloc_tos();
+
+       path = talloc_strdup(ctx, key);
+       if (path == NULL) {
+               return -1;
+       }
+       path = normalize_reg_path(ctx, path);
+       if (path == NULL) {
+               return -1;
+       }
+
+       if (strncmp(path, KEY_PERFLIB_NORM, strlen(path)) == 0) {
+               return perflib_params(regvals);
+       } else if (strncmp(path, KEY_PERFLIB_009_NORM, strlen(path)) == 0) {
+               return perflib_009_params(regvals);
+       } else {
+               return 0;
+       }
+}
+
+static int perflib_fetch_subkeys(const char *key,
+                                        REGSUBKEY_CTR *subkey_ctr)
+{
+       return regdb_ops.fetch_subkeys(key, subkey_ctr);
+}
+
+REGISTRY_OPS perflib_reg_ops = {
+       .fetch_values = perflib_fetch_values,
+       .fetch_subkeys = perflib_fetch_subkeys,
+};
index fad6c8acd1ce472baf89ad20a258b312244eed0d..e162fb587f573f15b26d785c6f3a1bc82694c56e 100644 (file)
@@ -44,8 +44,8 @@ static const char *builtin_registry_paths[] = {
        KEY_SHARES,
        KEY_EVENTLOG,
        KEY_SMBCONF,
-       "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib",
-       "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib\\009",
+       KEY_PERFLIB,
+       KEY_PERFLIB_009,
        "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Print\\Monitors",
        KEY_PROD_OPTIONS,
        "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\DefaultUserConfiguration",
index ca87cc60f503079ef7d15ba178bb3ebe5a9786c3..97cb46261569d1461889c623792eb391c3e385d3 100644 (file)
@@ -29,57 +29,12 @@ struct reg_dyn_values {
        int (*fetch_values) ( REGVAL_CTR *val );
 };
 
-/***********************************************************************
-***********************************************************************/
-
-static int perflib_params( REGVAL_CTR *regvals )
-{
-       int base_index = -1;
-       int last_counter = -1;
-       int last_help = -1;
-       int version = 0x00010001;
-       
-       base_index = reg_perfcount_get_base_index();
-       regval_ctr_addvalue(regvals, "Base Index", REG_DWORD, (char *)&base_index, sizeof(base_index));
-       last_counter = reg_perfcount_get_last_counter(base_index);
-       regval_ctr_addvalue(regvals, "Last Counter", REG_DWORD, (char *)&last_counter, sizeof(last_counter));
-       last_help = reg_perfcount_get_last_help(last_counter);
-       regval_ctr_addvalue(regvals, "Last Help", REG_DWORD, (char *)&last_help, sizeof(last_help));
-       regval_ctr_addvalue(regvals, "Version", REG_DWORD, (char *)&version, sizeof(version));
-
-       return regval_ctr_numvals( regvals );
-}
-
-/***********************************************************************
-***********************************************************************/
-
-static int perflib_009_params( REGVAL_CTR *regvals )
-{
-       int base_index;
-       int buffer_size;
-       char *buffer = NULL;
-
-       base_index = reg_perfcount_get_base_index();
-       buffer_size = reg_perfcount_get_counter_names(base_index, &buffer);
-       regval_ctr_addvalue(regvals, "Counter", REG_MULTI_SZ, buffer, buffer_size);
-       if(buffer_size > 0)
-               SAFE_FREE(buffer);
-       buffer_size = reg_perfcount_get_counter_help(base_index, &buffer);
-       regval_ctr_addvalue(regvals, "Help", REG_MULTI_SZ, buffer, buffer_size);
-       if(buffer_size > 0)
-               SAFE_FREE(buffer);
-       
-       return regval_ctr_numvals( regvals );
-}
-
 /***********************************************************************
  Structure holding the registry paths and pointers to the value 
  enumeration functions
 ***********************************************************************/
 
 static struct reg_dyn_values dynamic_values[] = {
-       { "HKLM/SOFTWARE/MICROSOFT/WINDOWS NT/CURRENTVERSION/PERFLIB",  &perflib_params   }, 
-       { "HKLM/SOFTWARE/MICROSOFT/WINDOWS NT/CURRENTVERSION/PERFLIB/009", &perflib_009_params }, 
        { NULL, NULL }
 };
 
index d4890509042996865b8e6efa08bfbe17bb5c6aa6..9a35eb2263c99cfe23b16f512e5240e6925f98a6 100644 (file)
@@ -33,6 +33,7 @@ extern REGISTRY_OPS prod_options_reg_ops;
 extern REGISTRY_OPS tcpip_params_reg_ops;
 extern REGISTRY_OPS hkpt_params_reg_ops;
 extern REGISTRY_OPS current_version_reg_ops;
+extern REGISTRY_OPS perflib_reg_ops;
 extern REGISTRY_OPS regdb_ops;         /* these are the default */
 
 /* array of REGISTRY_HOOK's which are read into a tree for easy access */
@@ -50,6 +51,7 @@ REGISTRY_HOOK reg_hooks[] = {
   { KEY_TCPIP_PARAMS,          &tcpip_params_reg_ops },
   { KEY_HKPT,                  &hkpt_params_reg_ops },
   { KEY_CURRENT_VERSION,       &current_version_reg_ops },
+  { KEY_PERFLIB,               &perflib_reg_ops },
 #endif
   { NULL, NULL }
 };