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:
Diffstat (limited to 'winsup/cygwin/pwdgrp.h')
-rw-r--r--winsup/cygwin/pwdgrp.h256
1 files changed, 39 insertions, 217 deletions
diff --git a/winsup/cygwin/pwdgrp.h b/winsup/cygwin/pwdgrp.h
index dfeef5680..fe3c3f2a1 100644
--- a/winsup/cygwin/pwdgrp.h
+++ b/winsup/cygwin/pwdgrp.h
@@ -1,6 +1,6 @@
/* pwdgrp.h
- Copyright 2001, 2002, 2003, 2014 Red Hat inc.
+ Copyright 2001, 2002, 2003 Red Hat inc.
Stuff common to pwd and grp handling.
@@ -10,84 +10,42 @@ This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
-#pragma once
-
-#include "sync.h"
-#include "ldap.h"
-#include "miscfuncs.h"
-
/* These functions are needed to allow searching and walking through
the passwd and group lists */
-extern struct passwd *internal_getpwsid (cygpsid &, cyg_ldap * = NULL);
-extern struct passwd *internal_getpwsid_from_db (cygpsid &sid);
-extern struct passwd *internal_getpwnam (const char *, cyg_ldap * = NULL);
-extern struct passwd *internal_getpwuid (uid_t, cyg_ldap * = NULL);
-extern struct group *internal_getgrsid (cygpsid &, cyg_ldap * = NULL);
-extern struct group *internal_getgrsid_from_db (cygpsid &sid);
-extern struct group *internal_getgrgid (gid_t, cyg_ldap * = NULL);
-extern struct group *internal_getgrnam (const char *, cyg_ldap * = NULL);
-
-extern int internal_getgroups (int, gid_t *, cyg_ldap *);
-
-/* These functions are called from mkpasswd/mkgroup via cygwin_internal. */
-void *setpwent_filtered (int enums, PCWSTR enum_tdoms);
-void *getpwent_filtered (void *gr);
-void endpwent_filtered (void *gr);
-void *setgrent_filtered (int enums, PCWSTR enum_tdoms);
-void *getgrent_filtered (void *gr);
-void endgrent_filtered (void *gr);
-
-enum fetch_user_arg_type_t {
- SID_arg,
- NAME_arg,
- ID_arg
-};
-
-struct fetch_user_arg_t
-{
- fetch_user_arg_type_t type;
- union {
- cygpsid *sid;
- const char *name;
- uint32_t id;
- };
- /* Only used in fetch_account_from_file/line. */
- size_t len;
-};
-
-struct pg_pwd
-{
- struct passwd p;
- cygsid sid;
- size_t len;
-};
-
-struct pg_grp
-{
- struct group g;
- cygsid sid;
- size_t len;
-};
+extern struct passwd *internal_getpwsid (cygpsid &);
+extern struct passwd *internal_getpwnam (const char *, bool = FALSE);
+extern struct passwd *internal_getpwuid (uid_t, bool = FALSE);
+extern struct group *internal_getgrsid (cygpsid &);
+extern struct group *internal_getgrgid (gid_t gid, bool = FALSE);
+extern struct group *internal_getgrnam (const char *, bool = FALSE);
+extern struct group *internal_getgrent (int);
+int internal_getgroups (int, gid_t *, cygpsid * = NULL);
+#include "sync.h"
+#include "cygtls.h"
class pwdgrp
{
- friend class pg_ent;
- friend class pw_ent;
- friend class gr_ent;
-
unsigned pwdgrp_buf_elem_size;
- void *pwdgrp_buf;
+ union
+ {
+ passwd **passwd_buf;
+ group **group_buf;
+ void **pwdgrp_buf;
+ };
+ void (pwdgrp::*read) ();
bool (pwdgrp::*parse) ();
- UNICODE_STRING path;
- OBJECT_ATTRIBUTES attr;
- LARGE_INTEGER last_modified;
- char *lptr;
- ULONG curr_lines;
- ULONG max_lines;
+ int etc_ix;
+ UNICODE_STRING upath;
+ PWCHAR path;
+ char *buf, *lptr;
+ int max_lines;
+ bool initialized;
static muto pglock;
bool parse_passwd ();
bool parse_group ();
+ void read_passwd ();
+ void read_group ();
char *add_line (char *);
char *raw_ptr () const {return lptr;}
char *next_str (char);
@@ -106,157 +64,21 @@ class pwdgrp
i = (int) x;
return res;
}
- void *add_account_post_fetch (char *line, bool lock);
- void *add_account_from_file (cygpsid &sid);
- void *add_account_from_file (const char *name);
- void *add_account_from_file (uint32_t id);
- void *add_account_from_windows (cygpsid &sid, cyg_ldap *pldap = NULL);
- void *add_account_from_windows (const char *name, cyg_ldap *pldap = NULL);
- void *add_account_from_windows (uint32_t id, cyg_ldap *pldap = NULL);
- void *add_account_from_cygserver (cygpsid &sid);
- void *add_account_from_cygserver (const char *name);
- void *add_account_from_cygserver (uint32_t id);
- char *fetch_account_from_line (fetch_user_arg_t &arg, const char *line);
- char *fetch_account_from_file (fetch_user_arg_t &arg);
- char *fetch_account_from_windows (fetch_user_arg_t &arg,
- cyg_ldap *pldap = NULL);
- char *fetch_account_from_cygserver (fetch_user_arg_t &arg);
-
-public:
- ULONG cached_users () const { return curr_lines; }
- ULONG cached_groups () const { return curr_lines; }
- POBJECT_ATTRIBUTES file_attr () { return &attr; }
- bool check_file ();
-
- void init_pwd ();
- bool is_passwd () const { return pwdgrp_buf_elem_size == sizeof (pg_pwd); }
- pg_pwd *passwd () const { return (pg_pwd *) pwdgrp_buf; };
- struct passwd *add_user_from_cygserver (cygpsid &sid)
- { return (struct passwd *) add_account_from_cygserver (sid); }
- struct passwd *add_user_from_cygserver (const char *name)
- { return (struct passwd *) add_account_from_cygserver (name); }
- struct passwd *add_user_from_cygserver (uint32_t id)
- { return (struct passwd *) add_account_from_cygserver (id); }
- struct passwd *add_user_from_file (cygpsid &sid)
- { return (struct passwd *) add_account_from_file (sid); }
- struct passwd *add_user_from_file (const char *name)
- { return (struct passwd *) add_account_from_file (name); }
- struct passwd *add_user_from_file (uint32_t id)
- { return (struct passwd *) add_account_from_file (id); }
- struct passwd *add_user_from_windows (cygpsid &sid, cyg_ldap *pldap = NULL)
- { return (struct passwd *) add_account_from_windows (sid, pldap); }
- struct passwd *add_user_from_windows (const char *name,
- cyg_ldap* pldap = NULL)
- { return (struct passwd *) add_account_from_windows (name, pldap); }
- struct passwd *add_user_from_windows (uint32_t id, cyg_ldap *pldap = NULL)
- { return (struct passwd *) add_account_from_windows (id, pldap); }
- struct passwd *find_user (cygpsid &sid);
- struct passwd *find_user (const char *name);
- struct passwd *find_user (uid_t uid);
-
- void init_grp ();
- bool is_group () const { return pwdgrp_buf_elem_size == sizeof (pg_grp); }
- pg_grp *group () const { return (pg_grp *) pwdgrp_buf; };
- struct group *add_group_from_cygserver (cygpsid &sid)
- { return (struct group *) add_account_from_cygserver (sid); }
- struct group *add_group_from_cygserver (const char *name)
- { return (struct group *) add_account_from_cygserver (name); }
- struct group *add_group_from_cygserver (uint32_t id)
- { return (struct group *) add_account_from_cygserver (id); }
- struct group *add_group_from_file (cygpsid &sid)
- { return (struct group *) add_account_from_file (sid); }
- struct group *add_group_from_file (const char *name)
- { return (struct group *) add_account_from_file (name); }
- struct group *add_group_from_file (uint32_t id)
- { return (struct group *) add_account_from_file (id); }
- struct group *add_group_from_windows (cygpsid &sid, cyg_ldap *pldap = NULL)
- { return (struct group *) add_account_from_windows (sid, pldap); }
- struct group *add_group_from_windows (const char *name,
- cyg_ldap *pldap = NULL)
- { return (struct group *) add_account_from_windows (name, pldap); }
- struct group *add_group_from_windows (uint32_t id, cyg_ldap *pldap = NULL)
- { return (struct group *) add_account_from_windows (id, pldap); }
- struct group *find_group (cygpsid &sid);
- struct group *find_group (const char *name);
- struct group *find_group (gid_t gid);
-};
-
-class pg_ent
-{
-protected:
- pwdgrp pg;
- bool group;
- pg_pwd pwd;
- pg_grp grp;
- NT_readline rl;
- cyg_ldap cldap;
- PCHAR buf;
- ULONG cnt;
- ULONG max;
- ULONG_PTR resume;
- int enums; /* ENUM_xxx values defined in sys/cygwin.h. */
- PCWSTR enum_tdoms;
- bool from_files;
- bool from_db;
- enum {
- rewound = 0,
- from_cache,
- from_file,
- from_builtin,
- from_local,
- from_sam,
- from_ad,
- finished
- } state;
-
- void clear_cache ();
- inline bool nss_db_enum_caches () const { return !!(enums & ENUM_CACHE); }
- inline bool nss_db_enum_files () const { return !!(enums & ENUM_FILES); }
- inline bool nss_db_enum_builtin () const { return !!(enums & ENUM_BUILTIN); }
- inline bool nss_db_enum_local () const { return !!(enums & ENUM_LOCAL); }
- inline bool nss_db_enum_primary () const { return !!(enums & ENUM_PRIMARY); }
- inline bool nss_db_enum_tdom (PWCHAR domain)
- {
- if (enums & ENUM_TDOMS_ALL)
- return true;
- if (!(enums & ENUM_TDOMS) || !enum_tdoms || !domain)
- return false;
- for (PCWSTR td = enum_tdoms; td && *td; td = wcschr (td, L'\0'))
- if (!wcscasecmp (td, domain))
- return true;
- return false;
- }
- virtual void *enumerate_caches () = 0;
- virtual void *enumerate_file ();
- virtual void *enumerate_builtin ();
- virtual void *enumerate_local () = 0;
- virtual void *enumerate_sam ();
- virtual void *enumerate_ad ();
public:
- void setent (bool _group, int _enums = 0, PCWSTR _enum_tdoms = NULL);
- void *getent ();
- void endent (bool _group);
-};
+ int curr_lines;
-class pw_ent : public pg_ent
-{
- void *enumerate_caches ();
- void *enumerate_local ();
-public:
- inline void setpwent (int _enums = 0, PCWSTR _enum_tdoms = NULL)
- { setent (false, _enums, _enum_tdoms); }
- struct passwd *getpwent ();
- inline void endpwent () { endent (false); }
-};
+ void load (const wchar_t *);
+ inline void refresh (bool check)
+ {
+ if (!check && initialized)
+ return;
+ if (pglock.acquire () == 1 &&
+ (!initialized || (check && etc::file_changed (etc_ix))))
+ (this->*read) ();
+ pglock.release ();
+ }
-class gr_ent : public pg_ent
-{
- void *enumerate_caches ();
- void *enumerate_local ();
-public:
- inline void setgrent (int _enums = 0, PCWSTR _enum_tdoms = NULL)
- { setent (true, _enums, _enum_tdoms); }
- struct group *getgrent ();
- inline void endgrent () { endent (true); }
+ pwdgrp (passwd *&pbuf);
+ pwdgrp (group *&gbuf);
};