/** * Gets the home directory for the given user. * * @param uid the uid * @param homedir string to append home directory to * @returns #TRUE if user existed and we appended their homedir */ dbus_bool_t _dbus_homedir_from_uid (dbus_uid_t uid, DBusString *homedir) { DBusUserDatabase *db; const DBusUserInfo *info; /* 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) { _dbus_user_database_unlock_system (); return FALSE; } if (!_dbus_user_database_get_uid (db, uid, &info, NULL)) { _dbus_user_database_unlock_system (); return FALSE; } if (!_dbus_string_append (homedir, info->homedir)) { _dbus_user_database_unlock_system (); return FALSE; } _dbus_user_database_unlock_system (); return TRUE; }
/** * Gets the home directory for the given user. * * @param uid the uid * @param homedir string to append home directory to * @returns #TRUE if user existed and we appended their homedir */ dbus_bool_t _dbus_homedir_from_uid (dbus_uid_t uid, DBusString *homedir) { DBusUserDatabase *db; const DBusUserInfo *info; _dbus_user_database_lock_system (); db = _dbus_user_database_get_system (); if (db == NULL) { _dbus_user_database_unlock_system (); return FALSE; } if (!_dbus_user_database_get_uid (db, uid, &info, NULL)) { _dbus_user_database_unlock_system (); return FALSE; } if (!_dbus_string_append (homedir, info->homedir)) { _dbus_user_database_unlock_system (); return FALSE; } _dbus_user_database_unlock_system (); return TRUE; }
/** * Gets all groups corresponding to the given UID. Returns #FALSE * if no memory, or user isn't known, but always initializes * group_ids to a NULL array. * * @param uid the UID * @param group_ids return location for array of group IDs * @param n_group_ids return location for length of returned array * @returns #TRUE if the UID existed and we got some credentials */ dbus_bool_t _dbus_groups_from_uid (dbus_uid_t uid, dbus_gid_t **group_ids, int *n_group_ids) { DBusUserDatabase *db; const DBusUserInfo *info; *group_ids = NULL; *n_group_ids = 0; /* 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) { _dbus_user_database_unlock_system (); return FALSE; } if (!_dbus_user_database_get_uid (db, uid, &info, NULL)) { _dbus_user_database_unlock_system (); return FALSE; } _dbus_assert (info->uid == uid); if (info->n_group_ids > 0) { *group_ids = dbus_new (dbus_gid_t, info->n_group_ids); if (*group_ids == NULL) { _dbus_user_database_unlock_system (); return FALSE; } *n_group_ids = info->n_group_ids; memcpy (*group_ids, info->group_ids, info->n_group_ids * sizeof (dbus_gid_t)); } _dbus_user_database_unlock_system (); return TRUE; }
static dbus_bool_t init_system_db (void) { _dbus_assert (database_locked); if (system_db == NULL) { DBusError error; const DBusUserInfo *info; system_db = _dbus_user_database_new (); if (system_db == NULL) return FALSE; dbus_error_init (&error); if (!_dbus_user_database_get_uid (system_db, _dbus_getuid (), &info, &error)) { _dbus_user_database_unref (system_db); system_db = NULL; if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) { dbus_error_free (&error); return FALSE; } else { /* This really should not happen. */ _dbus_warn ("Could not get password database information for UID of current process: %s\n", error.message); dbus_error_free (&error); return FALSE; } } if (!_dbus_string_init (&process_username)) { _dbus_user_database_unref (system_db); system_db = NULL; return FALSE; } if (!_dbus_string_init (&process_homedir)) { _dbus_string_free (&process_username); _dbus_user_database_unref (system_db); system_db = NULL; return FALSE; } if (!_dbus_string_append (&process_username, info->username) || !_dbus_string_append (&process_homedir, info->homedir) || !_dbus_register_shutdown_func (shutdown_system_db, NULL)) { _dbus_string_free (&process_username); _dbus_string_free (&process_homedir); _dbus_user_database_unref (system_db); system_db = NULL; return FALSE; } } return TRUE; }