]> jfr.im git - solanum.git/blobdiff - authd/provider.c
authd: dynamically allocate data and timeout elements
[solanum.git] / authd / provider.c
index 4347517034a9c70ab8c4383e77efeb7c9df2f3e5..582944886cfaa9d5566d45a11743ce8da3dc333f 100644 (file)
@@ -165,6 +165,7 @@ cancel_providers(struct auth_client *auth)
        }
 
        rb_dictionary_delete(auth_clients, RB_UINT_TO_POINTER(auth->cid));
+       rb_free(auth->data);
        rb_free(auth);
 }
 
@@ -285,7 +286,8 @@ start_auth(const char *cid, const char *l_ip, const char *l_port, const char *c_
        rb_strlcpy(auth->hostname, "*", sizeof(auth->hostname));
        rb_strlcpy(auth->username, "*", sizeof(auth->username));
 
-       memset(auth->data, 0, sizeof(auth->data));
+       auth->data = rb_malloc(rb_dlink_list_length(&auth_providers) *
+                       sizeof(struct auth_client_data));
 
        auth->providers_starting = true;
        RB_DLINK_FOREACH(ptr, auth_providers.head)
@@ -364,7 +366,7 @@ provider_timeout_event(void *notused __unused)
                RB_DLINK_FOREACH(ptr, auth_providers.head)
                {
                        struct auth_provider *provider = ptr->data;
-                       const time_t timeout = auth->timeout[provider->id];
+                       const time_t timeout = get_provider_timeout(auth, provider->id);
 
                        if(is_provider_on(auth, provider->id) && provider->timeout != NULL &&
                                timeout > 0 && timeout < curtime)
@@ -379,27 +381,33 @@ void *
 get_provider_data(struct auth_client *auth, uint32_t id)
 {
        lrb_assert(id < rb_dlink_list_length(&auth_providers));
-       return auth->data[(size_t)id];
+       return auth->data[id].data;
 }
 
 void
 set_provider_data(struct auth_client *auth, uint32_t id, void *data)
 {
        lrb_assert(id < rb_dlink_list_length(&auth_providers));
-       auth->data[(size_t)id] = data;
+       auth->data[id].data = data;
 }
 
 void
 set_provider_timeout_relative(struct auth_client *auth, uint32_t id, time_t timeout)
 {
        lrb_assert(id < rb_dlink_list_length(&auth_providers));
-       auth->timeout[(size_t)id] = timeout + rb_current_time();
+       auth->data[id].timeout = timeout + rb_current_time();
 }
 
 void
 set_provider_timeout_absolute(struct auth_client *auth, uint32_t id, time_t timeout)
 {
        lrb_assert(id < rb_dlink_list_length(&auth_providers));
-       auth->timeout[(size_t)id] = timeout;
+       auth->data[id].timeout = timeout;
 }
 
+time_t
+get_provider_timeout(struct auth_client *auth, uint32_t id)
+{
+       lrb_assert(id < rb_dlink_list_length(&auth_providers));
+       return auth->data[id].timeout;
+}