This is the mail archive of the cygwin-patches@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: [PATCH]: Check modification time on /etc/passwd and /etc/group


Could anybody comment on that patch and if there's perhaps a
need to put some stuff in to make it thread save? Or if the
patch slows down Cygwin intolerably?

If nobody complains I will apply that patch on Monday, otherwise.

Corinna

On Tue, Jul 31, 2001 at 08:38:20PM +0200, Corinna Vinschen wrote:
> Hi,
> 
> the following is a PRELIMINARY patch which I created while waiting
> for a loooong build. It checks the modification time on /etc/passwd
> and /etc/group to reread them if neccessary.
> 
> It's preliminary since it completely ignores thread issues.
> 
> Could somebody have a look what is needed to make it thread safe?
> 
> Thanks in advance,
> Corinna
> 
> ChangeLog:
> ==========
> 
> 	* grp.cc (class grp_check): New class. Make `group_state'
> 	a member of class grp_check.
> 	(read_etc_group): Set `curr_lines' explicitely to 0.
> 	* passwd.cc (class pwd_check): New class Make `passwd_state'
> 	a member of class pwd_check.
> 	(read_etc_passwd): Set `curr_lines' explicitely to 0.
> 
> Index: grp.cc
> ===================================================================
> RCS file: /cvs/src/src/winsup/cygwin/grp.cc,v
> retrieving revision 1.26
> diff -u -p -r1.26 grp.cc
> --- grp.cc	2001/07/26 19:22:24	1.26
> +++ grp.cc	2001/07/31 18:00:27
> @@ -17,6 +17,7 @@ details. */
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <errno.h>
> +#include <sys/stat.h>
>  #include "sync.h"
>  #include "sigproc.h"
>  #include "pinfo.h"
> @@ -51,7 +52,30 @@ enum grp_state {
>    emulated,
>    loaded
>  };
> -static grp_state group_state = uninitialized;
> +class grp_check {
> +  grp_state state;
> +  time_t    last_modified;
> +
> +public:
> +  grp_check () : state (uninitialized), last_modified (0L) {}
> +  operator grp_state ()
> +    {
> +      struct stat st;
> +
> +      if (!stat ("/etc/group", &st) && st.st_mtime > last_modified)
> +	{
> +	  state = uninitialized;
> +	  last_modified = st.st_mtime;
> +	}
> +      return state;
> +    }
> +  void operator = (grp_state nstate)
> +    {
> +      state = nstate;
> +    }
> +};
> +
> +static grp_check group_state;
>  
>  static int
>  parse_grp (struct group &grp, const char *line)
> @@ -153,6 +177,7 @@ read_etc_group ()
>    if (group_state != initializing)
>      {
>        group_state = initializing;
> +      curr_lines = 0;
>  
>        FILE *f = fopen (etc_group, "rt");
>  
> Index: passwd.cc
> ===================================================================
> RCS file: /cvs/src/src/winsup/cygwin/passwd.cc,v
> retrieving revision 1.27
> diff -u -p -r1.27 passwd.cc
> --- passwd.cc	2001/07/26 19:22:24	1.27
> +++ passwd.cc	2001/07/31 18:00:27
> @@ -13,6 +13,7 @@ details. */
>  #include <pwd.h>
>  #include <stdio.h>
>  #include <errno.h>
> +#include <sys/stat.h>
>  #include "cygerrno.h"
>  #include "security.h"
>  #include "fhandler.h"
> @@ -40,7 +41,31 @@ enum pwd_state {
>    emulated,
>    loaded
>  };
> -static pwd_state passwd_state = uninitialized;
> +class pwd_check {
> +  pwd_state state;
> +  time_t    last_modified;
> +
> +public:
> +  pwd_check () : state (uninitialized), last_modified (0L) {}
> +  operator pwd_state ()
> +    {
> +      struct stat st;
> +
> +      if (!stat ("/etc/passwd", &st) && st.st_mtime > last_modified)
> +	{
> +	  state = uninitialized;
> +	  last_modified = st.st_mtime;
> +	}
> +      return state;
> +    }
> +  void operator = (pwd_state nstate)
> +    {
> +      state = nstate;
> +    }
> +};
> +
> +static pwd_check passwd_state;
> +
>  
>  /* Position in the passwd cache */
>  #ifdef _MT_SAFE
> @@ -140,6 +165,7 @@ read_etc_passwd ()
>      if (passwd_state != initializing)
>        {
>  	passwd_state = initializing;
> +	curr_lines = 0;
>  
>  	FILE *f = fopen ("/etc/passwd", "rt");
>  
> -- 
> Corinna Vinschen                  Please, send mails regarding Cygwin to
> Cygwin Developer                                mailto:cygwin@cygwin.com
> Red Hat, Inc.

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Developer                                mailto:cygwin@cygwin.com
Red Hat, Inc.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]