Coverage Report

Created: 2026-01-16 06:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/samba/source3/libads/sitename_cache.c
Line
Count
Source
1
/*
2
   Unix SMB/CIFS implementation.
3
   DNS utility library
4
   Copyright (C) Gerald (Jerry) Carter           2006.
5
   Copyright (C) Jeremy Allison                  2007.
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 3 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, see <http://www.gnu.org/licenses/>.
19
*/
20
21
#include "includes.h"
22
#include "libads/sitename_cache.h"
23
#include "lib/gencache.h"
24
25
/****************************************************************************
26
 Store and fetch the AD client sitename.
27
****************************************************************************/
28
29
0
#define SITENAME_KEY  "AD_SITENAME/DOMAIN/%s"
30
31
static char *sitename_key(TALLOC_CTX *mem_ctx, const char *realm)
32
0
{
33
0
  char *keystr = talloc_asprintf_strupper_m(
34
0
    mem_ctx, SITENAME_KEY, realm);
35
0
  return keystr;
36
0
}
37
38
39
/****************************************************************************
40
 Store the AD client sitename.
41
 We store indefinitely as every new CLDAP query will re-write this.
42
****************************************************************************/
43
44
bool sitename_store(const char *realm, const char *sitename)
45
0
{
46
0
  time_t expire;
47
0
  bool ret = False;
48
0
  char *key;
49
50
0
  if (!realm || (strlen(realm) == 0)) {
51
0
    DEBUG(0,("sitename_store: no realm\n"));
52
0
    return False;
53
0
  }
54
55
0
  key = sitename_key(talloc_tos(), realm);
56
57
0
  if (!sitename || (sitename && !*sitename)) {
58
0
    DEBUG(5,("sitename_store: deleting empty sitename!\n"));
59
0
    ret = gencache_del(key);
60
0
    TALLOC_FREE(key);
61
0
    return ret;
62
0
  }
63
64
0
  expire = get_time_t_max(); /* Store indefinitely. */
65
66
0
  DEBUG(10,("sitename_store: realm = [%s], sitename = [%s], expire = [%jd]\n",
67
0
    realm, sitename, (intmax_t)expire ));
68
69
0
  ret = gencache_set( key, sitename, expire );
70
0
  TALLOC_FREE(key);
71
0
  return ret;
72
0
}
73
74
/****************************************************************************
75
 Fetch the AD client sitename.
76
 Caller must free.
77
****************************************************************************/
78
79
char *sitename_fetch(TALLOC_CTX *mem_ctx, const char *realm)
80
0
{
81
0
  char *sitename = NULL;
82
0
  time_t timeout;
83
0
  bool ret = False;
84
0
  const char *query_realm;
85
0
  char *key;
86
87
0
  if (!realm || (strlen(realm) == 0)) {
88
0
    query_realm = lp_realm();
89
0
  } else {
90
0
    query_realm = realm;
91
0
  }
92
93
0
  key = sitename_key(talloc_tos(), query_realm);
94
95
0
  ret = gencache_get( key, mem_ctx, &sitename, &timeout );
96
0
  TALLOC_FREE(key);
97
0
  if ( !ret ) {
98
0
    DBG_INFO("No stored sitename for realm '%s'\n", query_realm);
99
0
  } else {
100
0
    DBG_INFO("Returning sitename for realm '%s': \"%s\"\n",
101
0
       query_realm, sitename);
102
0
  }
103
0
  return sitename;
104
0
}
105
106
/****************************************************************************
107
 Did the sitename change ?
108
****************************************************************************/
109
110
bool stored_sitename_changed(const char *realm, const char *sitename)
111
0
{
112
0
  bool ret = False;
113
114
0
  char *new_sitename;
115
116
0
  if (!realm || (strlen(realm) == 0)) {
117
0
    DEBUG(0,("stored_sitename_changed: no realm\n"));
118
0
    return False;
119
0
  }
120
121
0
  new_sitename = sitename_fetch(talloc_tos(), realm);
122
123
0
  if (sitename && new_sitename && !strequal(sitename, new_sitename)) {
124
0
    ret = True;
125
0
  } else if ((sitename && !new_sitename) ||
126
0
      (!sitename && new_sitename)) {
127
0
    ret = True;
128
0
  }
129
  TALLOC_FREE(new_sitename);
130
0
  return ret;
131
0
}
132