diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2004-09-22 12:32:31 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:59:01 -0500 |
commit | 369a5d64e462e084e6c5fe4984d56da18b2c92d9 (patch) | |
tree | 815e7a10696ef40205c1e16c4e01b660a7a8f0b7 /source4/include/registry.h | |
parent | bc8ef3d1b6bfdf279d65783869b9a247c1da38aa (diff) | |
download | samba-369a5d64e462e084e6c5fe4984d56da18b2c92d9.tar.gz samba-369a5d64e462e084e6c5fe4984d56da18b2c92d9.tar.bz2 samba-369a5d64e462e084e6c5fe4984d56da18b2c92d9.zip |
r2518: Some long overdue changes:
- Samba4-style code in lib/registry (struct registry_key instead of REG_KEY, etc)
- Use hives (like Windows has drives) instead of one root key (like a Unix FS)
- usability fixes in the GTK utilities (autodetect the username,
enable/disable options, etc)
- fix gwsam compile
- several bugfixes in the registry rpc code
- do charset conversion in nt4 registry backend
(This used to be commit 2762ed3b9bf1d67dd54d63e02cddbfd71ea89892)
Diffstat (limited to 'source4/include/registry.h')
-rw-r--r-- | source4/include/registry.h | 118 |
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 */ |