diff options
author | Christopher Faylor <me@cgf.cx> | 2003-01-20 02:57:54 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2003-01-20 02:57:54 +0000 |
commit | 7905c4f158c479c3d08e112c55f91be38aa70dae (patch) | |
tree | 9fcc54ea43fa128e60ecf3b52373ed25f77b382b /winsup/cygwin/pwdgrp.h | |
parent | 6f2480fbf706f944d20f8db3f17733ee8978987e (diff) | |
download | newlib-7905c4f158c479c3d08e112c55f91be38aa70dae.zip newlib-7905c4f158c479c3d08e112c55f91be38aa70dae.tar.gz newlib-7905c4f158c479c3d08e112c55f91be38aa70dae.tar.bz2 |
* 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.h | 122 |
1 files changed, 35 insertions, 87 deletions
diff --git a/winsup/cygwin/pwdgrp.h b/winsup/cygwin/pwdgrp.h index 7f7434b..07a618c 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); } }; |