extern time_t process_start_time;
extern struct auth_penalty *auth_penalty;
+void auth_refresh_proctitle(void);
+
#endif
auth_request_log_info(auth_request, "userdb", "%s", error);
user_callback(USERDB_RESULT_USER_UNKNOWN, auth_request);
} else {
- auth_request->state = AUTH_REQUEST_STATE_USERDB;
+ auth_request_set_state(auth_request, AUTH_REQUEST_STATE_USERDB);
auth_request_lookup_user(auth_request, user_callback);
}
return TRUE;
pass_callback(PASSDB_RESULT_USER_UNKNOWN,
NULL, 0, auth_request);
} else {
- auth_request->state = AUTH_REQUEST_STATE_MECH_CONTINUE;
+ auth_request_set_state(auth_request,
+ AUTH_REQUEST_STATE_MECH_CONTINUE);
auth_request_lookup_credentials(auth_request, "",
pass_callback);
}
i_assert(request->state == AUTH_REQUEST_STATE_USERDB);
- request->state = AUTH_REQUEST_STATE_FINISHED;
+ auth_request_set_state(request, AUTH_REQUEST_STATE_FINISHED);
if (request->userdb_lookup_failed)
result = USERDB_RESULT_INTERNAL_FAILURE;
/* the request isn't being referenced anywhere anymore,
so we can do a bit of kludging.. replace the request's
old client_id with master's id. */
- request->state = AUTH_REQUEST_STATE_USERDB;
+ auth_request_set_state(request, AUTH_REQUEST_STATE_USERDB);
request->id = id;
request->context = handler;
request->master = master;
#define CACHED_PASSWORD_SCHEME "SHA1"
+enum auth_request_state auth_request_state_count[AUTH_REQUEST_STATE_MAX];
+
static void get_log_prefix(string_t *str, struct auth_request *auth_request,
const char *subsystem);
struct auth_request *request;
request = mech->auth_new();
+
request->state = AUTH_REQUEST_STATE_NEW;
+ auth_request_state_count[AUTH_REQUEST_STATE_NEW]++;
request->refcount = 1;
request->last_access = ioloop_time;
struct auth_request *auth_request_new_dummy(void)
{
- struct auth_request *auth_request;
+ struct auth_request *request;
pool_t pool;
pool = pool_alloconly_create("auth_request", 1024);
- auth_request = p_new(pool, struct auth_request, 1);
- auth_request->pool = pool;
+ request = p_new(pool, struct auth_request, 1);
+ request->pool = pool;
- auth_request->refcount = 1;
- auth_request->last_access = ioloop_time;
- auth_request->set = global_auth_settings;
+ request->state = AUTH_REQUEST_STATE_NEW;
+ auth_request_state_count[AUTH_REQUEST_STATE_NEW]++;
- return auth_request;
+ request->refcount = 1;
+ request->last_access = ioloop_time;
+ request->set = global_auth_settings;
+ return request;
+}
+
+void auth_request_set_state(struct auth_request *request,
+ enum auth_request_state state)
+{
+ if (request->state == state)
+ return;
+
+ i_assert(auth_request_state_count[request->state] > 0);
+ auth_request_state_count[request->state]--;
+ auth_request_state_count[state]++;
+
+ request->state = state;
+ auth_refresh_proctitle();
}
void auth_request_init(struct auth_request *request)
return;
}
- request->state = AUTH_REQUEST_STATE_FINISHED;
+ auth_request_set_state(request, AUTH_REQUEST_STATE_FINISHED);
request->successful = TRUE;
auth_request_refresh_last_access(request);
request->callback(request, AUTH_CLIENT_RESULT_SUCCESS,
{
i_assert(request->state == AUTH_REQUEST_STATE_MECH_CONTINUE);
- request->state = AUTH_REQUEST_STATE_FINISHED;
+ auth_request_set_state(request, AUTH_REQUEST_STATE_FINISHED);
auth_request_refresh_last_access(request);
request->callback(request, AUTH_CLIENT_RESULT_FAILURE, NULL, 0);
}
if (--request->refcount > 0)
return;
+ auth_request_state_count[request->state]--;
+ auth_refresh_proctitle();
+
if (request->to_abort != NULL)
timeout_remove(&request->to_abort);
if (request->to_penalty != NULL)
{
i_assert(request->state == AUTH_REQUEST_STATE_NEW);
- request->state = AUTH_REQUEST_STATE_MECH_CONTINUE;
+ auth_request_set_state(request, AUTH_REQUEST_STATE_MECH_CONTINUE);
request->mech->auth_initial(request, request->initial_response,
request->initial_response_len);
}
{
i_assert(request->state == AUTH_REQUEST_STATE_PASSDB);
- request->state = AUTH_REQUEST_STATE_MECH_CONTINUE;
+ auth_request_set_state(request, AUTH_REQUEST_STATE_MECH_CONTINUE);
if (result != PASSDB_RESULT_INTERNAL_FAILURE)
auth_request_save_cache(request, result);
return;
}
- request->state = AUTH_REQUEST_STATE_PASSDB;
+ auth_request_set_state(request, AUTH_REQUEST_STATE_PASSDB);
request->credentials_scheme = NULL;
if (passdb->blocking)
i_assert(request->state == AUTH_REQUEST_STATE_PASSDB);
- request->state = AUTH_REQUEST_STATE_MECH_CONTINUE;
+ auth_request_set_state(request, AUTH_REQUEST_STATE_MECH_CONTINUE);
if (result != PASSDB_RESULT_INTERNAL_FAILURE)
auth_request_save_cache(request, result);
}
}
- request->state = AUTH_REQUEST_STATE_PASSDB;
+ auth_request_set_state(request, AUTH_REQUEST_STATE_PASSDB);
if (passdb->iface.lookup_credentials == NULL) {
/* this passdb doesn't support credentials */
AUTH_REQUEST_STATE_PASSDB,
AUTH_REQUEST_STATE_MECH_CONTINUE,
AUTH_REQUEST_STATE_FINISHED,
- AUTH_REQUEST_STATE_USERDB
+ AUTH_REQUEST_STATE_USERDB,
+
+ AUTH_REQUEST_STATE_MAX
};
typedef const char *
/* ... mechanism specific data ... */
};
+extern enum auth_request_state auth_request_state_count[AUTH_REQUEST_STATE_MAX];
+
struct auth_request *
auth_request_new(const struct mech_module *mech,
mech_callback_t *callback, void *context);
void auth_request_init(struct auth_request *request);
struct auth *auth_request_get_auth(struct auth_request *request);
+void auth_request_set_state(struct auth_request *request,
+ enum auth_request_state state);
+
void auth_request_ref(struct auth_request *request);
void auth_request_unref(struct auth_request **request);
/* we're kind of kludging here to avoid "auth_" prefix in the struct fields */
#undef DEF
+#undef DEF_NOPREFIX
#undef DEFLIST
#define DEF(type, name) \
{ type, "auth_"#name, offsetof(struct auth_settings, name), NULL }
+#define DEF_NOPREFIX(type, name) \
+ { type, #name, offsetof(struct auth_settings, name), NULL }
#define DEFLIST(field, name, defines) \
{ SET_DEFLIST, name, offsetof(struct auth_settings, field), defines }
DEFLIST(passdbs, "passdb", &auth_passdb_setting_parser_info),
DEFLIST(userdbs, "userdb", &auth_userdb_setting_parser_info),
+ DEF_NOPREFIX(SET_BOOL, verbose_proctitle),
+
SETTING_DEFINE_LIST_END
};
.worker_max_count = 30,
.passdbs = ARRAY_INIT,
- .userdbs = ARRAY_INIT
+ .userdbs = ARRAY_INIT,
+
+ .verbose_proctitle = FALSE
};
const struct setting_parser_info auth_setting_parser_info = {
ARRAY_DEFINE(passdbs, struct auth_passdb_settings *);
ARRAY_DEFINE(userdbs, struct auth_userdb_settings *);
+ bool verbose_proctitle;
+
/* generated: */
char username_chars_map[256];
char username_translation_map[256];
#include "sql-api.h"
#include "module-dir.h"
#include "randgen.h"
+#include "process-title.h"
#include "settings-parser.h"
#include "master-service.h"
#include "master-service-settings.h"
static struct mechanisms_register *mech_reg;
static ARRAY_DEFINE(listen_fd_types, enum auth_socket_type);
+void auth_refresh_proctitle(void)
+{
+ if (!global_auth_settings->verbose_proctitle)
+ return;
+
+ process_title_set(t_strdup_printf(
+ "[%u wait, %u passdb, %u userdb]",
+ auth_request_state_count[AUTH_REQUEST_STATE_NEW] +
+ auth_request_state_count[AUTH_REQUEST_STATE_MECH_CONTINUE] +
+ auth_request_state_count[AUTH_REQUEST_STATE_FINISHED],
+ auth_request_state_count[AUTH_REQUEST_STATE_PASSDB],
+ auth_request_state_count[AUTH_REQUEST_STATE_USERDB]));
+}
+
static const char *const *read_global_settings(void)
{
struct master_service_settings_output set_output;
/* caching is handled only by the main auth process */
passdb_cache_init(global_auth_settings);
}
+ auth_refresh_proctitle();
}
static void main_deinit(void)
auth_request->private_callback.userdb = ctx->old_callback;
auth_request->context = ctx->old_context;
- auth_request->state = AUTH_REQUEST_STATE_USERDB;
+ auth_request_set_state(auth_request, AUTH_REQUEST_STATE_USERDB);
switch (result) {
case PASSDB_RESULT_OK:
ctx->callback = callback;
i_assert(auth_request->state == AUTH_REQUEST_STATE_USERDB);
- auth_request->state = AUTH_REQUEST_STATE_MECH_CONTINUE;
+ auth_request_set_state(auth_request,
+ AUTH_REQUEST_STATE_MECH_CONTINUE);
auth_request->context = ctx;
auth_request_lookup_credentials(auth_request, "",