r10025: Add some utility functions for storing/loading tdr encoded data
[bbaumbach/samba-autobuild/.git] / source4 / lib / registry / registry.h
1 /* 
2    Unix SMB/CIFS implementation.
3    Registry interface
4    Copyright (C) Gerald Carter                        2002.
5    Copyright (C) Jelmer Vernooij                                          2003-2004.
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #ifndef _REGISTRY_H /* _REGISTRY_H */
23 #define _REGISTRY_H 
24
25 /* Handles for the predefined keys */
26 #define HKEY_CLASSES_ROOT                0x80000000
27 #define HKEY_CURRENT_USER                0x80000001
28 #define HKEY_LOCAL_MACHINE               0x80000002
29 #define HKEY_USERS                               0x80000003
30 #define HKEY_PERFORMANCE_DATA    0x80000004
31 #define HKEY_CURRENT_CONFIG              0x80000005
32 #define HKEY_DYN_DATA                    0x80000006
33 #define HKEY_PERFORMANCE_TEXT    0x80000050
34 #define HKEY_PERFORMANCE_NLSTEXT 0x80000060
35
36 #define REG_DELETE                                                                 -1
37
38 /*
39  * The general idea here is that every backend provides a 'hive'. Combining
40  * various hives gives you a complete registry like windows has
41  */
42
43 #define REGISTRY_INTERFACE_VERSION 1
44
45 /* structure to store the registry handles */
46 struct registry_key {
47   char *name;         /* Name of the key                    */
48   const char *path;               /* Full path to the key */
49   char *class_name; /* Name of key class */
50   NTTIME last_mod; /* Time last modified                 */
51   struct registry_hive *hive;
52   void *backend_data;
53 };
54
55 struct registry_value {
56   char *name;
57   unsigned int data_type;
58   DATA_BLOB data;
59 };
60
61 /* FIXME */
62 typedef void (*key_notification_function) (void);
63 typedef void (*value_notification_function) (void);
64
65 /* 
66  * Container for function pointers to enumeration routines
67  * for virtual registry view 
68  *
69  * Backends can provide :
70  *  - just one hive (example: nt4, w95)
71  *  - several hives (example: rpc).
72  * 
73  * Backends should always do case-insensitive compares 
74  * (everything is case-insensitive but case-preserving, 
75  * just like the FS)
76  */ 
77
78 struct hive_operations {
79         const char *name;
80
81         /* Implement this one */
82         WERROR (*open_hive) (struct registry_hive *, struct registry_key **);
83         WERROR (*save_hive) (struct registry_hive *, const char *location);
84
85         /* Or this one */
86         WERROR (*open_key) (TALLOC_CTX *, struct registry_key *, const char *name, struct registry_key **);
87
88         WERROR (*num_subkeys) (struct registry_key *, uint32_t *count);
89         WERROR (*num_values) (struct registry_key *, uint32_t *count);
90         WERROR (*get_subkey_by_index) (TALLOC_CTX *, struct registry_key *, int idx, struct registry_key **);
91
92         /* Can not contain more then one level */
93         WERROR (*get_subkey_by_name) (TALLOC_CTX *, struct registry_key *, const char *name, struct registry_key **);
94         WERROR (*get_value_by_index) (TALLOC_CTX *, struct registry_key *, int idx, struct registry_value **);
95
96         /* Can not contain more then one level */
97         WERROR (*get_value_by_name) (TALLOC_CTX *, struct registry_key *, const char *name, struct registry_value **);
98
99         /* Security control */
100         WERROR (*key_get_sec_desc) (TALLOC_CTX *, struct registry_key *, struct security_descriptor **);
101         WERROR (*key_set_sec_desc) (struct registry_key *, struct security_descriptor *);
102
103         /* Notification */
104         WERROR (*request_key_change_notify) (struct registry_key *, key_notification_function);
105         WERROR (*request_value_change_notify) (struct registry_value *, value_notification_function);
106
107         /* Key management */
108         WERROR (*add_key)(TALLOC_CTX *, struct registry_key *, const char *name, uint32_t access_mask, struct security_descriptor *, struct registry_key **);
109         WERROR (*del_key)(struct registry_key *, const char *name);
110         WERROR (*flush_key) (struct registry_key *);
111
112         /* Value management */
113         WERROR (*set_value)(struct registry_key *, const char *name, uint32_t type, DATA_BLOB data); 
114         WERROR (*del_value)(struct registry_key *, const char *valname);
115 };
116
117 struct registry_hive {
118         const struct hive_operations *functions;
119         struct registry_key *root;
120         void *backend_data;
121         const char *location;
122 };
123
124 /* Handle to a full registry
125  * contains zero or more hives */
126 struct registry_context {
127     void *backend_data;
128         WERROR (*get_predefined_key) (struct registry_context *, uint32_t hkey, struct registry_key **);
129 };
130
131 struct reg_init_function_entry {
132         const struct hive_operations *hive_functions;
133         struct reg_init_function_entry *prev, *next;
134 };
135
136 #endif /* _REGISTRY_H */