aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2025-08-04 15:38:06 -0400
committerJohn Baldwin <jhb@FreeBSD.org>2025-08-04 15:38:06 -0400
commit4c5e0172767d6a61d50c475023b81dc3e2049465 (patch)
tree31274aefbe35abc0ac6e5c0d78f57bd39e6748b9
parent7f912714c53644ea18fc58ffa364918ccfa22999 (diff)
ctld: Replace the auth_name linked list with an unordered_set<>
Retire the struct auth_name type entirely and change the ag_names member of struct auth_group to be an unordered_set<> of std::string objects. Sponsored by: Chelsio Communications Pull Request: https://github.com/freebsd/freebsd-src/pull/1794
-rw-r--r--usr.sbin/ctld/ctld.cc51
-rw-r--r--usr.sbin/ctld/ctld.hh12
2 files changed, 6 insertions, 57 deletions
diff --git a/usr.sbin/ctld/ctld.cc b/usr.sbin/ctld/ctld.cc
index 558ddb8ac6aa..3ddccbfdb20e 100644
--- a/usr.sbin/ctld/ctld.cc
+++ b/usr.sbin/ctld/ctld.cc
@@ -226,57 +226,18 @@ auth_new_chap_mutual(struct auth_group *ag, const char *user,
bool
auth_name_new(struct auth_group *ag, const char *name)
{
- struct auth_name *an;
-
- an = reinterpret_cast<struct auth_name *>(calloc(1, sizeof(*an)));
- if (an == NULL)
- log_err(1, "calloc");
- an->an_auth_group = ag;
- an->an_initiator_name = checked_strdup(name);
- TAILQ_INSERT_TAIL(&ag->ag_names, an, an_next);
+ /* Silently ignore duplicates. */
+ ag->ag_names.emplace(name);
return (true);
}
-static void
-auth_name_delete(struct auth_name *an)
-{
- TAILQ_REMOVE(&an->an_auth_group->ag_names, an, an_next);
-
- free(an->an_initiator_name);
- free(an);
-}
-
-bool
-auth_name_defined(const struct auth_group *ag)
-{
- if (TAILQ_EMPTY(&ag->ag_names))
- return (false);
- return (true);
-}
-
-const struct auth_name *
-auth_name_find(const struct auth_group *ag, const char *name)
-{
- const struct auth_name *auth_name;
-
- TAILQ_FOREACH(auth_name, &ag->ag_names, an_next) {
- if (strcmp(auth_name->an_initiator_name, name) == 0)
- return (auth_name);
- }
-
- return (NULL);
-}
-
bool
auth_name_check(const struct auth_group *ag, const char *initiator_name)
{
- if (!auth_name_defined(ag))
+ if (ag->ag_names.empty())
return (true);
- if (auth_name_find(ag, initiator_name) == NULL)
- return (false);
-
- return (true);
+ return (ag->ag_names.count(initiator_name) != 0);
}
bool
@@ -420,7 +381,6 @@ auth_group_create(struct conf *conf, const char *name, char *label)
if (name != NULL)
ag->ag_name = checked_strdup(name);
ag->ag_label = label;
- TAILQ_INIT(&ag->ag_names);
TAILQ_INIT(&ag->ag_portals);
ag->ag_conf = conf;
TAILQ_INSERT_TAIL(&conf->conf_auth_groups, ag, ag_next);
@@ -456,13 +416,10 @@ auth_group_new(struct conf *conf, struct target *target)
void
auth_group_delete(struct auth_group *ag)
{
- struct auth_name *auth_name, *auth_name_tmp;
struct auth_portal *auth_portal, *auth_portal_tmp;
TAILQ_REMOVE(&ag->ag_conf->conf_auth_groups, ag, ag_next);
- TAILQ_FOREACH_SAFE(auth_name, &ag->ag_names, an_next, auth_name_tmp)
- auth_name_delete(auth_name);
TAILQ_FOREACH_SAFE(auth_portal, &ag->ag_portals, ap_next,
auth_portal_tmp)
auth_portal_delete(auth_portal);
diff --git a/usr.sbin/ctld/ctld.hh b/usr.sbin/ctld/ctld.hh
index a2cedeaf77da..339793e90bf1 100644
--- a/usr.sbin/ctld/ctld.hh
+++ b/usr.sbin/ctld/ctld.hh
@@ -44,6 +44,7 @@
#include <string>
#include <string_view>
#include <unordered_map>
+#include <unordered_set>
#define DEFAULT_CONFIG_PATH "/etc/ctl.conf"
#define DEFAULT_PIDFILE "/var/run/ctld.pid"
@@ -72,12 +73,6 @@ private:
std::string a_mutual_secret;
};
-struct auth_name {
- TAILQ_ENTRY(auth_name) an_next;
- struct auth_group *an_auth_group;
- char *an_initiator_name;
-};
-
struct auth_portal {
TAILQ_ENTRY(auth_portal) ap_next;
struct auth_group *ap_auth_group;
@@ -99,7 +94,7 @@ struct auth_group {
char *ag_label;
int ag_type;
std::unordered_map<std::string, auth> ag_auths;
- TAILQ_HEAD(, auth_name) ag_names;
+ std::unordered_set<std::string> ag_names;
TAILQ_HEAD(, auth_portal) ag_portals;
};
@@ -288,9 +283,6 @@ const struct auth *auth_find(const struct auth_group *ag,
bool auth_name_new(struct auth_group *ag,
const char *initiator_name);
-bool auth_name_defined(const struct auth_group *ag);
-const struct auth_name *auth_name_find(const struct auth_group *ag,
- const char *initiator_name);
bool auth_name_check(const struct auth_group *ag,
const char *initiator_name);