aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin/pwdgrp.h
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2003-01-21 06:58:11 +0000
committerChristopher Faylor <me@cgf.cx>2003-01-21 06:58:11 +0000
commit57394495e21e9ffe7da9251b26e9cac14d59f708 (patch)
treeebdce6564a0ae6803550dccd5dc555f1e2546b6a /winsup/cygwin/pwdgrp.h
parent984864e9ce2d7bf3f6a6148f2fe4180da8dc5dc9 (diff)
downloadnewlib-57394495e21e9ffe7da9251b26e9cac14d59f708.zip
newlib-57394495e21e9ffe7da9251b26e9cac14d59f708.tar.gz
newlib-57394495e21e9ffe7da9251b26e9cac14d59f708.tar.bz2
* grp.cc: Call gr.refresh() rather than doing isunitialized tests throughout.
(gr): Use constructor (sigh). (pwdgrp::parse_group): Rename from parse_grp. (pwdgrp::read_group): Rename from read_etc_group. Just call gr.load with a single argument. * passwd.cc: Call pr.refresh() rather than doing isunitialized tests throughout. (pr): Use constructor (sigh). (pwdgrp::parse_passwd): Rename from "parse_pwd". (pwdgrp::read_passwd): Rename from read_etc_passwd. Just call pr.load with a single argument. * pwdgrp.h (pwdgrp_state): Eliminate. (pwdgrp): Reflect above renamings. (pwdgrp::etc_ix): Rename from pwd_ix. (pwdgrp::read): New element. (pwdgrp::lock): New element. (pwdgrp::refresh): New function. (pwdgrp::load): Eliminate variations which take buffer arguments. (pwdgrp::pwdgrp): New constructors. Initialize mutex here. * uinfo.cc (pwdgrp::load): Accommodate pwd_ix -> etc_ix renaming. (pwdgrp::load): Set initialized state to true rather than setting state to loaded.
Diffstat (limited to 'winsup/cygwin/pwdgrp.h')
-rw-r--r--winsup/cygwin/pwdgrp.h72
1 files changed, 37 insertions, 35 deletions
diff --git a/winsup/cygwin/pwdgrp.h b/winsup/cygwin/pwdgrp.h
index 566c401..eb0a974 100644
--- a/winsup/cygwin/pwdgrp.h
+++ b/winsup/cygwin/pwdgrp.h
@@ -21,59 +21,61 @@ extern struct __group32 *internal_getgrnam (const char *, bool = FALSE);
extern struct __group32 *internal_getgrent (int);
int internal_getgroups (int, __gid32_t *, cygsid * = NULL);
-enum pwdgrp_state {
- uninitialized = 0,
- initializing,
- loaded
-};
-
class pwdgrp
{
- pwdgrp_state state;
- int pwd_ix;
- path_conv pc;
- char *buf;
- int max_lines;
+ unsigned pwdgrp_buf_elem_size;
union
{
passwd **passwd_buf;
__group32 **group_buf;
void **pwdgrp_buf;
};
- unsigned pwdgrp_buf_elem_size;
+ void (pwdgrp::*read) ();
bool (pwdgrp::*parse) (char *);
+ int etc_ix;
+ path_conv pc;
+ char *buf;
+ int max_lines;
+ bool initialized;
+ CRITICAL_SECTION lock;
char *gets (char*&);
- bool parse_pwd (char *);
- bool parse_grp (char *);
public:
int curr_lines;
+ bool parse_passwd (char *);
+ bool parse_group (char *);
+ void read_passwd ();
+ void read_group ();
+
void add_line (char *);
- bool isinitializing ()
+ void refresh (bool check = true)
{
- if (state <= initializing)
- state = initializing;
- else if (etc::file_changed (pwd_ix))
- state = initializing;
- return state == initializing;
+ if (initialized && check && etc::file_changed (etc_ix))
+ initialized = false;
+ if (!initialized)
+ {
+ EnterCriticalSection (&lock);
+ if (!initialized)
+ (this->*read) ();
+ LeaveCriticalSection (&lock);
+ }
}
- bool isuninitialized () const { return state == uninitialized; }
bool load (const char *);
- bool load (const char *posix_fname, passwd *&buf)
- {
- passwd_buf = &buf;
- pwdgrp_buf_elem_size = sizeof (*buf);
- parse = &pwdgrp::parse_pwd;
- return load (posix_fname);
- }
- bool load (const char *posix_fname, __group32 *&buf)
- {
- group_buf = &buf;
- pwdgrp_buf_elem_size = sizeof (*buf);
- parse = &pwdgrp::parse_grp;
- return load (posix_fname);
- }
+ pwdgrp (passwd *&pbuf) :
+ pwdgrp_buf_elem_size (sizeof (*pbuf)), passwd_buf (&pbuf)
+ {
+ read = &pwdgrp::read_passwd;
+ parse = &pwdgrp::parse_passwd;
+ InitializeCriticalSection (&lock);
+ }
+ pwdgrp (__group32 *&gbuf) :
+ pwdgrp_buf_elem_size (sizeof (*gbuf)), group_buf (&gbuf)
+ {
+ read = &pwdgrp::read_group;
+ parse = &pwdgrp::parse_group;
+ InitializeCriticalSection (&lock);
+ }
};