r24667: Finally merge the registry improvements that Wilco Baan Hofman and I have
[metze/samba/wip.git] / source4 / lib / registry / registry.h
index 09d61c6b4f978e2d7ba4cfb9a7f01ab3ad31f87e..acfe056616448fa085de7b4510cfb056d0ed0d8a 100644 (file)
@@ -2,7 +2,7 @@
    Unix SMB/CIFS implementation.
    Registry interface
    Copyright (C) Gerald Carter                        2002.
-   Copyright (C) Jelmer Vernooij                                         2003-2004.
+   Copyright (C) Jelmer Vernooij                                         2003-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
 #ifndef _REGISTRY_H /* _REGISTRY_H */
 #define _REGISTRY_H 
 
+struct registry_context;
+
 #include "core.h"
 #include "talloc/talloc.h"
 #include "librpc/gen_ndr/security.h"
+#include "lib/registry/hive.h"
 
 /* Handles for the predefined keys */
 #define HKEY_CLASSES_ROOT               0x80000000
@@ -36,6 +39,9 @@
 #define HKEY_PERFORMANCE_TEXT   0x80000050
 #define HKEY_PERFORMANCE_NLSTEXT 0x80000060
 
+#define HKEY_FIRST             HKEY_CLASSES_ROOT
+#define HKEY_LAST              HKEY_PERFORMANCE_NLSTEXT
+
 struct reg_predefined_key {
        uint32_t handle;
        const char *name;
@@ -52,17 +58,16 @@ extern const struct reg_predefined_key reg_predefined_keys[];
 
 #define REGISTRY_INTERFACE_VERSION 1
 
+struct reg_key_operations;
+
 /* structure to store the registry handles */
 struct registry_key 
 {
-  const char *name;       
-  const char *path;    
-  const char *class_name; 
-  NTTIME last_mod; 
-  struct registry_hive *hive;
-  void *backend_data;
+       struct registry_context *context;
 };
 
+#include "lib/registry/patchfile.h"
+
 struct registry_value 
 {
   const char *name;
@@ -74,109 +79,87 @@ struct registry_value
 typedef void (*reg_key_notification_function) (void);
 typedef void (*reg_value_notification_function) (void);
 
-/* 
- * Container for function pointers to enumeration routines
- * for virtual registry view 
- *
- * Backends can provide :
- *  - just one hive (example: nt4, w95)
- *  - several hives (example: rpc).
- * 
- * Backends should always do case-insensitive compares 
- * (everything is case-insensitive but case-preserving, 
- * just like the FS)
- *
- * There is no save function as all operations are expected to 
- * be atomic.
- */ 
-
-struct hive_operations {
-       const char *name;
-
-       /* Implement this one */
-       WERROR (*open_hive) (struct registry_hive *, struct registry_key **);
-
-       /* Or this one */
-       WERROR (*open_key) (TALLOC_CTX *, const struct registry_key *, const char *name, struct registry_key **);
-
-       WERROR (*num_subkeys) (const struct registry_key *, uint32_t *count);
-       WERROR (*num_values) (const struct registry_key *, uint32_t *count);
-       WERROR (*get_subkey_by_index) (TALLOC_CTX *, const struct registry_key *, int idx, struct registry_key **);
-
-       /* Can not contain more than one level */
-       WERROR (*get_subkey_by_name) (TALLOC_CTX *, const struct registry_key *, const char *name, struct registry_key **);
-       WERROR (*get_value_by_index) (TALLOC_CTX *, const struct registry_key *, int idx, struct registry_value **);
-
-       /* Can not contain more than one level */
-       WERROR (*get_value_by_name) (TALLOC_CTX *, const struct registry_key *, const char *name, struct registry_value **);
-
-       /* Security control */
-       WERROR (*key_get_sec_desc) (TALLOC_CTX *, const struct registry_key *, struct security_descriptor **);
-       WERROR (*key_set_sec_desc) (const struct registry_key *, const struct security_descriptor *);
-
-       /* Notification */
-       WERROR (*request_key_change_notify) (const struct registry_key *, reg_key_notification_function);
-       WERROR (*request_value_change_notify) (const struct registry_value *, reg_value_notification_function);
-
-       /* Key management */
-       WERROR (*add_key)(TALLOC_CTX *, const struct registry_key *, const char *name, uint32_t access_mask, struct security_descriptor *, struct registry_key **);
-       WERROR (*del_key)(const struct registry_key *, const char *name);
-       WERROR (*flush_key) (const struct registry_key *);
-
-       /* Value management */
-       WERROR (*set_value)(const struct registry_key *, const char *name, uint32_t type, const DATA_BLOB data); 
-       WERROR (*del_value)(const struct registry_key *, const char *valname);
-};
-
 struct cli_credentials;
+struct registry_context;
 
-struct registry_hive
-{
-       const struct hive_operations *functions;
-       struct registry_key *root;
-       struct auth_session_info *session_info;
-       struct cli_credentials *credentials;
-       void *backend_data;
-       const char *location;
-};
-
-/* Handle to a full registry
- * contains zero or more hives */
-struct registry_context {
-    void *backend_data;
-       struct cli_credentials *credentials;
-       struct auth_session_info *session_info;
-       WERROR (*get_predefined_key) (struct registry_context *, uint32_t hkey, struct registry_key **);
-};
-
-struct reg_init_function_entry {
-       const struct hive_operations *hive_functions;
-       struct reg_init_function_entry *prev, *next;
-};
-
-/* Representing differences between registry files */
-
-struct reg_diff_value
-{
+struct registry_operations {
        const char *name;
-       enum { REG_DIFF_DEL_VAL, REG_DIFF_SET_VAL } changetype;
-       uint32_t type;
-       DATA_BLOB data;
-};
 
-struct reg_diff_key
-{
-       const char *name;
-       enum { REG_DIFF_CHANGE_KEY, REG_DIFF_DEL_KEY } changetype;
-       uint32_t numvalues;
-       struct reg_diff_value *values;
-};
-
-struct reg_diff
-{
-       const char *format;
-       uint32_t numkeys;
-       struct reg_diff_key *keys;
+       WERROR (*get_key_info) (TALLOC_CTX *mem_ctx,
+                                                       const struct registry_key *key,
+                                                       const char **classname,
+                                                       uint32_t *numsubkeys,
+                                                       uint32_t *numvalues,
+                                                       NTTIME *last_change_time);
+
+       WERROR (*flush_key) (struct registry_key *key);
+
+       WERROR (*get_predefined_key) (const struct registry_context *ctx, 
+                                                         uint32_t key_id,
+                                                         struct registry_key **key);
+
+       WERROR (*open_key) (TALLOC_CTX *mem_ctx,
+                                               struct registry_key *parent,
+                                               const char *path,
+                                               struct registry_key **key);
+
+       WERROR (*create_key) (TALLOC_CTX *mem_ctx, 
+                                                 struct registry_key *parent,
+                                                 const char *name,
+                                                 const char *key_class,
+                                                 struct security_descriptor *security,
+                                                 struct registry_key **key);
+
+       WERROR (*delete_key) (struct registry_key *key, const char *name);
+
+       WERROR (*delete_value) (struct registry_key *key, const char *name);
+
+       WERROR (*enum_key) (TALLOC_CTX *mem_ctx,
+                                               const struct registry_key *key, uint32_t idx,
+                                               const char **name,
+                                               const char **keyclass,
+                                               NTTIME *last_changed_time);
+
+       WERROR (*enum_value) (TALLOC_CTX *mem_ctx,
+                                                 const struct registry_key *key, uint32_t idx,
+                                                 const char **name,
+                                                 uint32_t *type,
+                                                 DATA_BLOB *data);
+
+       WERROR (*get_security) (TALLOC_CTX *mem_ctx,
+                                                       const struct registry_key *key, 
+                                                       struct security_descriptor **security);
+
+       WERROR (*set_security) (struct registry_key *key,
+                                                       const struct security_descriptor *security);
+
+       WERROR (*load_key) (struct registry_key *key,
+                                               const char *key_name,
+                                               const char *path);
+
+       WERROR (*unload_key) (struct registry_key *key, const char *name);
+
+       WERROR (*notify_value_change) (struct registry_key *key,
+                                                                       reg_value_notification_function fn);
+
+       WERROR (*get_value) (TALLOC_CTX *mem_ctx,
+                                                const struct registry_key *key,
+                                                const char *name,
+                                                uint32_t *type,
+                                                DATA_BLOB *data);
+
+       WERROR (*set_value) (struct registry_key *key,
+                                                const char *name,
+                                                uint32_t type,
+                                                const DATA_BLOB data);
+}; 
+
+/**
+ * Handle to a full registry
+ * contains zero or more hives 
+ */
+struct registry_context {
+       const struct registry_operations *ops;
 };
 
 struct auth_session_info;
@@ -186,60 +169,110 @@ struct event_context;
 #define _PUBLIC_
 #endif
 
+/**
+ * Open the locally defined registry.
+ */
 _PUBLIC_ WERROR reg_open_local (TALLOC_CTX *mem_ctx, 
                                struct registry_context **ctx, 
                                struct auth_session_info *session_info, 
                                struct cli_credentials *credentials);
 
+_PUBLIC_ WERROR reg_open_samba (TALLOC_CTX *mem_ctx,
+                                                               struct registry_context **ctx,
+                                                               struct auth_session_info *session_info,
+                                                               struct cli_credentials *credentials);
+
+/**
+ * Open the registry on a remote machine.
+ */
 _PUBLIC_ WERROR reg_open_remote(struct registry_context **ctx, 
                                                                struct auth_session_info *session_info, 
                                                                struct cli_credentials *credentials, 
                                                                const char *location, struct event_context *ev);
 
-_PUBLIC_ NTSTATUS registry_register(const void *_hive_ops);
-_PUBLIC_ NTSTATUS registry_init(void);
-_PUBLIC_ BOOL reg_has_backend(const char *backend);
-_PUBLIC_ int reg_list_predefs(TALLOC_CTX *mem_ctx, char ***predefs, uint32_t **hkeys);
+_PUBLIC_ WERROR reg_open_wine(struct registry_context **ctx, const char *path);
+
 _PUBLIC_ const char *reg_get_predef_name(uint32_t hkey);
-_PUBLIC_ WERROR reg_get_predefined_key_by_name(struct registry_context *ctx, const char *name, struct registry_key **key);
-_PUBLIC_ WERROR reg_get_predefined_key(struct registry_context *ctx, uint32_t hkey, struct registry_key **key);
-_PUBLIC_ WERROR reg_open_hive(TALLOC_CTX *parent_ctx, const char *backend, const char *location, struct auth_session_info *session_info, struct cli_credentials *credentials, struct registry_key **root);
-_PUBLIC_ WERROR reg_open_key(TALLOC_CTX *mem_ctx, struct registry_key *parent, const char *name, struct registry_key **result);
-_PUBLIC_ WERROR reg_key_get_value_by_index(TALLOC_CTX *mem_ctx, const struct registry_key *key, int idx, struct registry_value **val);
-_PUBLIC_ WERROR reg_key_num_subkeys(const struct registry_key *key, uint32_t *count);
-_PUBLIC_ WERROR reg_key_num_values(const struct registry_key *key, uint32_t *count);
-_PUBLIC_ WERROR reg_key_get_subkey_by_index(TALLOC_CTX *mem_ctx, const struct registry_key *key, int idx, struct registry_key **subkey);
-WERROR reg_key_get_subkey_by_name(TALLOC_CTX *mem_ctx, const struct registry_key *key, const char *name, struct registry_key **subkey);
-_PUBLIC_ WERROR reg_key_get_value_by_name(TALLOC_CTX *mem_ctx, const struct registry_key *key, const char *name, struct registry_value **val);
+_PUBLIC_ WERROR reg_get_predefined_key_by_name(struct registry_context *ctx, 
+                                                                                          const char *name, 
+                                                                                          struct registry_key **key);
+_PUBLIC_ WERROR reg_get_predefined_key(const struct registry_context *ctx, 
+                                                                          uint32_t hkey, 
+                                                                          struct registry_key **key);
+
+_PUBLIC_ WERROR reg_open_key(TALLOC_CTX *mem_ctx, struct registry_key *parent, 
+                                                        const char *name, struct registry_key **result);
+
+_PUBLIC_ WERROR reg_key_get_value_by_index(TALLOC_CTX *mem_ctx, 
+                                  const struct registry_key *key, uint32_t idx, 
+                                  const char **name,
+                                  uint32_t *type,
+                                  DATA_BLOB *data);
+_PUBLIC_ WERROR reg_key_get_info(TALLOC_CTX *mem_ctx,
+                                                                const struct registry_key *key, 
+                                                                       const char **class_name,
+                                                                       uint32_t *num_subkeys,
+                                                                       uint32_t *num_values,
+                                                                       NTTIME *last_change_time);
+_PUBLIC_ WERROR reg_key_get_subkey_by_index(TALLOC_CTX *mem_ctx, 
+                                                                                       const struct registry_key *key, 
+                                                                                       int idx, 
+                                                                                       const char **name,
+                                                                                       const char **classname,
+                                                                                       NTTIME *last_mod_time);
+WERROR reg_key_get_subkey_by_name(TALLOC_CTX *mem_ctx, 
+                                                                 const struct registry_key *key, 
+                                                                 const char *name, 
+                                                                 struct registry_key **subkey);
+_PUBLIC_ WERROR reg_key_get_value_by_name(TALLOC_CTX *mem_ctx, 
+                                                                                 const struct registry_key *key, 
+                                                                                 const char *name, 
+                                                                                 uint32_t *type,
+                                                                                 DATA_BLOB *data);
 _PUBLIC_ WERROR reg_key_del(struct registry_key *parent, const char *name);
-_PUBLIC_ WERROR reg_key_add_name(TALLOC_CTX *mem_ctx, const struct registry_key *parent, const char *name, uint32_t access_mask, struct security_descriptor *desc, struct registry_key **newkey);
-_PUBLIC_ WERROR reg_val_set(struct registry_key *key, const char *value, uint32_t type, DATA_BLOB data);
+_PUBLIC_ WERROR reg_key_add_name(TALLOC_CTX *mem_ctx, 
+                                                                struct registry_key *parent, const char *name, 
+                                                                const char *classname, 
+                                                                struct security_descriptor *desc, 
+                                                                struct registry_key **newkey);
+_PUBLIC_ WERROR reg_val_set(struct registry_key *key, const char *value, 
+                                                       uint32_t type, DATA_BLOB data);
 _PUBLIC_ WERROR reg_get_sec_desc(TALLOC_CTX *ctx, const struct registry_key *key, struct security_descriptor **secdesc);
-_PUBLIC_ WERROR reg_del_value(const struct registry_key *key, const char *valname);
-_PUBLIC_ WERROR reg_key_flush(const struct registry_key *key);
-_PUBLIC_ WERROR reg_key_subkeysizes(const struct registry_key *key, uint32_t *max_subkeylen, uint32_t *max_subkeysize);
-_PUBLIC_ WERROR reg_key_valuesizes(const struct registry_key *key, uint32_t *max_valnamelen, uint32_t *max_valbufsize);
+_PUBLIC_ WERROR reg_del_value(struct registry_key *key, const char *valname);
+_PUBLIC_ WERROR reg_key_flush(struct registry_key *key);
+WERROR reg_create_key (TALLOC_CTX *mem_ctx, 
+                                               struct registry_key *parent,
 
-/* Utility functions */
+                                                 const char *name,
+                                                 const char *key_class,
+                                                 struct security_descriptor *security,
+                                                 struct registry_key **key);
 
+
+
+
+/* Utility functions */
 _PUBLIC_ const char *str_regtype(int type);
-_PUBLIC_ char *reg_val_data_string(TALLOC_CTX *mem_ctx, uint32_t type, DATA_BLOB *data);
-_PUBLIC_ char *reg_val_description(TALLOC_CTX *mem_ctx, struct registry_value *val) ;
+_PUBLIC_ char *reg_val_data_string(TALLOC_CTX *mem_ctx, uint32_t type, 
+                                                                  const DATA_BLOB data);
+_PUBLIC_ char *reg_val_description(TALLOC_CTX *mem_ctx, const char *name,
+                                                                  uint32_t type, const DATA_BLOB data);
 _PUBLIC_ BOOL reg_string_to_val(TALLOC_CTX *mem_ctx, const char *type_str, const char *data_str, uint32_t *type, DATA_BLOB *data);
-char *reg_path_win2unix(char *path) ;
-char *reg_path_unix2win(char *path) ;
 WERROR reg_open_key_abs(TALLOC_CTX *mem_ctx, struct registry_context *handle, const char *name, struct registry_key **result);
 WERROR reg_key_del_abs(struct registry_context *ctx, const char *path);
 WERROR reg_key_add_abs(TALLOC_CTX *mem_ctx, struct registry_context *ctx, const char *path, uint32_t access_mask, struct security_descriptor *sec_desc, struct registry_key **result);
+WERROR reg_load_key(struct registry_context *ctx, struct registry_key *key, 
+                                       const char *name, const char *filename);
 
+WERROR reg_mount_hive(struct registry_context *rctx, 
+                                         struct hive_key *hive_key,
+                                         uint32_t key_id,
+                                         const char **elements);
 
-/* Patch files */
-
-_PUBLIC_ struct reg_diff *reg_generate_diff(TALLOC_CTX *mem_ctx, struct registry_context *ctx1, struct registry_context *ctx2);
-_PUBLIC_ WERROR reg_diff_save(const struct reg_diff *diff, const char *filename);
-_PUBLIC_ struct reg_diff *reg_diff_load(TALLOC_CTX *ctx, const char *fn);
-_PUBLIC_ BOOL reg_diff_apply (const struct reg_diff *diff, struct registry_context *ctx);
+struct registry_key *reg_import_hive_key(struct registry_context *ctx,
+                                                                            struct hive_key *hive, 
+                                                                            uint32_t predef_key,
+                                                                                const char **elements);
 
-NTSTATUS registry_rpc_init(void);
 
 #endif /* _REGISTRY_H */