/* Implementation of internal registry database functions. */
#include "includes.h"
+#include "registry.h"
+#include "reg_db.h"
+#include "reg_util_internal.h"
+#include "reg_backend_db.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_REGISTRY
KEY_HKCU,
KEY_GP_USER_POLICY,
KEY_GP_USER_WIN_POLICY,
- KEY_WINLOGON_GPEXT_PATH,
+ "HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\GPExtensions",
"HKLM\\SYSTEM\\CurrentControlSet\\Control\\Print\\Monitors",
KEY_PROD_OPTIONS,
"HKLM\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\DefaultUserConfiguration",
static void regdb_ctr_add_value(struct regval_ctr *ctr,
struct builtin_regkey_value *value)
{
- UNISTR2 data;
-
switch(value->type) {
case REG_DWORD:
regval_ctr_addvalue(ctr, value->valuename, REG_DWORD,
- (char*)&value->data.dw_value,
+ (uint8_t *)&value->data.dw_value,
sizeof(uint32));
break;
case REG_SZ:
- init_unistr2(&data, value->data.string, UNI_STR_TERMINATE);
- regval_ctr_addvalue(ctr, value->valuename, REG_SZ,
- (char*)data.buffer,
- data.uni_str_len*sizeof(uint16));
+ regval_ctr_addvalue_sz(ctr, value->valuename,
+ value->data.string);
break;
default:
* recreated on demand.
*/
-static int cmp_keynames(const void *p1, const void *p2)
+static int cmp_keynames(char **p1, char **p2)
{
- return StrCaseCmp(*((char **)p1), *((char **)p2));
+ return StrCaseCmp(*p1, *p2);
}
struct create_sorted_subkeys_context {
len += strlen(sorted_subkeys[i])+1;
}
- qsort(sorted_subkeys, num_subkeys, sizeof(char *), cmp_keynames);
+ TYPESAFE_QSORT(sorted_subkeys, num_subkeys, cmp_keynames);
buf = talloc_array(ctr, char, len);
if (buf == NULL) {
if (state.scanned) {
result = state.found;
} else {
+ res = db->transaction_start(db);
+ if (res != 0) {
+ DEBUG(0, ("error starting transacion\n"));
+ goto fail;
+ }
+
if (!create_sorted_subkeys(path, key)) {
+ res = db->transaction_cancel(db);
+ if (res != 0) {
+ smb_panic("Failed to cancel transaction.");
+ }
goto fail;
}
+
res = db->parse_record(db, string_term_tdb_data(key),
parent_subkey_scanner, &state);
if ((res == 0) && (state.scanned)) {
result = state.found;
}
+
+ res = db->transaction_commit(db);
+ if (res != 0) {
+ DEBUG(0, ("error committing transaction\n"));
+ result = false;
+ }
}
fail:
value = regdb_fetch_key_internal(db, frame, key);
- if (value.dptr == NULL) {
+ if (value.dsize == 0 || value.dptr == NULL) {
DEBUG(10, ("regdb_fetch_keys: no subkeys found for key [%s]\n",
key));
goto done;
buf = value.dptr;
buflen = value.dsize;
len = tdb_unpack( buf, buflen, "d", &num_items);
+ if (len == (uint32_t)-1) {
+ werr = WERR_NOT_FOUND;
+ goto done;
+ }
werr = regsubkey_ctr_reinit(ctr);
W_ERROR_NOT_OK_GOTO_DONE(werr);
/* add the new value. Paranoid protective code -- make sure data_p is valid */
- if (*valuename && size && data_p) {
+ if (size && data_p) {
regval_ctr_addvalue(values, valuename, type,
- (const char *)data_p, size);
+ (uint8_t *)data_p, size);
}
SAFE_FREE(data_p); /* 'B' option to tdb_unpack does a malloc() */