The branch main has been updated by jhb:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=4c5e0172767d6a61d50c475023b81dc3e2049465

commit 4c5e0172767d6a61d50c475023b81dc3e2049465
Author:     John Baldwin <j...@freebsd.org>
AuthorDate: 2025-08-04 19:38:06 +0000
Commit:     John Baldwin <j...@freebsd.org>
CommitDate: 2025-08-04 19:38:06 +0000

    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
---
 usr.sbin/ctld/ctld.cc | 51 ++++-----------------------------------------------
 usr.sbin/ctld/ctld.hh | 12 ++----------
 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);
 

Reply via email to