From d3e1069434bfff5e0c6236cbdec20db2a7d68d2c Mon Sep 17 00:00:00 2001 From: William Jon McCann Date: Wed, 23 Jan 2008 23:12:02 -0500 Subject: be a little smarter about how we compute the number of users --- src/ck-manager.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 2 deletions(-) diff --git a/src/ck-manager.c b/src/ck-manager.c index b8b4f1b..5eac98f 100644 --- a/src/ck-manager.c +++ b/src/ck-manager.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -1109,6 +1110,97 @@ out: return res; } +static char * +get_user_name (uid_t uid) +{ + struct passwd *pwent; + char *name; + + name = NULL; + + pwent = getpwuid (uid); + + if (pwent != NULL) { + name = g_strdup (pwent->pw_name); + } + + return name; +} + +static gboolean +session_is_real_user (CkSession *session, + char **userp) +{ + int uid; + char *username; + char *session_type; + gboolean ret; + + ret = FALSE; + session_type = NULL; + username = NULL; + + session_type = NULL; + + g_object_get (session, + "unix-user", &uid, + "session-type", session_type, + NULL); + + username = get_user_name (uid); + + /* filter out GDM user */ + if (username != NULL && strcmp (username, "gdm") == 0) { + ret = FALSE; + goto out; + } + + if (userp != NULL) { + *userp = g_strdup (username); + } + + ret = TRUE; + + out: + g_free (username); + g_free (session_type); + + return ret; +} + +static void +collect_users (const char *ssid, + CkSession *session, + GHashTable *hash) +{ + char *username; + + if (session_is_real_user (session, &username)) { + if (username != NULL) { + g_hash_table_insert (hash, username, NULL); + } + } +} + +static guint +get_system_num_users (CkManager *manager) +{ + guint num_users; + GHashTable *hash; + + hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + g_hash_table_foreach (manager->priv->sessions, (GHFunc)collect_users, hash); + + num_users = g_hash_table_size (hash); + + g_hash_table_destroy (hash); + + g_debug ("found %u unique users", num_users); + + return num_users; +} + /* Example: dbus-send --system --dest=org.freedesktop.ConsoleKit \ @@ -1127,7 +1219,7 @@ ck_manager_restart (CkManager *manager, ret = FALSE; - if (g_hash_table_size (manager->priv->sessions) > 1) { + if (get_system_num_users (manager) > 1) { action = "org.freedesktop.consolekit.system.restart-multiple-users"; } else { action = "org.freedesktop.consolekit.system.restart"; @@ -1179,7 +1271,7 @@ ck_manager_stop (CkManager *manager, ret = TRUE; - if (g_hash_table_size (manager->priv->sessions) > 1) { + if (get_system_num_users (manager) > 1) { action = "org.freedesktop.consolekit.system.stop-multiple-users"; } else { action = "org.freedesktop.consolekit.system.stop"; -- cgit