Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2003-01-20 05:57:54 +0300
committerChristopher Faylor <me@cgf.cx>2003-01-20 05:57:54 +0300
commit7905c4f158c479c3d08e112c55f91be38aa70dae (patch)
tree9fcc54ea43fa128e60ecf3b52373ed25f77b382b /winsup/cygwin/pwdgrp.h
parent6f2480fbf706f944d20f8db3f17733ee8978987e (diff)
* pwdgrp.h (etc): Move to path.h.
(pwdgrp::max_lines): New field. (pwdgrp::curr_lines): New field. (pwdgrp::pwdgrp_buf): Ditto. (pwdgrp_buf_elem_size): Ditto. (pwdgrp_parse): Ditto. (pwdgrp::gets): Just declare here. (pwdgrp::load): Ditto. Just take one argument. (pwdgrp::load): Define overloaded function accepting passwd buf. (pwdgrp::load): Define overloaded function accepting group buf. * grp.cc: Use pwdgrp elements rather than standalone static variables throughout. (curr_lines): Eliminate. (max_lines): Ditto. (add_grp_line): Ditto. (parse_grp): Define as returning boolean. Accept void * arg and line count. Coerce first argument into __group32 buf reference. Increment curr_line as appropriate. (read_etc_group): Pass pwdgrp buffer to gr.load. * passwd.cc: Use pwdgrp elements rather than standalone static variables throughout. (curr_lines): Eliminate. (max_lines): Ditto. (add_grp_line): Ditto. (parse_passwd): Define as returning boolean. Accept void * arg and line count. Coerce first argument into passwd buf reference. Increment curr_line as appropriate. (read_etc_group): Pass pwdgrp buffer to pr.load. * path.cc (etc::fn): Extend buffer size to allow index by 1 rather than zero. (etc::last_modified): Ditto. (etc::change_possible): Ditto. Renamed from sawchange. Change to signed char since elements are now tri-state. (etc::init): Assume "handle" is 1 based rather than 0. (etc::test_file_change): New function. Sets change_possible based on file date comparison. (etc::dir_changed): Check file states immediately after changed_h is initialized to avoid a race. (etc::file_changed): Use test_file_change to detect if file needs to be updated. * path.h (etc): Move class here from pwdgrp.h. * uinfo.cc: Move etc:: functions to path.cc. Move pwdgrp functions here. (pwdgrp::gets): Eliminate buf checks. Just check eptr and set lptr. (pwdgrp::add_line): New function. (pwdgrp::load): Call generic add_line function which will call correct parser.
Diffstat (limited to 'winsup/cygwin/pwdgrp.h')
-rw-r--r--winsup/cygwin/pwdgrp.h122
1 files changed, 35 insertions, 87 deletions
diff --git a/winsup/cygwin/pwdgrp.h b/winsup/cygwin/pwdgrp.h
index 7f7434b80..07a618ce1 100644
--- a/winsup/cygwin/pwdgrp.h
+++ b/winsup/cygwin/pwdgrp.h
@@ -27,106 +27,54 @@ enum pwdgrp_state {
loaded
};
-#define MAX_ETC_FILES 2
-class etc
-{
- static int curr_ix;
- static bool sawchange[MAX_ETC_FILES];
- static const char *fn[MAX_ETC_FILES];
- static FILETIME last_modified[MAX_ETC_FILES];
- static bool dir_changed (int);
- static int init (int, const char *);
- static bool file_changed (int);
- static void set_last_modified (int, FILETIME&);
- friend class pwdgrp;
-};
-
class pwdgrp
{
pwdgrp_state state;
int pwd_ix;
path_conv pc;
char *buf;
- char *lptr, *eptr;
-
- char *gets ()
+ int max_lines;
+ union
{
- if (!buf)
- lptr = NULL;
- else if (!eptr)
- lptr = NULL;
- else
- {
- lptr = eptr;
- eptr = strchr (lptr, '\n');
- if (eptr)
- {
- if (eptr > lptr && *(eptr - 1) == '\r')
- *(eptr - 1) = 0;
- *eptr++ = '\0';
- }
- }
- return lptr;
- }
+ passwd **passwd_buf;
+ __group32 **group_buf;
+ void **pwdgrp_buf;
+ };
+ unsigned pwdgrp_buf_elem_size;
+ bool (pwdgrp::*parse) (char *);
+
+ char *gets (char*&);
+ bool parse_pwd (char *);
+ bool parse_grp (char *);
public:
+ int curr_lines;
+
+ void add_line (char *);
bool isinitializing ()
- {
- if (state <= initializing)
- state = initializing;
- else if (etc::file_changed (pwd_ix - 1))
- state = initializing;
- return state == initializing;
- }
+ {
+ if (state <= initializing)
+ state = initializing;
+ else if (etc::file_changed (pwd_ix))
+ state = initializing;
+ return state == initializing;
+ }
void operator = (pwdgrp_state nstate) { state = nstate; }
bool isuninitialized () const { return state == uninitialized; }
- bool load (const char *posix_fname, void (* add_line) (char *))
+ bool load (const char *);
+ bool load (const char *posix_fname, passwd *&buf)
{
- if (buf)
- free (buf);
- buf = lptr = eptr = NULL;
-
- pc.check (posix_fname);
- pwd_ix = etc::init (pwd_ix - 1, pc) + 1;
-
- paranoid_printf ("%s", posix_fname);
-
- bool res;
- if (pc.error || !pc.exists () || !pc.isdisk () || pc.isdir ())
- res = false;
- else
- {
- HANDLE fh = CreateFile (pc, GENERIC_READ, wincap.shared (), NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
- if (fh == INVALID_HANDLE_VALUE)
- res = false;
- else
- {
- DWORD size = GetFileSize (fh, NULL), read_bytes;
- buf = (char *) malloc (size + 1);
- if (!ReadFile (fh, buf, size, &read_bytes, NULL))
- {
- if (buf)
- free (buf);
- buf = NULL;
- fh = NULL;
- return false;
- }
- buf[read_bytes] = '\0';
- eptr = buf;
- CloseHandle (fh);
- FILETIME ft;
- if (GetFileTime (fh, NULL, NULL, &ft))
- etc::set_last_modified (pwd_ix - 1, ft);
- char *line;
- while ((line = gets()) != NULL)
- add_line (line);
- res = true;
- }
- }
-
- state = loaded;
- return res;
+ 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);
}
};