Coverage Report

Created: 2026-06-07 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/samba/source3/registry/reg_util_internal.c
Line
Count
Source
1
/* 
2
 *  Unix SMB/CIFS implementation.
3
 *  Virtual Windows Registry Layer (utility functions)
4
 *  Copyright (C) Gerald Carter                     2002-2005
5
 *
6
 *  This program is free software; you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation; either version 3 of the License, or
9
 *  (at your option) any later version.
10
 *
11
 *  This program is distributed in the hope that it will be useful,
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *  GNU General Public License for more details.
15
 *
16
 *  You should have received a copy of the GNU General Public License
17
 *  along with this program; if not, see <http://www.gnu.org/licenses/>.
18
 */
19
20
/* Implementation of registry frontend view functions. */
21
22
#include "includes.h"
23
#include "registry.h"
24
#include "reg_util_internal.h"
25
26
#undef DBGC_CLASS
27
#define DBGC_CLASS DBGC_REGISTRY
28
29
/***********************************************************************
30
 Utility function for splitting the base path of a registry path off
31
 by setting base and new_path to the apprapriate offsets within the
32
 path.
33
34
 WARNING!!  Does modify the original string!
35
 ***********************************************************************/
36
37
bool reg_split_path(char *path, char **base, char **new_path)
38
0
{
39
0
  char *p;
40
41
0
  *new_path = *base = NULL;
42
43
0
  if (!path) {
44
0
    return false;
45
0
  }
46
0
  *base = path;
47
48
0
  p = strchr(path, '\\');
49
50
0
  if ( p ) {
51
0
    *p = '\0';
52
0
    *new_path = p+1;
53
0
  }
54
55
0
  return true;
56
0
}
57
58
/***********************************************************************
59
 Utility function for splitting the base path of a registry path off
60
 by setting base and new_path to the appropriate offsets within the
61
 path.
62
63
 WARNING!!  Does modify the original string!
64
 ***********************************************************************/
65
66
bool reg_split_key(char *path, char **base, char **key)
67
0
{
68
0
  char *p;
69
70
0
  *key = *base = NULL;
71
72
0
  if (!path) {
73
0
    return false;
74
0
  }
75
76
0
  *base = path;
77
78
0
  p = strrchr(path, '\\');
79
80
0
  if (p) {
81
0
    *p = '\0';
82
0
    *key = p+1;
83
0
  }
84
85
0
  return true;
86
0
}
87
88
/**
89
 * The full path to the registry key is used as database key.
90
 * Leading and trailing '\' characters are stripped.
91
 * Key string is also normalized to UPPER case.
92
 */
93
94
char *normalize_reg_path(TALLOC_CTX *ctx, const char *keyname )
95
0
{
96
0
  char *p;
97
0
  char *nkeyname;
98
99
  /* skip leading '\' chars */
100
0
  while (*keyname == '\\') {
101
0
    keyname++;
102
0
  }
103
104
0
  nkeyname = talloc_strdup(ctx, keyname);
105
0
  if (nkeyname == NULL) {
106
0
    return NULL;
107
0
  }
108
109
  /* strip trailing '\' chars */
110
0
  p = strrchr(nkeyname, '\\');
111
0
  while ((p != NULL) && (p[1] == '\0')) {
112
0
    *p = '\0';
113
0
    p = strrchr(nkeyname, '\\');
114
0
  }
115
116
0
  if (!strupper_m(nkeyname)) {
117
0
    TALLOC_FREE(nkeyname);
118
0
    return NULL;
119
0
  }
120
121
0
  return nkeyname;
122
0
}
123
124
/**********************************************************************
125
 move to next non-delimter character
126
*********************************************************************/
127
128
char *reg_remaining_path(TALLOC_CTX *ctx, const char *key)
129
0
{
130
0
  char *new_path = NULL;
131
0
  char *p = NULL;
132
133
0
  if (!key || !*key) {
134
0
    return NULL;
135
0
  }
136
137
0
  new_path = talloc_strdup(ctx, key);
138
0
  if (!new_path) {
139
0
    return NULL;
140
0
  }
141
  /* normalize_reg_path( new_path ); */
142
0
  if (!(p = strchr(new_path, '\\')) ) {
143
0
    p = new_path;
144
0
  } else {
145
0
    p++;
146
0
  }
147
148
0
  return p;
149
0
}