X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dbus%2Fdbus-userdb-util.c;h=62495d831fa287b0e044e379506bbd5c440770bd;hb=bb8dd7fec5389db4df9b5e8863974149e8a650dc;hp=8679f74032da25f9f7a2e3312299bac8b49df9cf;hpb=3ac6915e3cc214cb8115a38667a5b66dfbeef35f;p=platform%2Fupstream%2Fdbus.git diff --git a/dbus/dbus-userdb-util.c b/dbus/dbus-userdb-util.c index 8679f74..62495d8 100644 --- a/dbus/dbus-userdb-util.c +++ b/dbus/dbus-userdb-util.c @@ -21,6 +21,7 @@ * */ #include +#include #define DBUS_USERDB_INCLUDES_PRIVATE 1 #include "dbus-userdb.h" #include "dbus-test.h" @@ -28,6 +29,10 @@ #include "dbus-protocol.h" #include +#if HAVE_SYSTEMD +#include +#endif + /** * @addtogroup DBusInternalsUtils * @{ @@ -47,7 +52,29 @@ _dbus_is_console_user (dbus_uid_t uid, DBusUserDatabase *db; const DBusUserInfo *info; - dbus_bool_t result = FALSE; + dbus_bool_t result = FALSE; + +#ifdef HAVE_SYSTEMD + /* check if we have logind */ + if (access ("/run/systemd/seats/", F_OK) >= 0) + { + int r; + + /* Check whether this user is logged in on at least one physical + seat */ + r = sd_uid_get_seats (uid, 0, NULL); + if (r < 0) + { + dbus_set_error (error, _dbus_error_from_errno (-r), + "Failed to determine seats of user \"" DBUS_UID_FORMAT "\": %s", + uid, + _dbus_strerror (-r)); + return FALSE; + } + + return (r > 0); + } +#endif #ifdef HAVE_CONSOLE_OWNER_FILE @@ -77,7 +104,11 @@ _dbus_is_console_user (dbus_uid_t uid, #endif /* HAVE_CONSOLE_OWNER_FILE */ - _dbus_user_database_lock_system (); + if (!_dbus_user_database_lock_system ()) + { + _DBUS_SET_OOM (error); + return FALSE; + } db = _dbus_user_database_get_system (); if (db == NULL) @@ -131,7 +162,10 @@ _dbus_get_group_id (const DBusString *groupname, { DBusUserDatabase *db; const DBusGroupInfo *info; - _dbus_user_database_lock_system (); + + /* FIXME: this can't distinguish ENOMEM from other errors */ + if (!_dbus_user_database_lock_system ()) + return FALSE; db = _dbus_user_database_get_system (); if (db == NULL) @@ -168,7 +202,10 @@ _dbus_get_user_id_and_primary_group (const DBusString *username, { DBusUserDatabase *db; const DBusUserInfo *info; - _dbus_user_database_lock_system (); + + /* FIXME: this can't distinguish ENOMEM from other errors */ + if (!_dbus_user_database_lock_system ()) + return FALSE; db = _dbus_user_database_get_system (); if (db == NULL) @@ -226,7 +263,7 @@ _dbus_user_database_lookup_group (DBusUserDatabase *db, #ifdef DBUS_ENABLE_USERDB_CACHE if (gid != DBUS_GID_UNSET) - info = _dbus_hash_table_lookup_ulong (db->groups, gid); + info = _dbus_hash_table_lookup_uintptr (db->groups, gid); else info = _dbus_hash_table_lookup_string (db->groups_by_name, _dbus_string_get_const_data (groupname)); @@ -278,7 +315,7 @@ _dbus_user_database_lookup_group (DBusUserDatabase *db, gid = DBUS_GID_UNSET; groupname = NULL; - if (!_dbus_hash_table_insert_ulong (db->groups, info->gid, info)) + if (!_dbus_hash_table_insert_uintptr (db->groups, info->gid, info)) { dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); _dbus_group_info_free_allocated (info); @@ -290,7 +327,7 @@ _dbus_user_database_lookup_group (DBusUserDatabase *db, info->groupname, info)) { - _dbus_hash_table_remove_ulong (db->groups, info->gid); + _dbus_hash_table_remove_uintptr (db->groups, info->gid); dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); return NULL; } @@ -361,7 +398,9 @@ _dbus_groups_from_uid (dbus_uid_t uid, *group_ids = NULL; *n_group_ids = 0; - _dbus_user_database_lock_system (); + /* FIXME: this can't distinguish ENOMEM from other errors */ + if (!_dbus_user_database_lock_system ()) + return FALSE; db = _dbus_user_database_get_system (); if (db == NULL) @@ -398,7 +437,7 @@ _dbus_groups_from_uid (dbus_uid_t uid, } /** @} */ -#ifdef DBUS_BUILD_TESTS +#ifdef DBUS_ENABLE_EMBEDDED_TESTS #include /** @@ -414,6 +453,7 @@ _dbus_userdb_test (const char *test_data_dir) dbus_uid_t uid; unsigned long *group_ids; int n_group_ids, i; + DBusError error; if (!_dbus_username_from_current_process (&username)) _dbus_assert_not_reached ("didn't get username"); @@ -435,9 +475,19 @@ _dbus_userdb_test (const char *test_data_dir) printf(" %ld", group_ids[i]); printf ("\n"); - + + dbus_error_init (&error); + printf ("Is Console user: %i\n", + _dbus_is_console_user (uid, &error)); + printf ("Invocation was OK: %s\n", error.message ? error.message : "yes"); + dbus_error_free (&error); + printf ("Is Console user 4711: %i\n", + _dbus_is_console_user (4711, &error)); + printf ("Invocation was OK: %s\n", error.message ? error.message : "yes"); + dbus_error_free (&error); + dbus_free (group_ids); return TRUE; } -#endif /* DBUS_BUILD_TESTS */ +#endif /* DBUS_ENABLE_EMBEDDED_TESTS */