dbus_req->password, dbus_req->environment);
break;
case TLM_DBUS_REQUEST_TYPE_LOGOUT_USER:
- ret = tlm_seat_terminate_session (seat);
+ ret = tlm_seat_terminate_session (seat, FALSE);
break;
case TLM_DBUS_REQUEST_TYPE_SWITCH_USER:
// Refuse request if the request's username is same to
"session-terminated",
G_CALLBACK (_session_terminated_cb),
manager);
- if (!tlm_seat_terminate_session ((TlmSeat *) value)) {
+ if (!tlm_seat_terminate_session ((TlmSeat *) value, TRUE)) {
g_hash_table_remove (manager->priv->seats, key);
g_hash_table_iter_init (&iter, manager->priv->seats);
} else {
TlmDbusObserver *dbus_observer; /* dbus server accessed only by user who has
active session */
TlmDbusObserver *prev_dbus_observer;
+ gboolean manager_stop;
};
typedef struct _DelayClosure
DBG ("Error : %d:%s", error->code, error->message);
g_signal_emit (self, signals[SIG_SESSION_ERROR], 0, error->code);
- if (error->code == TLM_ERROR_PAM_AUTH_FAILURE ||
+ if ((error->code == TLM_ERROR_PAM_AUTH_FAILURE ||
error->code == TLM_ERROR_SESSION_CREATION_FAILURE ||
- error->code == TLM_ERROR_SESSION_TERMINATION_FAILURE) {
+ error->code == TLM_ERROR_SESSION_TERMINATION_FAILURE)
+ && (!(self->priv->manager_stop))) {
DBG ("Destroy the session in case of creation/termination failure");
_close_active_session (self);
g_clear_object (&self->priv->dbus_observer);
priv->id = priv->path = priv->default_user = NULL;
priv->dbus_observer = priv->prev_dbus_observer = NULL;
priv->default_active = FALSE;
+ priv->manager_stop = FALSE;
seat->priv = priv;
}
priv->next_password = g_strdup (password);
priv->next_environment = g_hash_table_ref (environment);
- return tlm_seat_terminate_session (seat);
+ return tlm_seat_terminate_session (seat, FALSE);
}
static gchar *
}
gboolean
-tlm_seat_terminate_session (TlmSeat *seat)
+tlm_seat_terminate_session (TlmSeat *seat, gboolean stop)
{
g_return_val_if_fail (seat && TLM_IS_SEAT(seat), FALSE);
g_return_val_if_fail (seat->priv, FALSE);
seat->priv->default_user);
}
+ if (!(seat->priv->manager_stop))
+ seat->priv->manager_stop = stop;
+
if (!seat->priv->session ||
!tlm_session_remote_terminate (seat->priv->session)) {
WARN ("No active session to terminate");
GHashTable *environment);
gboolean
-tlm_seat_terminate_session (TlmSeat *seat);
+tlm_seat_terminate_session (TlmSeat *seat, gboolean stop);
G_END_DECLS
}
DBG ("Terminate child session process");
- if (kill (priv->cpid, SIGHUP) < 0)
- {
- gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
- WARN ("kill(%u, SIGHUP): %s", priv->cpid, strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
- }
- priv->last_sig = SIGHUP;
- priv->timer_id = g_timeout_add_seconds (
- tlm_config_get_uint (priv->config, TLM_CONFIG_GENERAL,
- TLM_CONFIG_GENERAL_TERMINATE_TIMEOUT, 3),
- _terminate_timeout, self);
+ if (!(priv->timer_id)) {
+ if (kill (priv->cpid, SIGHUP) < 0)
+ {
+ gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
+ WARN ("kill(%u, SIGHUP): %s", priv->cpid, strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
+ }
+ priv->last_sig = SIGHUP;
+ priv->timer_id = g_timeout_add_seconds (
+ tlm_config_get_uint (priv->config, TLM_CONFIG_GENERAL,
+ TLM_CONFIG_GENERAL_TERMINATE_TIMEOUT, 3),
+ _terminate_timeout, self);
+ } else
+ WARN ("child session process is already terminating. timer_id=%d", priv->timer_id);
+
return TRUE;
}