summaryrefslogtreecommitdiff
path: root/source4/include
diff options
context:
space:
mode:
Diffstat (limited to 'source4/include')
-rw-r--r--source4/include/registry.h118
1 files changed, 113 insertions, 5 deletions
diff --git a/source4/include/registry.h b/source4/include/registry.h
index 162bb5e283..3aea70ecc1 100644
--- a/source4/include/registry.h
+++ b/source4/include/registry.h
@@ -43,11 +43,6 @@
#define REG_FULL_RESOURCE_DESCRIPTOR 9
#define REG_RESOURCE_REQUIREMENTS_LIST 10
-typedef struct reg_handle_s REG_HANDLE;
-typedef struct reg_key_s REG_KEY;
-typedef struct reg_val_s REG_VAL;
-typedef struct reg_ops_s REG_OPS;
-
#if 0
/* FIXME */
typedef struct ace_struct_s {
@@ -57,4 +52,117 @@ typedef struct ace_struct_s {
} ACE;
#endif
+/*
+ * The general idea here is that every backend provides a 'hive'. Combining
+ * various hives gives you a complete registry like windows has
+ */
+
+#define REGISTRY_INTERFACE_VERSION 1
+
+/* structure to store the registry handles */
+struct registry_key {
+ char *name; /* Name of the key */
+ char *path; /* Full path to the key */
+ char *class_name; /* Name of key class */
+ NTTIME last_mod; /* Time last modified */
+ SEC_DESC *security;
+ struct registry_hive *hive;
+ void *backend_data;
+ int ref;
+};
+
+struct registry_value {
+ char *name;
+ int data_type;
+ int data_len;
+ void *data_blk; /* Might want a separate block */
+ struct registry_hive *hive;
+ struct registry_key *parent;
+ void *backend_data;
+ int ref;
+};
+
+/* FIXME */
+typedef void (*key_notification_function) (void);
+typedef void (*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)
+ *
+ */
+
+struct registry_operations {
+ const char *name;
+
+ /* If one file, connection, etc may have more then one hive */
+ WERROR (*list_available_hives) (TALLOC_CTX *, const char *location, const char *credentials, char ***hives);
+
+ /* Implement this one */
+ WERROR (*open_hive) (TALLOC_CTX *, struct registry_hive *, struct registry_key **);
+
+ /* Or this one */
+ WERROR (*open_key) (TALLOC_CTX *, struct registry_hive *, const char *name, struct registry_key **);
+
+ /* Either implement these */
+ WERROR (*num_subkeys) (struct registry_key *, int *count);
+ WERROR (*num_values) (struct registry_key *, int *count);
+ WERROR (*get_subkey_by_index) (TALLOC_CTX *, struct registry_key *, int idx, struct registry_key **);
+
+ /* Can not contain more then one level */
+ WERROR (*get_subkey_by_name) (TALLOC_CTX *, struct registry_key *, const char *name, struct registry_key **);
+ WERROR (*get_value_by_index) (TALLOC_CTX *, struct registry_key *, int idx, struct registry_value **);
+
+ /* Can not contain more then one level */
+ WERROR (*get_value_by_name) (TALLOC_CTX *, struct registry_key *, const char *name, struct registry_value **);
+
+ /* Security control */
+ WERROR (*key_get_sec_desc) (TALLOC_CTX *, struct registry_key *, SEC_DESC **);
+ WERROR (*key_set_sec_desc) (struct registry_key *, SEC_DESC *);
+
+ /* Notification */
+ WERROR (*request_key_change_notify) (struct registry_key *, key_notification_function);
+ WERROR (*request_value_change_notify) (struct registry_value *, value_notification_function);
+
+ /* Key management */
+ WERROR (*add_key)(TALLOC_CTX *, struct registry_key *, const char *name, uint32_t access_mask, SEC_DESC *, struct registry_key **);
+ WERROR (*del_key)(struct registry_key *);
+
+ /* Value management */
+ WERROR (*set_value)(struct registry_key *, const char *name, int type, void *data, int len);
+ WERROR (*del_value)(struct registry_value *);
+};
+
+struct registry_hive {
+ const struct registry_operations *functions;
+ char *name; /* usually something like HKEY_CURRENT_USER, etc */
+ char *location;
+ char *credentials;
+ char *backend_hivename;
+ void *backend_data;
+ struct registry_key *root;
+ struct registry_context *reg_ctx;
+};
+
+/* Handle to a full registry
+ * contains zero or more hives */
+struct registry_context {
+ TALLOC_CTX *mem_ctx;
+ int num_hives;
+ struct registry_hive **hives;
+};
+
+struct reg_init_function_entry {
+ /* Function to create a member of the pdb_methods list */
+ const struct registry_operations *functions;
+ struct reg_init_function_entry *prev, *next;
+};
+
+/* Used internally */
+#define SMB_REG_ASSERT(a) { if(!(a)) { DEBUG(0,("%s failed! (%s:%d)", #a, __FILE__, __LINE__)); }}
+
#endif /* _REGISTRY_H */