Re: [Nautilus-list] Cache getpwuid results
- From: Maciej Stachowiak <mjs noisehavoc org>
- To: Alex Larsson <alexl redhat com>
- Cc: nautilus-list lists eazel com
- Subject: Re: [Nautilus-list] Cache getpwuid results
- Date: Tue, 14 Aug 2001 19:49:44 -0700
On 14Aug2001 09:13PM (-0400), Alex Larsson wrote:
> Here is a patch that caches the getpwuid results in
> nautilus_file_denies_access_permission() which seems to be called for
> every file in a scanned directory.
>
Hi Alex,
Maybe it would be useful to split the getpwuid caching code into one
or more separate functions in case anything else ever needs it.
Regards,
Maciej
> / Alex
>
> Index: nautilus-file.c
> ===================================================================
> RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file.c,v
> retrieving revision 1.249.2.4
> diff -u -p -r1.249.2.4 nautilus-file.c
> --- nautilus-file.c 2001/07/31 21:59:28 1.249.2.4
> +++ nautilus-file.c 2001/08/15 01:11:30
> @@ -60,7 +60,11 @@
> #include <pwd.h>
> #include <stdlib.h>
> #include <unistd.h>
> +#include <sys/time.h>
>
> +/* Time in seconds to cache getpwuid results */
> +#define GETPWUID_CACHE_TIME (5*60)
> +
> #undef NAUTILUS_FILE_DEBUG_REF
>
> #ifdef NAUTILUS_FILE_DEBUG_REF
> @@ -582,10 +586,13 @@ nautilus_file_denies_access_permission (
> GnomeVFSFilePermissions group_permission,
> GnomeVFSFilePermissions other_permission)
> {
> - uid_t user_id;
> - struct passwd *password_info;
> - gid_t supplementary_groups[NGROUPS_MAX];
> - int num_supplementary_groups;
> + struct timeval now;
> + static struct timeval cached_time = {0,0};
> + static struct passwd *password_info;
> + static uid_t user_id;
> + static gid_t primary_group;
> + static gid_t supplementary_groups[NGROUPS_MAX];
> + static int num_supplementary_groups;
> int i;
>
> g_assert (NAUTILUS_IS_FILE (file));
> @@ -602,9 +609,23 @@ nautilus_file_denies_access_permission (
> return FALSE;
> }
>
> - /* Check the user. */
> - user_id = geteuid ();
> + /* This is called often. Cache the user information for five minutes */
> +
> + gettimeofday (&now, NULL);
> +
> + if (cached_time.tv_sec == 0 ||
> + (now.tv_sec - cached_time.tv_sec) > GETPWUID_CACHE_TIME) {
> + cached_time = now;
> + user_id = geteuid ();
> + /* No need to free result of getpwuid. */
> + password_info = getpwuid (user_id);
> + if (password_info)
> + primary_group = password_info->pw_gid;
> + num_supplementary_groups = getgroups (NGROUPS_MAX, supplementary_groups);
> + }
>
> + /* Check the user. */
> +
> /* Root is not forbidden to do anything. */
> if (user_id == 0) {
> return FALSE;
> @@ -619,8 +640,6 @@ nautilus_file_denies_access_permission (
> return (file->details->info->permissions & owner_permission) == 0;
> }
>
> - /* No need to free result of getpwuid. */
> - password_info = getpwuid (user_id);
>
> /* Group member's access is governed by the group bits. */
> /* FIXME bugzilla.eazel.com 644:
> @@ -628,11 +647,10 @@ nautilus_file_denies_access_permission (
> * there be garbage there? What will it do for non-local files?
> */
> if (password_info != NULL
> - && password_info->pw_gid == (gid_t) file->details->info->gid) {
> + && primary_group == (gid_t) file->details->info->gid) {
> return (file->details->info->permissions & group_permission) == 0;
> }
> /* Check supplementary groups */
> - num_supplementary_groups = getgroups (NGROUPS_MAX, supplementary_groups);
> for (i = 0; i < num_supplementary_groups; i++) {
> if ((gid_t) file->details->info->gid == supplementary_groups[i]) {
> return (file->details->info->permissions & group_permission) == 0;
>
>
> _______________________________________________
> Nautilus-list mailing list
> Nautilus-list lists eazel com
> http://lists.eazel.com/mailman/listinfo/nautilus-list
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]