File tree Expand file tree Collapse file tree 2 files changed +67
-0
lines changed
Expand file tree Collapse file tree 2 files changed +67
-0
lines changed Original file line number Diff line number Diff line change @@ -421,6 +421,71 @@ emit_stop_complete (GsmSystemd *manager,
421421 }
422422}
423423
424+ gboolean
425+ gsm_systemd_is_last_session_for_user (GsmSystemd * manager )
426+ {
427+ char * * sessions = NULL ;
428+ char * session = NULL ;
429+ gboolean is_last_session ;
430+ int ret , i ;
431+
432+ ret = sd_pid_get_session (getpid (), & session );
433+
434+ if (ret != 0 ) {
435+ return FALSE;
436+ }
437+
438+ ret = sd_uid_get_sessions (getuid (), FALSE, & sessions );
439+
440+ if (ret <= 0 ) {
441+ free (session );
442+ return FALSE;
443+ }
444+
445+ is_last_session = TRUE;
446+ for (i = 0 ; sessions [i ]; i ++ ) {
447+ char * state = NULL ;
448+ char * type = NULL ;
449+
450+ if (g_strcmp0 (sessions [i ], session ) == 0 )
451+ continue ;
452+
453+ ret = sd_session_get_state (sessions [i ], & state );
454+
455+ if (ret != 0 )
456+ continue ;
457+
458+ if (g_strcmp0 (state , "closing" ) == 0 ) {
459+ free (state );
460+ continue ;
461+ }
462+ free (state );
463+
464+ ret = sd_session_get_type (sessions [i ], & type );
465+
466+ if (ret != 0 )
467+ continue ;
468+
469+ if (g_strcmp0 (type , "x11" ) != 0 &&
470+ g_strcmp0 (type , "wayland" ) != 0 ) {
471+ free (type );
472+ continue ;
473+ }
474+ free (type );
475+
476+ is_last_session = FALSE;
477+
478+ break ;
479+ }
480+
481+ for (i = 0 ; sessions [i ]; i ++ )
482+ free (sessions [i ]);
483+ free (sessions );
484+ free (session );
485+
486+ return is_last_session ;
487+ }
488+
424489void
425490gsm_systemd_attempt_restart (GsmSystemd * manager )
426491{
Original file line number Diff line number Diff line change @@ -76,6 +76,8 @@ gboolean gsm_systemd_can_hibernate (GsmSystemd *manager);
7676
7777gboolean gsm_systemd_can_suspend (GsmSystemd * manager );
7878
79+ gboolean gsm_systemd_is_last_session_for_user (GsmSystemd * manager );
80+
7981void gsm_systemd_attempt_stop (GsmSystemd * manager );
8082
8183void gsm_systemd_attempt_restart (GsmSystemd * manager );
You can’t perform that action at this time.
0 commit comments