diff options
author | Christopher Faylor <me@cgf.cx> | 2003-01-21 06:58:11 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2003-01-21 06:58:11 +0000 |
commit | 57394495e21e9ffe7da9251b26e9cac14d59f708 (patch) | |
tree | ebdce6564a0ae6803550dccd5dc555f1e2546b6a /winsup/cygwin/pwdgrp.h | |
parent | 984864e9ce2d7bf3f6a6148f2fe4180da8dc5dc9 (diff) | |
download | newlib-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.h | 72 |
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); + } }; |