--- pwdgrp.h.new 2002-11-28 23:17:54.000000000 -0500 +++ pwdgrp.h 2002-11-30 16:40:34.000000000 -0500 @@ -34,21 +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; + return state == initializing; } void operator = (pwdgrp_state nstate) { --- passwd.cc.new 2002-11-28 23:26:28.000000000 -0500 +++ passwd.cc 2002-11-30 23:26:42.000000000 -0500 @@ -60,16 +60,12 @@ grab_string (char **p) } /* same, for ints */ -static int +static unsigned int grab_int (char **p) { char *src = *p; - int val = strtol (src, NULL, 10); - while (*src && *src != ':') - src++; - if (*src == ':') - src++; - *p = src; + unsigned int val = strtoul (src, p, 10); + *p = (*p == src || **p != ':') ? almost_null : *p + 1; return val; } @@ -82,9 +78,9 @@ parse_pwd (struct passwd &res, char *buf res.pw_name = grab_string (&buf); res.pw_passwd = grab_string (&buf); res.pw_uid = grab_int (&buf); + res.pw_gid = grab_int (&buf); if (!*buf) return 0; - res.pw_gid = grab_int (&buf); res.pw_comment = 0; res.pw_gecos = grab_string (&buf); res.pw_dir = grab_string (&buf); @@ -140,7 +136,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")) @@ -216,7 +212,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 +225,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 +347,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 +390,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-30 16:48:24.000000000 -0500 @@ -59,9 +59,8 @@ parse_grp (struct __group32 &grp, char * if (dp) { *dp++ = '\0'; - grp.gr_gid = strtol (dp, NULL, 10); - dp = strchr (dp, ':'); - if (dp) + grp.gr_gid = strtoul (line = dp, &dp, 10); + if (dp != line && *dp == ':') { grp.gr_mem = &null_ptr; if (*++dp) @@ -135,7 +134,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) @@ -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)