* 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.
This commit is contained in:
Christopher Faylor
2003-01-21 06:58:11 +00:00
parent 984864e9ce
commit 57394495e2
5 changed files with 141 additions and 177 deletions

View File

@@ -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);
}
};