diff options
author | Christopher Faylor <me@cgf.cx> | 2003-01-17 08:18:30 +0300 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2003-01-17 08:18:30 +0300 |
commit | 14ea50290a1f9f3954cc562ab877c1950ab8a2bb (patch) | |
tree | 2d4965c5bb977b8e1b41f5125aa4b24ba7c7ba38 /winsup/cygwin/pwdgrp.h | |
parent | d4d80d8c65042953c8bd5514c44c8bb2d31dd227 (diff) |
* grp.cc (read_etc_group): On NT, add a line for gid = -1. Change name
"unknown" to "mkgroup".
(internal_getgrgid): Do not return default in nontsec case.
(internal_getgroups): Add argument srchsid and look for it in groups if not
NULL.
* passwd.cc (read_etc_passwd): On NT, add a line for uid = -1. Use same
default uid for Win95 and NT. Call cygheap_user::ontherange to initialize
HOME.
* cygheap.cc (init_cygheap::etc_changed): Move to uinfo.cc.
* cygheap.h (init_cygheap::etc_changed_h): Remove.
(init_cygheap::etc_changed): Ditto.
* grp.cc (group_state): Remove. Use gr instead throughout.
(gr): Define as class pwdgrp.
(read_etc_group): Remove gr definition. Remove calls to set_last_modified and
close. Pass add_grp to gr.load to load file.
* passwd.cc (passwd_state): Remove. Use pr instead, throughout.
(pr): Define as class pwdgrp.
(read_etc_passwd): Remove pr definition. Remove calls to set_last_modified and
close. Pass add_pwd_line to pr.load to load file.
* pwdgrp.h (etc): New helper class for pwdgrp.
(pwdgrp): Combine pwdgrp_check and pwdgrp_read into one class. Remove file_w32
and last_modified fields.
(pwdgrp::set_last_modified): Remove.
(pwdgrp::isinitializing): Remove FindFirstFile stuff. Move to
etc::file_changed.
(pwdgrp::load): Rename from 'open'. Call etc::init to initialize etc scanning.
Close file handle after reading buffer into memory. Parse buffer by calling
second argument.
(pwdgrp::gets): Reorganize slightly to rely on eptr starting at beginning of
buffer. Free buffer when memory exhausted.
(pwdgrp::close): Remove.
* uinfo.cc (etc::dir_changed): New function.
(etc::init): Ditto.
(etc::file_changed): Ditto.
(etc::set_last_modified): Ditto.
Diffstat (limited to 'winsup/cygwin/pwdgrp.h')
-rw-r--r-- | winsup/cygwin/pwdgrp.h | 166 |
1 files changed, 81 insertions, 85 deletions
diff --git a/winsup/cygwin/pwdgrp.h b/winsup/cygwin/pwdgrp.h index 6be1b32f7..c0466b446 100644 --- a/winsup/cygwin/pwdgrp.h +++ b/winsup/cygwin/pwdgrp.h @@ -19,7 +19,7 @@ extern struct __group32 *internal_getgrsid (cygsid &); extern struct __group32 *internal_getgrgid (__gid32_t gid, BOOL = FALSE); extern struct __group32 *internal_getgrnam (const char *, BOOL = FALSE); extern struct __group32 *internal_getgrent (int); -int internal_getgroups (int, __gid32_t *); +int internal_getgroups (int, __gid32_t *, cygsid * = NULL); enum pwdgrp_state { uninitialized = 0, @@ -27,111 +27,107 @@ enum pwdgrp_state { loaded }; -class pwdgrp_check { - pwdgrp_state state; - FILETIME last_modified; - char file_w32[MAX_PATH]; +#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 () + { + 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; + } public: - pwdgrp_check () : state (uninitialized) {} + pwdgrp () : state (uninitialized) {} BOOL isinitializing () { if (state <= initializing) state = initializing; - else if (cygheap->etc_changed ()) - { - if (!file_w32[0]) - state = initializing; - else - { - HANDLE h; - WIN32_FIND_DATA data; - - if ((h = FindFirstFile (file_w32, &data)) != INVALID_HANDLE_VALUE) - { - if (CompareFileTime (&data.ftLastWriteTime, &last_modified) > 0) - state = initializing; - FindClose (h); - } - } - } + else if (etc::file_changed (pwd_ix - 1)) + state = initializing; return state == initializing; } - void operator = (pwdgrp_state nstate) - { - state = nstate; - } + void operator = (pwdgrp_state nstate) { state = nstate; } BOOL isuninitialized () const { return state == uninitialized; } - void set_last_modified (HANDLE fh, const char *name) - { - if (!file_w32[0]) - strcpy (file_w32, name); - GetFileTime (fh, NULL, NULL, &last_modified); - } -}; - -class pwdgrp_read { - path_conv pc; - HANDLE fh; - char *buf; - char *lptr, *eptr; -public: - bool open (const char *posix_fname) + bool load (const char *posix_fname, void (* add_line) (char *)) { if (buf) free (buf); buf = lptr = eptr = NULL; pc.check (posix_fname); - if (pc.error || !pc.exists () || !pc.isdisk () || pc.isdir ()) - return false; + pwd_ix = etc::init (pwd_ix - 1, pc) + 1; + + paranoid_printf ("%s", posix_fname); - fh = CreateFile (pc, GENERIC_READ, wincap.shared (), NULL, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, 0); - if (fh != INVALID_HANDLE_VALUE) + bool res; + if (pc.error || !pc.exists () || !pc.isdisk () || pc.isdir ()) + res = false; + else { - DWORD size = GetFileSize (fh, NULL), read_bytes; - buf = (char *) malloc (size + 1); - if (!ReadFile (fh, buf, size, &read_bytes, NULL)) + HANDLE fh = CreateFile (pc, GENERIC_READ, wincap.shared (), NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (fh == INVALID_HANDLE_VALUE) + res = false; + else { - if (buf) - free (buf); - buf = NULL; + 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); - fh = NULL; - return false; + 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; } - buf[read_bytes] = '\0'; - return true; - } - return false; - } - char *gets () - { - if (!buf) - return NULL; - if (!lptr) - lptr = buf; - else if (!eptr) - return lptr = NULL; - else - lptr = eptr; - eptr = strchr (lptr, '\n'); - if (eptr) - { - if (eptr > lptr && *(eptr - 1) == '\r') - *(eptr - 1) = 0; - *eptr++ = '\0'; } - return lptr; - } - inline HANDLE get_fhandle () { return fh; } - inline const char *get_fname () { return pc; } - void close () - { - if (fh) - CloseHandle (fh); - fh = NULL; + + state = loaded; + return res; } }; |