X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/49fd293f200e3ecdd5665e62c6fdc18f33a9cdd1..c4acd427ac99824209a226d2a5f2bbd3e42fa210:/authd/provider.h diff --git a/authd/provider.h b/authd/provider.h index dc493509..9bcb7421 100644 --- a/authd/provider.h +++ b/authd/provider.h @@ -44,9 +44,7 @@ struct auth_client_data struct auth_client { - rb_dlink_node node; - - uint16_t cid; /* Client ID */ + uint32_t cid; /* Client ID */ char l_ip[HOSTIPLEN + 1]; /* Listener IP address */ uint16_t l_port; /* Listener port */ @@ -60,6 +58,8 @@ struct auth_client char username[USERLEN + 1]; /* Used for ident lookup */ bool providers_starting; /* Providers are still warming up */ + bool providers_cancelled; /* Providers are being cancelled */ + unsigned int providers_active; /* Number of active providers */ unsigned int refcount; /* Held references */ struct auth_client_data *data; /* Provider-specific data */ @@ -107,11 +107,7 @@ extern struct auth_provider blacklist_provider; extern struct auth_provider opm_provider; extern rb_dlink_list auth_providers; -extern rb_dlink_list auth_clients; - -struct auth_client * find_client(uint16_t cid); - -struct auth_provider * find_provider(const char *name); +extern rb_dictionary *auth_clients; void load_provider(struct auth_provider *provider); void unload_provider(struct auth_provider *provider); @@ -121,12 +117,43 @@ void destroy_providers(void); void cancel_providers(struct auth_client *auth); void provider_done(struct auth_client *auth, uint32_t id); -void accept_client(struct auth_client *auth, uint32_t id); +void accept_client(struct auth_client *auth); void reject_client(struct auth_client *auth, uint32_t id, const char *data, const char *fmt, ...); void handle_new_connection(int parc, char *parv[]); void handle_cancel_connection(int parc, char *parv[]); +void auth_client_free(struct auth_client *auth); +static inline void +auth_client_ref(struct auth_client *auth) +{ + auth->refcount++; +} + +static inline void +auth_client_unref(struct auth_client *auth) +{ + auth->refcount--; + if (auth->refcount == 0) + auth_client_free(auth); +} + +/* Get a provider by name */ +static inline struct auth_provider * +find_provider(const char *name) +{ + rb_dlink_node *ptr; + + RB_DLINK_FOREACH(ptr, auth_providers.head) + { + struct auth_provider *provider = ptr->data; + + if(strcasecmp(provider->name, name) == 0) + return provider; + } + + return NULL; +} /* Get a provider's id by name */ static inline bool @@ -162,7 +189,7 @@ set_provider_status(struct auth_client *auth, uint32_t provider, provider_status static inline void set_provider_running(struct auth_client *auth, uint32_t provider) { - auth->refcount++; + auth->providers_active++; set_provider_status(auth, provider, PROVIDER_STATUS_RUNNING); } @@ -171,8 +198,8 @@ set_provider_running(struct auth_client *auth, uint32_t provider) static inline void set_provider_done(struct auth_client *auth, uint32_t provider) { - auth->refcount--; set_provider_status(auth, provider, PROVIDER_STATUS_DONE); + auth->providers_active--; } /* Check if provider is operating on this auth client */