changeset 19679:74f8b5be8f59

last-login: Added last_login_precision setting
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Fri, 29 Jan 2016 16:23:57 +0200
parents 338dd0ac1375
children 55831f9d2e66
files src/plugins/last-login/last-login-plugin.c
diffstat 1 files changed, 20 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/last-login/last-login-plugin.c	Fri Jan 29 16:07:35 2016 +0200
+++ b/src/plugins/last-login/last-login-plugin.c	Fri Jan 29 16:23:57 2016 +0200
@@ -63,7 +63,7 @@
 	struct dict *dict;
 	struct dict_settings set;
 	struct dict_transaction_context *trans;
-	const char *dict_value, *key_name, *error;
+	const char *dict_value, *key_name, *precision, *error;
 
 	if (user->autocreated) {
 		/* we want to handle only logged in users,
@@ -101,8 +101,26 @@
 	}
 	key_name = t_strconcat(DICT_PATH_SHARED, key_name, NULL);
 
+	precision = mail_user_plugin_getenv(user, "last_login_precision");
+
 	trans = dict_transaction_begin(dict);
-	dict_set(trans, key_name, dec2str(ioloop_time));
+	if (precision == NULL || strcmp(precision, "s") == 0)
+		dict_set(trans, key_name, dec2str(ioloop_time));
+	else if (strcmp(precision, "ms") == 0) {
+		dict_set(trans, key_name, t_strdup_printf(
+			"%ld%03u", (long)ioloop_timeval.tv_sec,
+			(unsigned int)(ioloop_timeval.tv_usec/1000)));
+	} else if (strcmp(precision, "us") == 0) {
+		dict_set(trans, key_name, t_strdup_printf(
+			"%ld%06u", (long)ioloop_timeval.tv_sec,
+			(unsigned int)ioloop_timeval.tv_usec));
+	} else if (strcmp(precision, "ns") == 0) {
+		dict_set(trans, key_name, t_strdup_printf(
+			"%ld%06u000", (long)ioloop_timeval.tv_sec,
+			(unsigned int)ioloop_timeval.tv_usec));
+	} else {
+		i_error("last_login_dict: Invalid last_login_precision '%s'", precision);
+	}
 	dict_transaction_commit_async(&trans, last_login_dict_commit, user);
 }