2 * Samba Unix/Linux SMB client library
3 * Adapter to use reg_parse with the registry api
5 * Copyright (C) Gregor Beck 2010
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 3 of the License, or
10 * (at your option) any later version.
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.
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "reg_parse.h"
23 #include "reg_import.h"
26 /* Debuglevel for tracing */
27 static const int TL = 2;
31 struct reg_parse_callback reg_parse_callback;
32 struct reg_import_callback call;
37 reg_parse_callback_key(struct reg_import* cb_private,
38 const char* key[], size_t n,
42 reg_parse_callback_val(struct reg_import* cb_private,
43 const char* name, uint32_t type,
44 const uint8_t* data, uint32_t len);
47 reg_parse_callback_val_registry_value(struct reg_import* cb_private,
48 const char* name, uint32_t type,
49 const uint8_t* data, uint32_t len);
52 reg_parse_callback_val_regval_blob(struct reg_import* cb_private,
53 const char* name, uint32_t type,
54 const uint8_t* data, uint32_t len);
57 reg_parse_callback_val_del(struct reg_import* cb_private,
61 reg_parse_callback_comment(struct reg_import* cb_private,
65 /*******************************************************************************/
67 int reg_parse_callback_key(struct reg_import* p,
68 const char* key[], size_t n, bool del)
70 WERROR werr = WERR_OK;
72 DEBUG(TL, ("%s: %s\n", __FUNCTION__, key[0]));
74 if (p->open_key != NULL ) {
75 werr = p->call.closekey(p->call.data, p->open_key);
76 if (!W_ERROR_IS_OK(werr)) {
77 DEBUG(0, ("closekey failed: %s\n", win_errstr(werr)));
82 werr = p->call.deletekey(p->call.data, NULL, key[0]);
83 if (W_ERROR_EQUAL(werr, WERR_BADFILE)) {
84 /* the key didn't exist, treat as success */
87 if (!W_ERROR_IS_OK(werr)) {
88 DEBUG(0, ("deletekey %s failed: %s\n",
89 key[0], win_errstr(werr)));
94 werr = p->call.createkey(p->call.data, NULL, key[0],
95 &p->open_key, &existing);
96 if (W_ERROR_IS_OK(werr)) {
97 DEBUG(TL, ("createkey %s %s\n",
98 existing ? "opened" : "created", key[0]));
100 DEBUG(0, ("createkey %s failed: %s\n",
101 key[0], win_errstr(werr)));
105 return W_ERROR_IS_OK(werr) ? 0 : -1;
108 #define DEBUG_ADD_HEX(LEV, PTR, LEN) \
111 const unsigned char* ptr = (const unsigned char*)PTR; \
112 for (i=0; i<LEN; i++) { \
113 DEBUGADD(LEV, ("'%c'(%02x)%s", \
114 isprint(ptr[i]) ? ptr[i] : '.', \
116 ((i+1 < LEN) && (i+1)%8) \
121 /*----------------------------------------------------------------------------*/
122 int reg_parse_callback_val(struct reg_import* p,
123 const char* name, uint32_t type,
124 const uint8_t* data, uint32_t len)
126 WERROR werr = WERR_OK;
128 DEBUG(TL, ("%s(%x): >%s< = [%x]\n", __FUNCTION__, type, name, len));
129 DEBUG_ADD_HEX(TL, data, len);
131 werr = p->call.setval.blob(p->call.data, p->open_key, name, type,
133 if (!W_ERROR_IS_OK(werr)) {
134 DEBUG(0, ("setval %s failed: %s\n",
135 name, win_errstr(werr)));
138 return W_ERROR_IS_OK(werr) ? 0 : -1;
141 /*----------------------------------------------------------------------------*/
142 int reg_parse_callback_val_registry_value(struct reg_import* p,
143 const char* name, uint32_t type,
144 const uint8_t* val, uint32_t len)
146 WERROR werr = WERR_OK;
147 void* mem_ctx = talloc_new(p);
148 struct registry_value* v = NULL;
150 DEBUG(TL, ("%s(%x): >%s< = [%x]\n", __FUNCTION__, type, name, len));
151 DEBUG_ADD_HEX(TL, val, len);
153 werr = registry_pull_value(mem_ctx, &v, type,
154 discard_const(val), len, len);
155 if (!W_ERROR_IS_OK(werr)) {
156 DEBUG(0, ("registry_pull_value %s failed: %s\n",
157 name, win_errstr(werr)));
161 werr = p->call.setval.registry_value(p->call.data, p->open_key,
163 if (!W_ERROR_IS_OK(werr)) {
164 DEBUG(0, ("setval.registry_value %s failed: %s\n",
170 talloc_free(mem_ctx);
171 return W_ERROR_IS_OK(werr) ? 0 : -1;
174 /*----------------------------------------------------------------------------*/
175 int reg_parse_callback_val_regval_blob(struct reg_import* p,
176 const char* name, uint32_t type,
177 const uint8_t* data, uint32_t len)
179 WERROR werr = WERR_OK;
180 void* mem_ctx = talloc_new(p);
181 struct regval_blob* v = NULL;
183 DEBUG(TL, ("%s(%x): >%s< = [%x]\n", __FUNCTION__, type, name, len));
184 DEBUG_ADD_HEX(TL, data, len);
186 v = regval_compose(mem_ctx, name, type, (const char*)data, len);
188 DEBUG(0, ("regval_compose %s failed\n", name));
193 werr = p->call.setval.regval_blob(p->call.data, p->open_key, v);
194 if (!W_ERROR_IS_OK(werr)) {
195 DEBUG(0, ("setval %s failed: %s\n",
196 name, win_errstr(werr)));
200 talloc_free(mem_ctx);
202 return W_ERROR_IS_OK(werr) ? 0 : -1;
206 /*----------------------------------------------------------------------------*/
208 int reg_parse_callback_val_del(struct reg_import* p,
211 WERROR werr = WERR_OK;
213 DEBUG(TL, ("%s: %s\n", __FUNCTION__, name));
215 werr = p->call.deleteval(p->call.data, p->open_key, name);
216 if (!W_ERROR_IS_OK(werr)) {
217 DEBUG(0, ("deleteval %s failed: %s\n",
218 name, win_errstr(werr)));
221 return W_ERROR_IS_OK(werr) ? 0 : -1;
225 int reg_parse_callback_comment(struct reg_import* cb_private,
228 DEBUG(TL, ("%s: %s\n", __FUNCTION__, txt));
232 /******************************************************************************/
233 static int nop(void* data)
239 struct reg_parse_callback* reg_import_adapter(const void* talloc_ctx,
240 struct reg_import_callback cb)
242 struct reg_parse_callback* ret;
243 struct reg_import* p = talloc_zero(talloc_ctx, struct reg_import);
247 if (cb.openkey == NULL ) {
248 cb.openkey = (reg_import_callback_openkey_t)&nop;
250 if (cb.closekey == NULL ) {
251 cb.closekey = (reg_import_callback_closekey_t)&nop;
253 if (cb.createkey == NULL ) {
254 cb.createkey = (reg_import_callback_createkey_t)&nop;
256 if (cb.deletekey == NULL ) {
257 cb.deletekey = (reg_import_callback_deletekey_t)&nop;
259 if (cb.deleteval == NULL ) {
260 cb.deleteval = (reg_import_callback_deleteval_t)&nop;
265 ret = &p->reg_parse_callback;
266 ret->key = (reg_parse_callback_key_t) ®_parse_callback_key;
267 ret->val_del = (reg_parse_callback_val_del_t) ®_parse_callback_val_del;
268 ret->comment = (reg_parse_callback_comment_t) ®_parse_callback_comment;
271 switch (cb.setval_type) {
273 assert(cb.setval.blob != NULL);
274 ret->val = (reg_parse_callback_val_t) ®_parse_callback_val;
277 assert(cb.setval.registry_value != NULL);
278 ret->val = (reg_parse_callback_val_t) ®_parse_callback_val_registry_value;
281 assert(cb.setval.regval_blob != NULL);
282 ret->val = (reg_parse_callback_val_t) ®_parse_callback_val_regval_blob;
291 assert((struct reg_parse_callback*)p == ret);