Hello Corinna,

Don't program when you are tired, my mom used to say.
This replaces what I sent last night. The discussion
in the message is still OK.

Pierre

2002-11-29  Pierre Humblet <[EMAIL PROTECTED]>

        * pwdgrp.h (pwdgrp_check::pwdgrp_state): Replace by 
        pwdgrp_check::isinitializing ().
        (pwdgrp_check::isinitializing): Create.
        (pwdgrp_check::operator =): Delete.
        ((pwdgrp_check::set_last_modified): Set state to loaded.
        * passwd.cc (read_etc_passwd): Replace "passwd_state <= " by 
        passwd_state::isinitializing (). Remove update of passwd_state. 
        (internal_getpwuid): Replace "passwd_state <= " by 
        passwd_state::isinitializing ().
        (internal_getpwnam): Ditto.
        (getpwent): Ditto.
        (getpass): Ditto.
        * grp.cc (read_etc_group): Replace "group_state <= " by 
        group_state::isinitializing (). Remove update of group_state.   
        (internal_getgrgid): Replace "group_state <= " by 
        group_state::isinitializing ().
        (getgrent32): Ditto.
        (internal_getgrent): Ditto.
--- pwdgrp.h.new        2002-11-28 23:17:54.000000000 -0500
+++ pwdgrp.h    2002-11-29 10:41:56.000000000 -0500
@@ -34,25 +34,28 @@ class pwdgrp_check {

 public:
   pwdgrp_check () : state (uninitialized) {}
-  operator pwdgrp_state ()
+  BOOL isinitializing ()
     {
-      if (state != uninitialized && file_w32[0] && cygheap->etc_changed ())
-       {
-         HANDLE h;
-         WIN32_FIND_DATA data;
-
-         if ((h = FindFirstFile (file_w32, &data)) != INVALID_HANDLE_VALUE)
+      if (state <= initializing)
+       state = initializing;
+      else if (cygheap->etc_changed ())
+        {
+         if (!file_w32[0])
+           state = initializing;
+         else
            {
-             if (CompareFileTime (&data.ftLastWriteTime, &last_modified) > 0)
-               state = initializing;
-             FindClose (h);
+             HANDLE h;
+             WIN32_FIND_DATA data;
+
+             if ((h = FindFirstFile (file_w32, &data)) != INVALID_HANDLE_VALUE)
+               {
+                 if (CompareFileTime (&data.ftLastWriteTime, &last_modified) > 0)
+                   state = initializing;
+                 FindClose (h);
+               }
            }
        }
-      return state;
-    }
-  void operator = (pwdgrp_state nstate)
-    {
-      state = nstate;
+      return state == initializing;
     }
   BOOL isuninitialized () const { return state == uninitialized; }
   void set_last_modified (HANDLE fh, const char *name)
@@ -60,6 +63,7 @@ public:
       if (!file_w32[0])
        strcpy (file_w32, name);
       GetFileTime (fh, NULL, NULL, &last_modified);
+      state = loaded;
     }
 };

--- passwd.cc.new       2002-11-28 23:26:28.000000000 -0500
+++ passwd.cc   2002-11-29 10:42:36.000000000 -0500
@@ -140,7 +140,7 @@ read_etc_passwd ()
   passwd_lock here (cygwin_finished_initializing);

   /* if we got blocked by the mutex, then etc_passwd may have been processed */
-  if (passwd_state <= initializing)
+  if (passwd_state.isinitializing ())
     {
       curr_lines = 0;
       if (pr.open ("/etc/passwd"))
@@ -153,7 +153,6 @@ read_etc_passwd ()
          pr.close ();
          debug_printf ("Read /etc/passwd, %d lines", curr_lines);
        }
-      passwd_state = loaded;

       static char linebuf[1024];
       char strbuf[128] = "";
@@ -216,7 +215,7 @@ struct passwd *
 internal_getpwuid (__uid32_t uid, BOOL check)
 {
   if (passwd_state.isuninitialized ()
-      || (check && passwd_state  <= initializing))
+      || (check && passwd_state.isinitializing ()))
     read_etc_passwd ();

   for (int i = 0; i < curr_lines; i++)
@@ -229,7 +228,7 @@ struct passwd *
 internal_getpwnam (const char *name, BOOL check)
 {
   if (passwd_state.isuninitialized ()
-      || (check && passwd_state  <= initializing))
+      || (check && passwd_state.isinitializing ()))
     read_etc_passwd ();

   for (int i = 0; i < curr_lines; i++)
@@ -351,7 +350,7 @@ getpwnam_r (const char *nam, struct pass
 extern "C" struct passwd *
 getpwent (void)
 {
-  if (passwd_state  <= initializing)
+  if (passwd_state.isinitializing ())
     read_etc_passwd ();

   if (pw_pos < curr_lines)
@@ -394,7 +393,7 @@ getpass (const char * prompt)
 #endif
   struct termios ti, newti;

-  if (passwd_state  <= initializing)
+  if (passwd_state.isinitializing ())
     read_etc_passwd ();

   cygheap_fdget fhstdin (0);
--- grp.cc.new  2002-11-28 23:30:04.000000000 -0500
+++ grp.cc      2002-11-29 10:43:12.000000000 -0500
@@ -135,7 +135,7 @@ read_etc_group ()
   group_lock here (cygwin_finished_initializing);

   /* if we got blocked by the mutex, then etc_group may have been processed */
-  if (group_state <= initializing)
+  if (group_state.isinitializing ())
     {
       for (int i = 0; i < curr_lines; i++)
        if ((group_buf + i)->gr_mem != &null_ptr)
@@ -152,7 +152,6 @@ read_etc_group ()
          gr.close ();
          debug_printf ("Read /etc/group, %d lines", curr_lines);
        }
-      group_state = loaded;

       /* Complete /etc/group in memory if needed */
       if (!internal_getgrgid (myself->gid))
@@ -199,7 +198,7 @@ internal_getgrgid (__gid32_t gid, BOOL c
   struct __group32 * default_grp = NULL;

   if (group_state.isuninitialized ()
-      || (check && group_state  <= initializing))
+      || (check && group_state.isinitializing ()))
     read_etc_group ();

   for (int i = 0; i < curr_lines; i++)
@@ -216,7 +215,7 @@ struct __group32 *
 internal_getgrnam (const char *name, BOOL check)
 {
   if (group_state.isuninitialized ()
-      || (check && group_state  <= initializing))
+      || (check && group_state.isinitializing ()))
     read_etc_group ();

   for (int i = 0; i < curr_lines; i++)
@@ -281,7 +280,7 @@ endgrent ()
 extern "C" struct __group32 *
 getgrent32 ()
 {
-  if (group_state  <= initializing)
+  if (group_state.isinitializing ())
     read_etc_group ();

   if (grp_pos < curr_lines)

Reply via email to