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 */
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 */
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);
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
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);
}
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 */