#include <unistd.h>
#include <fcntl.h>
+#include <tzplatform_config.h>
+
#include "config.h"
#include "tlm-seat.h"
return G_SOURCE_REMOVE;
}
+gboolean
+_find_user_session(const gchar *username)
+{
+ if (!username) return FALSE;
+
+ uid_t uid = tlm_user_get_uid (username);
+ if (uid == -1) return FALSE;
+
+ const gchar *run_path = tzplatform_getenv(TZ_SYS_RUN);
+ const gchar *sub_path = "/systemd/users/";
+ size_t len = strlen(run_path) + strlen(sub_path) + 6;
+
+ gboolean result = FALSE;
+ gchar *filename = malloc(len);
+
+ if (filename) {
+ g_snprintf(filename, len, "%s%s%d", run_path, sub_path, uid);
+ DBG ("find user runtime dir: %s", filename);
+ if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
+ WARN("Session was not ended yet");
+ result = TRUE;
+ }
+
+ free(filename);
+ }
+
+ return result;
+
+}
+
+gboolean
+_register_delayed_session(TlmSeat *seat,
+ const gchar *service,
+ const gchar *username,
+ const gchar *password,
+ GHashTable *environment,
+ guint timeout_sec)
+{
+ WARN ("relogins spinning too fast, delay...");
+ DelayClosure *delay_closure = g_slice_new0 (DelayClosure);
+ if (!delay_closure) {
+ CRITICAL("g_slice_new0 memory allication failure");
+ return FALSE;
+ }
+ delay_closure->seat = g_object_ref (seat);
+ delay_closure->service = g_strdup (service);
+ delay_closure->username = g_strdup (username);
+ delay_closure->password = g_strdup (password);
+ if (environment)
+ delay_closure->environment = g_hash_table_ref (environment);
+ g_timeout_add_seconds (timeout_sec, _delayed_session, delay_closure);
+
+ return TRUE;
+
+}
+
gboolean
tlm_seat_create_session (TlmSeat *seat,
const gchar *service,
return FALSE;
}
+ // Check same user's session was existed, or not.
+ // If TRUE, run _delayed_session. (try again after 3sec)
+ if (_find_user_session(username)) {
+ return _register_delayed_session(seat, service, username, password, environment, 3);
+ }
+
// Prevent short-delay relogin.
// If the login delay is too fast (<1s), run _delayed_session()
if (g_get_monotonic_time () - priv->prev_time < 1000000) {
priv->prev_time = g_get_monotonic_time ();
priv->prev_count++;
if (priv->prev_count > 3) {
- WARN ("relogins spinning too fast, delay...");
- DelayClosure *delay_closure = g_slice_new0 (DelayClosure);
- if (!delay_closure) {
- CRITICAL("g_slice_new0 memory allication failure");
- return FALSE;
- }
- delay_closure->seat = g_object_ref (seat);
- delay_closure->service = g_strdup (service);
- delay_closure->username = g_strdup (username);
- delay_closure->password = g_strdup (password);
- if (environment)
- delay_closure->environment = g_hash_table_ref (environment);
- g_timeout_add_seconds (10, _delayed_session, delay_closure);
- return TRUE;
+ return _register_delayed_session(seat, service, username, password, environment, 10);
}
} else {
priv->prev_time = g_get_monotonic_time ();