summaryrefslogtreecommitdiffstats
path: root/winsup
diff options
context:
space:
mode:
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog47
-rw-r--r--winsup/cygwin/cygheap.h14
-rw-r--r--winsup/cygwin/cygserver.h1
-rw-r--r--winsup/cygwin/cygserver_pwdgrp.h73
-rw-r--r--winsup/cygwin/cygtls.h4
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc3
-rw-r--r--winsup/cygwin/grp.cc128
-rw-r--r--winsup/cygwin/include/sys/cygwin.h4
-rw-r--r--winsup/cygwin/passwd.cc130
-rw-r--r--winsup/cygwin/pwdgrp.h20
-rw-r--r--winsup/cygwin/tlsoffsets.h216
-rw-r--r--winsup/cygwin/tlsoffsets64.h216
-rw-r--r--winsup/cygwin/uinfo.cc115
13 files changed, 593 insertions, 378 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 65c7328e7..6f71531b4 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,52 @@
2014-03-12 Corinna Vinschen <corinna@vinschen.de>
+ * cygheap.h (enum cygheap_pwdgrp::cache_t): Remove.
+ (cygheap_pwdgrp::caching): Convert to bool.
+ (cygheap_pwdgrp::pwd_cache): Add cygserver member.
+ (cygheap_pwdgrp::grp_cache): Ditto.
+ (cygheap_pwdgrp::nss_db_caching): Drop.
+ (cygheap_pwdgrp::nss_db_full_caching): Drop.
+ (cygheap_pwdgrp::nss_cygserver_caching): New method.
+ (cygheap_pwdgrp::nss_disable_cygserver_caching): New method.
+ * cygserver.h (client_request::request_code_t): Add
+ CYGSERVER_REQUEST_PWDGRP.
+ * cygserver_pwdgrp.h: New file.
+ * cygtls.h (struct _local_storage): Remove pwbuf and grbuf members.
+ * grp.cc (pwdgrp::prep_tls_grbuf): Drop.
+ (internal_getgrsid): Handle cygserver caching and rearrange to check
+ the caches first.
+ (internal_getgrnam): Ditto.
+ (internal_getgrgid): Ditto.
+ (gr_ent::enumerate_caches): Handle cygserver cache.
+ * passwd.cc (pwdgrp::prep_tls_pwbuf): Drop.
+ (internal_getpwsid): Handle cygserver caching and rearrange to check
+ the caches first.
+ (internal_getpwnam): Ditto.
+ (internal_getpwuid): Ditto.
+ (pw_ent::enumerate_caches): Handle cygserver cache.
+ * pwdgrp.h (pwdgrp::add_account_from_cygserver): New method declaration.
+ (pwdgrp::fetch_account_from_cygserver): New method declaration.
+ (pwdgrp::prep_tls_pwbuf): Drop declaration.
+ (pwdgrp::prep_tls_grbuf): Drop declaration.
+ (pwdgrp::add_user_from_cygserver): New inline methods.
+ (pwdgrp::add_group_from_cygserver): New inline methods.
+ * tlsoffsets.h: Regenerate.
+ * tlsoffsets64.h: Regenerate.
+ * uinfo.cc (internal_getlogin): Call internal_getgroups if cygserver
+ caching is not available.
+ (cygheap_pwdgrp::init): Initialize pwd_cache.cygserver and
+ grp_cache.cygserver. Set caching to true.
+ (cygheap_pwdgrp::nss_init_line): Drop db_cache handling entirely.
+ (pwdgrp::add_account_from_windows): Drop no caching handling.
+ (client_request_pwdgrp::client_request_pwdgrp): New method.
+ (pwdgrp::fetch_account_from_cygserver): New method.
+ (pwdgrp::add_account_from_cygserver): New method.
+
+ * fhandler_disk_file.cc (fhandler_base::fstat_helper): Fix formatting.
+ * include/sys/cygwin.h: Ditto.
+
+2014-03-12 Corinna Vinschen <corinna@vinschen.de>
+
* uinfo.cc (pwdgrp::fetch_account_from_windows): Avoid crash on
non-domain member machines if an unknown SID comes in.
diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h
index 66603c0c7..c4b2ed9ad 100644
--- a/winsup/cygwin/cygheap.h
+++ b/winsup/cygwin/cygheap.h
@@ -400,17 +400,12 @@ class cygheap_pwdgrp
NSS_PRIMARY,
NSS_ALWAYS
};
- enum cache_t {
- NSS_NO_CACHING = 0,
- NSS_CACHING,
- NSS_FULL_CACHING
- };
bool nss_inited;
int pwd_src;
int grp_src;
pfx_t prefix;
WCHAR separator[2];
- cache_t caching;
+ bool caching;
int enums;
PWCHAR enum_tdoms;
@@ -419,10 +414,12 @@ class cygheap_pwdgrp
public:
struct {
+ pwdgrp cygserver;
pwdgrp file;
pwdgrp win;
} pwd_cache;
struct {
+ pwdgrp cygserver;
pwdgrp file;
pwdgrp win;
} grp_cache;
@@ -438,9 +435,8 @@ public:
inline bool nss_prefix_primary () const { return prefix == NSS_PRIMARY; }
inline bool nss_prefix_always () const { return prefix == NSS_ALWAYS; }
inline PCWSTR nss_separator () const { return separator; }
- inline bool nss_db_caching () const { return caching != NSS_NO_CACHING; }
- inline bool nss_db_full_caching () const
- { return caching == NSS_FULL_CACHING; }
+ inline bool nss_cygserver_caching () const { return caching; }
+ inline void nss_disable_cygserver_caching () { caching = false; }
inline int nss_db_enums () const { return enums; }
inline PCWSTR nss_db_enum_tdoms () const { return enum_tdoms; }
};
diff --git a/winsup/cygwin/cygserver.h b/winsup/cygwin/cygserver.h
index 8bcc271f3..1313d3c1e 100644
--- a/winsup/cygwin/cygserver.h
+++ b/winsup/cygwin/cygserver.h
@@ -52,6 +52,7 @@ protected:
CYGSERVER_REQUEST_SEM,
CYGSERVER_REQUEST_SHM,
CYGSERVER_REQUEST_SETPWD,
+ CYGSERVER_REQUEST_PWDGRP,
CYGSERVER_REQUEST_LAST
} request_code_t;
diff --git a/winsup/cygwin/cygserver_pwdgrp.h b/winsup/cygwin/cygserver_pwdgrp.h
new file mode 100644
index 000000000..52b9b42ba
--- /dev/null
+++ b/winsup/cygwin/cygserver_pwdgrp.h
@@ -0,0 +1,73 @@
+/* cygserver_pwdgrp.h: Request account information
+
+ Copyright 2014 Red Hat, Inc.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef __CYGSERVER_PWDGRP_H__
+#define __CYGSERVER_PWDGRP_H__
+
+#include <sys/types.h>
+#include "cygserver.h"
+
+class transport_layer_base;
+class process_cache;
+
+#ifdef __INSIDE_CYGWIN__
+#include "pwdgrp.h"
+#else
+/* Don't include pwdgrp.h, but keep this in sync. */
+enum fetch_user_arg_type_t {
+ SID_arg,
+ NAME_arg,
+ ID_arg
+};
+#endif
+
+class client_request_pwdgrp : public client_request
+{
+ friend class client_request;
+
+private:
+ union _pwdgrp_param_t
+ {
+ struct _pwdgrp_in_t
+ {
+ bool group;
+ fetch_user_arg_type_t type;
+ union
+ {
+ BYTE sid[40];
+ char name[UNLEN + 1];
+ uint32_t id;
+ } arg;
+ } in;
+
+ struct
+ {
+ char line[1024];
+ } out;
+ } _parameters;
+
+#ifndef __INSIDE_CYGWIN__
+ client_request_pwdgrp ();
+ virtual void serve (transport_layer_base *, process_cache *);
+ void pwd_serve ();
+ void grp_serve ();
+#endif
+
+public:
+
+#ifdef __INSIDE_CYGWIN__
+ client_request_pwdgrp (fetch_user_arg_t &arg, bool group);
+#endif
+
+ const char *line () const { return (msglen () > 0) ? _parameters.out.line
+ : NULL; }
+};
+
+#endif /* __CYGSERVER_PWDGRP_H__ */
diff --git a/winsup/cygwin/cygtls.h b/winsup/cygwin/cygtls.h
index fd464f4ce..b76dd2441 100644
--- a/winsup/cygwin/cygtls.h
+++ b/winsup/cygwin/cygtls.h
@@ -80,12 +80,8 @@ public:
struct _local_storage
{
/* passwd.cc */
- void *pwbuf;
char pass[_PASSWORD_LEN];
- /* grp.cc */
- void *grbuf;
-
/* dlfcn.cc */
int dl_error;
char dl_buffer[256];
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
index a44bfb8b6..b03e9c7fd 100644
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ b/winsup/cygwin/fhandler_disk_file.cc
@@ -534,8 +534,7 @@ fhandler_base::fstat_fs (struct stat *buf)
}
int __reg3
-fhandler_base::fstat_helper (struct stat *buf,
- DWORD nNumberOfLinks)
+fhandler_base::fstat_helper (struct stat *buf, DWORD nNumberOfLinks)
{
IO_STATUS_BLOCK st;
FILE_COMPRESSION_INFORMATION fci;
diff --git a/winsup/cygwin/grp.cc b/winsup/cygwin/grp.cc
index be752a100..d941c0f9b 100644
--- a/winsup/cygwin/grp.cc
+++ b/winsup/cygwin/grp.cc
@@ -68,27 +68,6 @@ pwdgrp::init_grp ()
parse = &pwdgrp::parse_group;
}
-pwdgrp *
-pwdgrp::prep_tls_grbuf ()
-{
- if (!_my_tls.locals.grbuf)
- {
- _my_tls.locals.grbuf = ccalloc_abort (HEAP_BUF, 1,
- sizeof (pwdgrp) + sizeof (pg_grp));
- pwdgrp *gr = (pwdgrp *) _my_tls.locals.grbuf;
- gr->init_grp ();
- gr->pwdgrp_buf = (void *) (gr + 1);
- gr->max_lines = 1;
- }
- pwdgrp *gr = (pwdgrp *) _my_tls.locals.grbuf;
- if (gr->curr_lines)
- {
- cfree (gr->group ()[0].g.gr_name);
- gr->curr_lines = 0;
- }
- return gr;
-}
-
struct group *
pwdgrp::find_group (cygpsid &sid)
{
@@ -122,20 +101,28 @@ internal_getgrsid (cygpsid &sid, cyg_ldap *pldap)
struct group *ret;
cygheap->pg.nss_init ();
+ /* Check caches first. */
+ if (cygheap->pg.nss_cygserver_caching ()
+ && (ret = cygheap->pg.grp_cache.cygserver.find_group (sid)))
+ return ret;
+ if (cygheap->pg.nss_grp_files ()
+ && (ret = cygheap->pg.grp_cache.file.find_group (sid)))
+ return ret;
+ if (cygheap->pg.nss_grp_db ()
+ && (ret = cygheap->pg.grp_cache.win.find_group (sid)))
+ return ret;
+ /* Ask sources afterwards. */
+ if (cygheap->pg.nss_cygserver_caching ()
+ && (ret = cygheap->pg.grp_cache.cygserver.add_group_from_cygserver (sid)))
+ return ret;
if (cygheap->pg.nss_grp_files ())
{
cygheap->pg.grp_cache.file.check_file ();
- if ((ret = cygheap->pg.grp_cache.file.find_group (sid)))
- return ret;
if ((ret = cygheap->pg.grp_cache.file.add_group_from_file (sid)))
return ret;
}
if (cygheap->pg.nss_grp_db ())
- {
- if ((ret = cygheap->pg.grp_cache.win.find_group (sid)))
- return ret;
- return cygheap->pg.grp_cache.win.add_group_from_windows (sid, pldap);
- }
+ return cygheap->pg.grp_cache.win.add_group_from_windows (sid, pldap);
return NULL;
}
@@ -153,20 +140,28 @@ internal_getgrnam (const char *name, cyg_ldap *pldap)
struct group *ret;
cygheap->pg.nss_init ();
+ /* Check caches first. */
+ if (cygheap->pg.nss_cygserver_caching ()
+ && (ret = cygheap->pg.grp_cache.cygserver.find_group (name)))
+ return ret;
+ if (cygheap->pg.nss_grp_files ()
+ && (ret = cygheap->pg.grp_cache.file.find_group (name)))
+ return ret;
+ if (cygheap->pg.nss_grp_db ()
+ && (ret = cygheap->pg.grp_cache.win.find_group (name)))
+ return ret;
+ /* Ask sources afterwards. */
+ if (cygheap->pg.nss_cygserver_caching ()
+ && (ret = cygheap->pg.grp_cache.cygserver.add_group_from_cygserver (name)))
+ return ret;
if (cygheap->pg.nss_grp_files ())
{
cygheap->pg.grp_cache.file.check_file ();
- if ((ret = cygheap->pg.grp_cache.file.find_group (name)))
- return ret;
if ((ret = cygheap->pg.grp_cache.file.add_group_from_file (name)))
return ret;
}
if (cygheap->pg.nss_grp_db ())
- {
- if ((ret = cygheap->pg.grp_cache.win.find_group (name)))
- return ret;
- return cygheap->pg.grp_cache.win.add_group_from_windows (name, pldap);
- }
+ return cygheap->pg.grp_cache.win.add_group_from_windows (name, pldap);
return NULL;
}
@@ -176,21 +171,27 @@ internal_getgrgid (gid_t gid, cyg_ldap *pldap)
struct group *ret;
cygheap->pg.nss_init ();
+ /* Check caches first. */
+ if (cygheap->pg.nss_cygserver_caching ()
+ && (ret = cygheap->pg.grp_cache.cygserver.find_group (gid)))
+ return ret;
+ if (cygheap->pg.nss_grp_files ()
+ && (ret = cygheap->pg.grp_cache.file.find_group (gid)))
+ return ret;
+ if (cygheap->pg.nss_grp_db ()
+ && (ret = cygheap->pg.grp_cache.win.find_group (gid)))
+ return ret;
+ /* Ask sources afterwards. */
+ if (cygheap->pg.nss_cygserver_caching ()
+ && (ret = cygheap->pg.grp_cache.cygserver.add_group_from_cygserver (gid)))
+ return ret;
if (cygheap->pg.nss_grp_files ())
{
cygheap->pg.grp_cache.file.check_file ();
- if ((ret = cygheap->pg.grp_cache.file.find_group (gid)))
- return ret;
if ((ret = cygheap->pg.grp_cache.file.add_group_from_file (gid)))
return ret;
}
- if (cygheap->pg.nss_grp_db ())
- {
- if ((ret = cygheap->pg.grp_cache.win.find_group (gid)))
- return ret;
- return cygheap->pg.grp_cache.win.add_group_from_windows (gid);
- }
- else if (gid == ILLEGAL_GID)
+ if (cygheap->pg.nss_grp_db () || gid == ILLEGAL_GID)
return cygheap->pg.grp_cache.win.add_group_from_windows (gid, pldap);
return NULL;
}
@@ -327,20 +328,37 @@ static gr_ent grent;
void *
gr_ent::enumerate_caches ()
{
- if (!max && from_files)
+ switch (max)
{
- pwdgrp &grf = cygheap->pg.grp_cache.file;
- grf.check_file ();
- if (cnt < grf.cached_groups ())
- return &grf.group ()[cnt++].g;
+ case 0:
+ if (cygheap->pg.nss_cygserver_caching ())
+ {
+ pwdgrp &grc = cygheap->pg.grp_cache.cygserver;
+ if (cnt < grc.cached_groups ())
+ return &grc.group ()[cnt++].g;
+ }
cnt = 0;
max = 1;
- }
- if (from_db && cygheap->pg.nss_db_caching ())
- {
- pwdgrp &grw = cygheap->pg.grp_cache.win;
- if (cnt < grw.cached_groups ())
- return &grw.group ()[cnt++].g;
+ /*FALLTHRU*/
+ case 1:
+ if (from_files)
+ {
+ pwdgrp &grf = cygheap->pg.grp_cache.file;
+ grf.check_file ();
+ if (cnt < grf.cached_groups ())
+ return &grf.group ()[cnt++].g;
+ }
+ cnt = 0;
+ max = 1;
+ /*FALLTHRU*/
+ case 2:
+ if (from_db)
+ {
+ pwdgrp &grw = cygheap->pg.grp_cache.win;
+ if (cnt < grw.cached_groups ())
+ return &grw.group ()[cnt++].g;
+ }
+ break;
}
cnt = max = 0;
return NULL;
diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h
index 32b9172a8..17fa12d43 100644
--- a/winsup/cygwin/include/sys/cygwin.h
+++ b/winsup/cygwin/include/sys/cygwin.h
@@ -210,8 +210,8 @@ typedef enum
/* Token type for CW_SET_EXTERNAL_TOKEN */
enum
{
-CW_TOKEN_IMPERSONATION = 0,
-CW_TOKEN_RESTRICTED = 1
+ CW_TOKEN_IMPERSONATION = 0,
+ CW_TOKEN_RESTRICTED = 1
};
/* Enumeration source constants for CW_SETENT called from mkpasswd/mkgroup. */
diff --git a/winsup/cygwin/passwd.cc b/winsup/cygwin/passwd.cc
index fff5a0d81..35a7ecf0b 100644
--- a/winsup/cygwin/passwd.cc
+++ b/winsup/cygwin/passwd.cc
@@ -51,27 +51,6 @@ pwdgrp::init_pwd ()
parse = &pwdgrp::parse_passwd;
}
-pwdgrp *
-pwdgrp::prep_tls_pwbuf ()
-{
- if (!_my_tls.locals.pwbuf)
- {
- _my_tls.locals.pwbuf = ccalloc_abort (HEAP_BUF, 1,
- sizeof (pwdgrp) + sizeof (pg_pwd));
- pwdgrp *pw = (pwdgrp *) _my_tls.locals.pwbuf;
- pw->init_pwd ();
- pw->pwdgrp_buf = (void *) (pw + 1);
- pw->max_lines = 1;
- }
- pwdgrp *pw = (pwdgrp *) _my_tls.locals.pwbuf;
- if (pw->curr_lines)
- {
- cfree (pw->passwd ()[0].p.pw_name);
- pw->curr_lines = 0;
- }
- return pw;
-}
-
struct passwd *
pwdgrp::find_user (cygpsid &sid)
{
@@ -106,20 +85,28 @@ internal_getpwsid (cygpsid &sid, cyg_ldap *pldap)
struct passwd *ret;
cygheap->pg.nss_init ();
+ /* Check caches first. */
+ if (cygheap->pg.nss_cygserver_caching ()
+ && (ret = cygheap->pg.pwd_cache.cygserver.find_user (sid)))
+ return ret;
+ if (cygheap->pg.nss_pwd_files ()
+ && (ret = cygheap->pg.pwd_cache.file.find_user (sid)))
+ return ret;
+ if (cygheap->pg.nss_pwd_db ()
+ && (ret = cygheap->pg.pwd_cache.win.find_user (sid)))
+ return ret;
+ /* Ask sources afterwards. */
+ if (cygheap->pg.nss_cygserver_caching ()
+ && (ret = cygheap->pg.pwd_cache.cygserver.add_user_from_cygserver (sid)))
+ return ret;
if (cygheap->pg.nss_pwd_files ())
{
cygheap->pg.pwd_cache.file.check_file ();
- if ((ret = cygheap->pg.pwd_cache.file.find_user (sid)))
- return ret;
if ((ret = cygheap->pg.pwd_cache.file.add_user_from_file (sid)))
return ret;
}
if (cygheap->pg.nss_pwd_db ())
- {
- if ((ret = cygheap->pg.pwd_cache.win.find_user (sid)))
- return ret;
- return cygheap->pg.pwd_cache.win.add_user_from_windows (sid, pldap);
- }
+ return cygheap->pg.pwd_cache.win.add_user_from_windows (sid, pldap);
return NULL;
}
@@ -137,20 +124,28 @@ internal_getpwnam (const char *name, cyg_ldap *pldap)
struct passwd *ret;
cygheap->pg.nss_init ();
+ /* Check caches first. */
+ if (cygheap->pg.nss_cygserver_caching ()
+ && (ret = cygheap->pg.pwd_cache.cygserver.find_user (name)))
+ return ret;
+ if (cygheap->pg.nss_pwd_files ()
+ && (ret = cygheap->pg.pwd_cache.file.find_user (name)))
+ return ret;
+ if (cygheap->pg.nss_pwd_db ()
+ && (ret = cygheap->pg.pwd_cache.win.find_user (name)))
+ return ret;
+ /* Ask sources afterwards. */
+ if (cygheap->pg.nss_cygserver_caching ()
+ && (ret = cygheap->pg.pwd_cache.cygserver.add_user_from_cygserver (name)))
+ return ret;
if (cygheap->pg.nss_pwd_files ())
{
cygheap->pg.pwd_cache.file.check_file ();
- if ((ret = cygheap->pg.pwd_cache.file.find_user (name)))
- return ret;
if ((ret = cygheap->pg.pwd_cache.file.add_user_from_file (name)))
return ret;
}
if (cygheap->pg.nss_pwd_db ())
- {
- if ((ret = cygheap->pg.pwd_cache.win.find_user (name)))
- return ret;
- return cygheap->pg.pwd_cache.win.add_user_from_windows (name, pldap);
- }
+ return cygheap->pg.pwd_cache.win.add_user_from_windows (name, pldap);
return NULL;
}
@@ -160,22 +155,28 @@ internal_getpwuid (uid_t uid, cyg_ldap *pldap)
struct passwd *ret;
cygheap->pg.nss_init ();
+ /* Check caches first. */
+ if (cygheap->pg.nss_cygserver_caching ()
+ && (ret = cygheap->pg.pwd_cache.cygserver.find_user (uid)))
+ return ret;
+ if (cygheap->pg.nss_pwd_files ()
+ && (ret = cygheap->pg.pwd_cache.file.find_user (uid)))
+ return ret;
+ if (cygheap->pg.nss_pwd_db ()
+ && (ret = cygheap->pg.pwd_cache.win.find_user (uid)))
+ return ret;
+ /* Ask sources afterwards. */
+ if (cygheap->pg.nss_cygserver_caching ()
+ && (ret = cygheap->pg.pwd_cache.cygserver.add_user_from_cygserver (uid)))
+ return ret;
if (cygheap->pg.nss_pwd_files ())
{
cygheap->pg.pwd_cache.file.check_file ();
- if ((ret = cygheap->pg.pwd_cache.file.find_user (uid)))
- return ret;
if ((ret = cygheap->pg.pwd_cache.file.add_user_from_file (uid)))
return ret;
}
- if (cygheap->pg.nss_pwd_db ())
- {
- if ((ret = cygheap->pg.pwd_cache.win.find_user (uid)))
- return ret;
- return cygheap->pg.pwd_cache.win.add_user_from_windows (uid, pldap);
- }
- else if (uid == ILLEGAL_UID)
- return cygheap->pg.pwd_cache.win.add_user_from_windows (uid);
+ if (cygheap->pg.nss_pwd_db () || uid == ILLEGAL_UID)
+ return cygheap->pg.pwd_cache.win.add_user_from_windows (uid, pldap);
return NULL;
}
@@ -596,20 +597,37 @@ pg_ent::enumerate_ad ()
void *
pw_ent::enumerate_caches ()
{
- if (!max && from_files)
+ switch (max)
{
- pwdgrp &prf = cygheap->pg.pwd_cache.file;
- prf.check_file ();
- if (cnt < prf.cached_users ())
- return &prf.passwd ()[cnt++].p;
+ case 0:
+ if (cygheap->pg.nss_cygserver_caching ())
+ {
+ pwdgrp &prc = cygheap->pg.pwd_cache.cygserver;
+ if (cnt < prc.cached_users ())
+ return &prc.passwd ()[cnt++].p;
+ }
cnt = 0;
max = 1;
- }
- if (from_db && cygheap->pg.nss_db_caching ())
- {
- pwdgrp &prw = cygheap->pg.pwd_cache.win;
- if (cnt < prw.cached_users ())
- return &prw.passwd ()[cnt++].p;
+ /*FALLTHRU*/
+ case 1:
+ if (from_files)
+ {
+ pwdgrp &prf = cygheap->pg.pwd_cache.file;
+ prf.check_file ();
+ if (cnt < prf.cached_users ())
+ return &prf.passwd ()[cnt++].p;
+ }
+ cnt = 0;
+ max = 2;
+ /*FALLTHRU*/
+ default:
+ if (from_db)
+ {
+ pwdgrp &prw = cygheap->pg.pwd_cache.win;
+ if (cnt < prw.cached_users ())
+ return &prw.passwd ()[cnt++].p;
+ }
+ break;
}
cnt = max = 0;
return NULL;
diff --git a/winsup/cygwin/pwdgrp.h b/winsup/cygwin/pwdgrp.h
index 0d2d9cc20..1a964def3 100644
--- a/winsup/cygwin/pwdgrp.h
+++ b/winsup/cygwin/pwdgrp.h
@@ -111,12 +111,14 @@ class pwdgrp
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);
- pwdgrp *prep_tls_pwbuf ();
- pwdgrp *prep_tls_grbuf ();
+ char *fetch_account_from_cygserver (fetch_user_arg_t &arg);
public:
ULONG cached_users () const { return curr_lines; }
@@ -127,7 +129,13 @@ public:
void init_pwd ();
bool is_passwd () const { return pwdgrp_buf_elem_size == sizeof (pg_pwd); }
pg_pwd *passwd () const { return (pg_pwd *) pwdgrp_buf; };
- inline struct passwd *add_user_from_file (cygpsid &sid)
+ 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); }
@@ -147,6 +155,12 @@ public:
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)
diff --git a/winsup/cygwin/tlsoffsets.h b/winsup/cygwin/tlsoffsets.h
index 8edc86c18..e59ea7430 100644
--- a/winsup/cygwin/tlsoffsets.h
+++ b/winsup/cygwin/tlsoffsets.h
@@ -3,115 +3,115 @@
//; $tls::start_offset = -12700;
//; $tls::locals = -12700;
//; $tls::plocals = 0;
-//; $tls::local_clib = -11292;
-//; $tls::plocal_clib = 1408;
-//; $tls::__dontuse = -11292;
-//; $tls::p__dontuse = 1408;
-//; $tls::func = -10204;
-//; $tls::pfunc = 2496;
-//; $tls::saved_errno = -10200;
-//; $tls::psaved_errno = 2500;
-//; $tls::sa_flags = -10196;
-//; $tls::psa_flags = 2504;
-//; $tls::oldmask = -10192;
-//; $tls::poldmask = 2508;
-//; $tls::deltamask = -10188;
-//; $tls::pdeltamask = 2512;
-//; $tls::errno_addr = -10184;
-//; $tls::perrno_addr = 2516;
-//; $tls::sigmask = -10180;
-//; $tls::psigmask = 2520;
-//; $tls::sigwait_mask = -10176;
-//; $tls::psigwait_mask = 2524;
-//; $tls::sigwait_info = -10172;
-//; $tls::psigwait_info = 2528;
-//; $tls::signal_arrived = -10168;
-//; $tls::psignal_arrived = 2532;
-//; $tls::will_wait_for_signal = -10164;
-//; $tls::pwill_wait_for_signal = 2536;
-//; $tls::thread_context = -10160;
-//; $tls::pthread_context = 2540;
-//; $tls::thread_id = -9948;
-//; $tls::pthread_id = 2752;
-//; $tls::infodata = -9944;
-//; $tls::pinfodata = 2756;
-//; $tls::tid = -9796;
-//; $tls::ptid = 2904;
-//; $tls::_ctinfo = -9792;
-//; $tls::p_ctinfo = 2908;
-//; $tls::andreas = -9788;
-//; $tls::pandreas = 2912;
-//; $tls::wq = -9784;
-//; $tls::pwq = 2916;
-//; $tls::sig = -9756;
-//; $tls::psig = 2944;
-//; $tls::incyg = -9752;
-//; $tls::pincyg = 2948;
-//; $tls::spinning = -9748;
-//; $tls::pspinning = 2952;
-//; $tls::stacklock = -9744;
-//; $tls::pstacklock = 2956;
-//; $tls::stackptr = -9740;
-//; $tls::pstackptr = 2960;
-//; $tls::stack = -9736;
-//; $tls::pstack = 2964;
-//; $tls::initialized = -8712;
-//; $tls::pinitialized = 3988;
+//; $tls::local_clib = -11300;
+//; $tls::plocal_clib = 1400;
+//; $tls::__dontuse = -11300;
+//; $tls::p__dontuse = 1400;
+//; $tls::func = -10212;
+//; $tls::pfunc = 2488;
+//; $tls::saved_errno = -10208;
+//; $tls::psaved_errno = 2492;
+//; $tls::sa_flags = -10204;
+//; $tls::psa_flags = 2496;
+//; $tls::oldmask = -10200;
+//; $tls::poldmask = 2500;
+//; $tls::deltamask = -10196;
+//; $tls::pdeltamask = 2504;
+//; $tls::errno_addr = -10192;
+//; $tls::perrno_addr = 2508;
+//; $tls::sigmask = -10188;
+//; $tls::psigmask = 2512;
+//; $tls::sigwait_mask = -10184;
+//; $tls::psigwait_mask = 2516;
+//; $tls::sigwait_info = -10180;
+//; $tls::psigwait_info = 2520;
+//; $tls::signal_arrived = -10176;
+//; $tls::psignal_arrived = 2524;
+//; $tls::will_wait_for_signal = -10172;
+//; $tls::pwill_wait_for_signal = 2528;
+//; $tls::thread_context = -10168;
+//; $tls::pthread_context = 2532;
+//; $tls::thread_id = -9956;
+//; $tls::pthread_id = 2744;
+//; $tls::infodata = -9952;
+//; $tls::pinfodata = 2748;
+//; $tls::tid = -9804;
+//; $tls::ptid = 2896;
+//; $tls::_ctinfo = -9800;
+//; $tls::p_ctinfo = 2900;
+//; $tls::andreas = -9796;
+//; $tls::pandreas = 2904;
+//; $tls::wq = -9792;
+//; $tls::pwq = 2908;
+//; $tls::sig = -9764;
+//; $tls::psig = 2936;
+//; $tls::incyg = -9760;
+//; $tls::pincyg = 2940;
+//; $tls::spinning = -9756;
+//; $tls::pspinning = 2944;
+//; $tls::stacklock = -9752;
+//; $tls::pstacklock = 2948;
+//; $tls::stackptr = -9748;
+//; $tls::pstackptr = 2952;
+//; $tls::stack = -9744;
+//; $tls::pstack = 2956;
+//; $tls::initialized = -8720;
+//; $tls::pinitialized = 3980;
//; __DATA__
#define tls_locals (-12700)
#define tls_plocals (0)
-#define tls_local_clib (-11292)
-#define tls_plocal_clib (1408)
-#define tls___dontuse (-11292)
-#define tls_p__dontuse (1408)
-#define tls_func (-10204)
-#define tls_pfunc (2496)
-#define tls_saved_errno (-10200)
-#define tls_psaved_errno (2500)
-#define tls_sa_flags (-10196)
-#define tls_psa_flags (2504)
-#define tls_oldmask (-10192)
-#define tls_poldmask (2508)
-#define tls_deltamask (-10188)
-#define tls_pdeltamask (2512)
-#define tls_errno_addr (-10184)
-#define tls_perrno_addr (2516)
-#define tls_sigmask (-10180)
-#define tls_psigmask (2520)
-#define tls_sigwait_mask (-10176)
-#define tls_psigwait_mask (2524)
-#define tls_sigwait_info (-10172)
-#define tls_psigwait_info (2528)
-#define tls_signal_arrived (-10168)
-#define tls_psignal_arrived (2532)
-#define tls_will_wait_for_signal (-10164)
-#define tls_pwill_wait_for_signal (2536)
-#define tls_thread_context (-10160)
-#define tls_pthread_context (2540)
-#define tls_thread_id (-9948)
-#define tls_pthread_id (2752)
-#define tls_infodata (-9944)
-#define tls_pinfodata (2756)
-#define tls_tid (-9796)
-#define tls_ptid (2904)
-#define tls__ctinfo (-9792)
-#define tls_p_ctinfo (2908)
-#define tls_andreas (-9788)
-#define tls_pandreas (2912)
-#define tls_wq (-9784)
-#define tls_pwq (2916)
-#define tls_sig (-9756)
-#define tls_psig (2944)
-#define tls_incyg (-9752)
-#define tls_pincyg (2948)
-#define tls_spinning (-9748)
-#define tls_pspinning (2952)
-#define tls_stacklock (-9744)
-#define tls_pstacklock (2956)
-#define tls_stackptr (-9740)
-#define tls_pstackptr (2960)
-#define tls_stack (-9736)
-#define tls_pstack (2964)
-#define tls_initialized (-8712)
-#define tls_pinitialized (3988)
+#define tls_local_clib (-11300)
+#define tls_plocal_clib (1400)
+#define tls___dontuse (-11300)
+#define tls_p__dontuse (1400)
+#define tls_func (-10212)
+#define tls_pfunc (2488)
+#define tls_saved_errno (-10208)
+#define tls_psaved_errno (2492)
+#define tls_sa_flags (-10204)
+#define tls_psa_flags (2496)
+#define tls_oldmask (-10200)
+#define tls_poldmask (2500)
+#define tls_deltamask (-10196)
+#define tls_pdeltamask (2504)
+#define tls_errno_addr (-10192)
+#define tls_perrno_addr (2508)
+#define tls_sigmask (-10188)
+#define tls_psigmask (2512)
+#define tls_sigwait_mask (-10184)
+#define tls_psigwait_mask (2516)
+#define tls_sigwait_info (-10180)
+#define tls_psigwait_info (2520)
+#define tls_signal_arrived (-10176)
+#define tls_psignal_arrived (2524)
+#define tls_will_wait_for_signal (-10172)
+#define tls_pwill_wait_for_signal (2528)
+#define tls_thread_context (-10168)
+#define tls_pthread_context (2532)
+#define tls_thread_id (-9956)
+#define tls_pthread_id (2744)
+#define tls_infodata (-9952)
+#define tls_pinfodata (2748)
+#define tls_tid (-9804)
+#define tls_ptid (2896)
+#define tls__ctinfo (-9800)
+#define tls_p_ctinfo (2900)
+#define tls_andreas (-9796)
+#define tls_pandreas (2904)
+#define tls_wq (-9792)
+#define tls_pwq (2908)
+#define tls_sig (-9764)
+#define tls_psig (2936)
+#define tls_incyg (-9760)
+#define tls_pincyg (2940)
+#define tls_spinning (-9756)
+#define tls_pspinning (2944)
+#define tls_stacklock (-9752)
+#define tls_pstacklock (2948)
+#define tls_stackptr (-9748)
+#define tls_pstackptr (2952)
+#define tls_stack (-9744)
+#define tls_pstack (2956)
+#define tls_initialized (-8720)
+#define tls_pinitialized (3980)
diff --git a/winsup/cygwin/tlsoffsets64.h b/winsup/cygwin/tlsoffsets64.h
index e04fca103..d518f9d8c 100644
--- a/winsup/cygwin/tlsoffsets64.h
+++ b/winsup/cygwin/tlsoffsets64.h
@@ -3,115 +3,115 @@
//; $tls::start_offset = -12800;
//; $tls::locals = -12800;
//; $tls::plocals = 0;
-//; $tls::local_clib = -11248;
-//; $tls::plocal_clib = 1552;
-//; $tls::__dontuse = -11248;
-//; $tls::p__dontuse = 1552;
-//; $tls::func = -9360;
-//; $tls::pfunc = 3440;
-//; $tls::saved_errno = -9352;
-//; $tls::psaved_errno = 3448;
-//; $tls::sa_flags = -9348;
-//; $tls::psa_flags = 3452;
-//; $tls::oldmask = -9344;
-//; $tls::poldmask = 3456;
-//; $tls::deltamask = -9336;
-//; $tls::pdeltamask = 3464;
-//; $tls::errno_addr = -9328;
-//; $tls::perrno_addr = 3472;
-//; $tls::sigmask = -9320;
-//; $tls::psigmask = 3480;
-//; $tls::sigwait_mask = -9312;
-//; $tls::psigwait_mask = 3488;
-//; $tls::sigwait_info = -9304;
-//; $tls::psigwait_info = 3496;
-//; $tls::signal_arrived = -9296;
-//; $tls::psignal_arrived = 3504;
-//; $tls::will_wait_for_signal = -9288;
-//; $tls::pwill_wait_for_signal = 3512;
-//; $tls::thread_context = -9280;
-//; $tls::pthread_context = 3520;
-//; $tls::thread_id = -8448;
-//; $tls::pthread_id = 4352;
-//; $tls::infodata = -8444;
-//; $tls::pinfodata = 4356;
-//; $tls::tid = -8296;
-//; $tls::ptid = 4504;
-//; $tls::_ctinfo = -8288;
-//; $tls::p_ctinfo = 4512;
-//; $tls::andreas = -8280;
-//; $tls::pandreas = 4520;
-//; $tls::wq = -8272;
-//; $tls::pwq = 4528;
-//; $tls::sig = -8224;
-//; $tls::psig = 4576;
-//; $tls::incyg = -8220;
-//; $tls::pincyg = 4580;
-//; $tls::spinning = -8216;
-//; $tls::pspinning = 4584;
-//; $tls::stacklock = -8212;
-//; $tls::pstacklock = 4588;
-//; $tls::stackptr = -8208;
-//; $tls::pstackptr = 4592;
-//; $tls::stack = -8200;
-//; $tls::pstack = 4600;
-//; $tls::initialized = -6152;
-//; $tls::pinitialized = 6648;
+//; $tls::local_clib = -11264;
+//; $tls::plocal_clib = 1536;
+//; $tls::__dontuse = -11264;
+//; $tls::p__dontuse = 1536;
+//; $tls::func = -9376;
+//; $tls::pfunc = 3424;
+//; $tls::saved_errno = -9368;
+//; $tls::psaved_errno = 3432;
+//; $tls::sa_flags = -9364;
+//; $tls::psa_flags = 3436;
+//; $tls::oldmask = -9360;
+//; $tls::poldmask = 3440;
+//; $tls::deltamask = -9352;
+//; $tls::pdeltamask = 3448;
+//; $tls::errno_addr = -9344;
+//; $tls::perrno_addr = 3456;
+//; $tls::sigmask = -9336;
+//; $tls::psigmask = 3464;
+//; $tls::sigwait_mask = -9328;
+//; $tls::psigwait_mask = 3472;
+//; $tls::sigwait_info = -9320;
+//; $tls::psigwait_info = 3480;
+//; $tls::signal_arrived = -9312;
+//; $tls::psignal_arrived = 3488;
+//; $tls::will_wait_for_signal = -9304;
+//; $tls::pwill_wait_for_signal = 3496;
+//; $tls::thread_context = -9296;
+//; $tls::pthread_context = 3504;
+//; $tls::thread_id = -8464;
+//; $tls::pthread_id = 4336;
+//; $tls::infodata = -8460;
+//; $tls::pinfodata = 4340;
+//; $tls::tid = -8312;
+//; $tls::ptid = 4488;
+//; $tls::_ctinfo = -8304;
+//; $tls::p_ctinfo = 4496;
+//; $tls::andreas = -8296;
+//; $tls::pandreas = 4504;
+//; $tls::wq = -8288;
+//; $tls::pwq = 4512;
+//; $tls::sig = -8240;
+//; $tls::psig = 4560;
+//; $tls::incyg = -8236;
+//; $tls::pincyg = 4564;
+//; $tls::spinning = -8232;
+//; $tls::pspinning = 4568;
+//; $tls::stacklock = -8228;
+//; $tls::pstacklock = 4572;
+//; $tls::stackptr = -8224;
+//; $tls::pstackptr = 4576;
+//; $tls::stack = -8216;
+//; $tls::pstack = 4584;
+//; $tls::initialized = -6168;
+//; $tls::pinitialized = 6632;
//; __DATA__
#define tls_locals (-12800)
#define tls_plocals (0)
-#define tls_local_clib (-11248)
-#define tls_plocal_clib (1552)
-#define tls___dontuse (-11248)
-#define tls_p__dontuse (1552)
-#define tls_func (-9360)
-#define tls_pfunc (3440)
-#define tls_saved_errno (-9352)
-#define tls_psaved_errno (3448)
-#define tls_sa_flags (-9348)
-#define tls_psa_flags (3452)
-#define tls_oldmask (-9344)
-#define tls_poldmask (3456)
-#define tls_deltamask (-9336)
-#define tls_pdeltamask (3464)
-#define tls_errno_addr (-9328)
-#define tls_perrno_addr (3472)
-#define tls_sigmask (-9320)
-#define tls_psigmask (3480)
-#define tls_sigwait_mask (-9312)
-#define tls_psigwait_mask (3488)
-#define tls_sigwait_info (-9304)
-#define tls_psigwait_info (3496)
-#define tls_signal_arrived (-9296)
-#define tls_psignal_arrived (3504)
-#define tls_will_wait_for_signal (-9288)
-#define tls_pwill_wait_for_signal (3512)
-#define tls_thread_context (-9280)
-#define tls_pthread_context (3520)
-#define tls_thread_id (-8448)
-#define tls_pthread_id (4352)
-#define tls_infodata (-8444)
-#define tls_pinfodata (4356)
-#define tls_tid (-8296)
-#define tls_ptid (4504)
-#define tls__ctinfo (-8288)
-#define tls_p_ctinfo (4512)
-#define tls_andreas (-8280)
-#define tls_pandreas (4520)
-#define tls_wq (-8272)
-#define tls_pwq (4528)
-#define tls_sig (-8224)
-#define tls_psig (4576)
-#define tls_incyg (-8220)
-#define tls_pincyg (4580)
-#define tls_spinning (-8216)
-#define tls_pspinning (4584)
-#define tls_stacklock (-8212)
-#define tls_pstacklock (4588)
-#define tls_stackptr (-8208)
-#define tls_pstackptr (4592)
-#define tls_stack (-8200)
-#define tls_pstack (4600)
-#define tls_initialized (-6152)
-#define tls_pinitialized (6648)
+#define tls_local_clib (-11264)
+#define tls_plocal_clib (1536)
+#define tls___dontuse (-11264)
+#define tls_p__dontuse (1536)
+#define tls_func (-9376)
+#define tls_pfunc (3424)
+#define tls_saved_errno (-9368)
+#define tls_psaved_errno (3432)
+#define tls_sa_flags (-9364)
+#define tls_psa_flags (3436)
+#define tls_oldmask (-9360)
+#define tls_poldmask (3440)
+#define tls_deltamask (-9352)
+#define tls_pdeltamask (3448)
+#define tls_errno_addr (-9344)
+#define tls_perrno_addr (3456)
+#define tls_sigmask (-9336)
+#define tls_psigmask (3464)
+#define tls_sigwait_mask (-9328)
+#define tls_psigwait_mask (3472)
+#define tls_sigwait_info (-9320)
+#define tls_psigwait_info (3480)
+#define tls_signal_arrived (-9312)
+#define tls_psignal_arrived (3488)
+#define tls_will_wait_for_signal (-9304)
+#define tls_pwill_wait_for_signal (3496)
+#define tls_thread_context (-9296)
+#define tls_pthread_context (3504)
+#define tls_thread_id (-8464)
+#define tls_pthread_id (4336)
+#define tls_infodata (-8460)
+#define tls_pinfodata (4340)
+#define tls_tid (-8312)
+#define tls_ptid (4488)
+#define tls__ctinfo (-8304)
+#define tls_p_ctinfo (4496)
+#define tls_andreas (-8296)
+#define tls_pandreas (4504)
+#define tls_wq (-8288)
+#define tls_pwq (4512)
+#define tls_sig (-8240)
+#define tls_psig (4560)
+#define tls_incyg (-8236)
+#define tls_pincyg (4564)
+#define tls_spinning (-8232)
+#define tls_pspinning (4568)
+#define tls_stacklock (-8228)
+#define tls_pstacklock (4572)
+#define tls_stackptr (-8224)
+#define tls_pstackptr (4576)
+#define tls_stack (-8216)
+#define tls_pstack (4584)
+#define tls_initialized (-6168)
+#define tls_pinitialized (6632)
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index 10d335644..3b42754ed 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -32,8 +32,8 @@ details. */
#include "tls_pbuf.h"
#include "miscfuncs.h"
#include "ntdll.h"
-
#include "ldap.h"
+#include "cygserver_pwdgrp.h"
/* Initialize the part of cygheap_user that does not depend on files.
The information is used in shared.cc for the user shared.
@@ -124,7 +124,7 @@ internal_getlogin (cygheap_user &user)
and the primary group in the token. */
pwd = internal_getpwsid (user.sid (), &cldap);
pgrp = internal_getgrsid (user.groups.pgsid, &cldap);
- if (cygheap->pg.nss_db_full_caching ())
+ if (!cygheap->pg.nss_cygserver_caching ())
internal_getgroups (0, NULL, &cldap);
if (!pwd)
debug_printf ("user not found in passwd DB");
@@ -567,8 +567,10 @@ pwdgrp::add_line (char *eptr)
void
cygheap_pwdgrp::init ()
{
+ pwd_cache.cygserver.init_pwd ();
pwd_cache.file.init_pwd ();
pwd_cache.win.init_pwd ();
+ grp_cache.cygserver.init_grp ();
grp_cache.file.init_grp ();
grp_cache.win.init_grp ();
/* Default settings:
@@ -584,7 +586,7 @@ cygheap_pwdgrp::init ()
grp_src = (NSS_FILES | NSS_DB);
prefix = NSS_AUTO;
separator[0] = L'+';
- caching = NSS_FULL_CACHING;
+ caching = true;
enums = (ENUM_CACHE | ENUM_BUILTIN);
enum_tdoms = NULL;
}
@@ -670,19 +672,6 @@ cygheap_pwdgrp::nss_init_line (const char *line)
else
debug_printf ("Invalid nsswitch.conf content: %s", line);
}
- else if (!strncmp (c, "cache:", 6))
- {
- c += 6;
- c += strspn (c, " \t");
- if (!strncmp (c, "full", 3) && strchr (" \t", c[3]))
- caching = NSS_FULL_CACHING;
- else if (!strncmp (c, "yes", 3) && strchr (" \t", c[3]))
- caching = NSS_CACHING;
- else if (!strncmp (c, "no", 2) && strchr (" \t", c[2]))
- caching = NSS_NO_CACHING;
- else
- debug_printf ("Invalid nsswitch.conf content: %s", line);
- }
else if (!strncmp (c, "enum:", 5))
{
tmp_pathbuf tp;
@@ -1001,11 +990,7 @@ pwdgrp::add_account_from_windows (cygpsid &sid, cyg_ldap *pldap)
char *line = fetch_account_from_windows (arg, pldap);
if (!line)
return NULL;
- if (cygheap->pg.nss_db_caching ())
- return add_account_post_fetch (line, true);
- if (is_group ())
- return (prep_tls_grbuf ())->add_account_post_fetch (line, false);
- return (prep_tls_pwbuf ())->add_account_post_fetch (line, false);
+ return add_account_post_fetch (line, true);
}
void *
@@ -1017,11 +1002,7 @@ pwdgrp::add_account_from_windows (const char *name, cyg_ldap *pldap)
char *line = fetch_account_from_windows (arg, pldap);
if (!line)
return NULL;
- if (cygheap->pg.nss_db_caching ())
- return add_account_post_fetch (line, true);
- if (is_group ())
- return (prep_tls_grbuf ())->add_account_post_fetch (line, false);
- return (prep_tls_pwbuf ())->add_account_post_fetch (line, false);
+ return add_account_post_fetch (line, true);
}
void *
@@ -1033,11 +1014,7 @@ pwdgrp::add_account_from_windows (uint32_t id, cyg_ldap *pldap)
char *line = fetch_account_from_windows (arg, pldap);
if (!line)
return NULL;
- if (cygheap->pg.nss_db_caching ())
- return add_account_post_fetch (line, true);
- if (is_group ())
- return (prep_tls_grbuf ())->add_account_post_fetch (line, false);
- return (prep_tls_pwbuf ())->add_account_post_fetch (line, false);
+ return add_account_post_fetch (line, true);
}
/* Check if file exists and if it has been written to since last checked.
@@ -1828,3 +1805,79 @@ pwdgrp::fetch_account_from_windows (fetch_user_arg_t &arg, cyg_ldap *pldap)
debug_printf ("line: <%s>", line);
return line;
}
+
+client_request_pwdgrp::client_request_pwdgrp (fetch_user_arg_t &arg, bool group)
+ : client_request (CYGSERVER_REQUEST_PWDGRP, &_parameters, sizeof (_parameters))
+{
+ size_t len = 0;
+ char *p;
+
+ _parameters.in.group = group;
+ _parameters.in.type = arg.type;
+ switch (arg.type)
+ {
+ case SID_arg:
+ RtlCopySid (sizeof (DBGSID), (PSID) &_parameters.in.arg.sid, *arg.sid);
+ len = RtlLengthSid (*arg.sid);
+ break;
+ case NAME_arg:
+ p = stpcpy (_parameters.in.arg.name, arg.name);
+ len = p - _parameters.in.arg.name;
+ break;
+ case ID_arg:
+ _parameters.in.arg.id = arg.id;
+ len = sizeof (uint32_t);
+ }
+ msglen (__builtin_offsetof (struct _pwdgrp_param_t::_pwdgrp_in_t, arg) + len);
+}
+
+char *
+pwdgrp::fetch_account_from_cygserver (fetch_user_arg_t &arg)
+{
+ client_request_pwdgrp request (arg, is_group ());
+ if (request.make_request () == -1 || request.error_code ())
+ {
+ /* Cygserver not running? Don't try again. This will automatically
+ avoid an endless loop in cygserver itself. */
+ if (request.error_code () == ENOSYS)
+ cygheap->pg.nss_disable_cygserver_caching ();
+ return NULL;
+ }
+ if (!request.line ())
+ return NULL;
+ return cstrdup (request.line ());
+}
+
+void *
+pwdgrp::add_account_from_cygserver (cygpsid &sid)
+{
+ /* No, Everyone is no group in terms of POSIX. */
+ if (sid_id_auth (sid) == 1 /* SECURITY_WORLD_SID_AUTHORITY */
+ && sid_sub_auth (sid, 0) == SECURITY_WORLD_RID)
+ return NULL;
+ fetch_user_arg_t arg;
+ arg.type = SID_arg;
+ arg.sid = &sid;
+ char *line = fetch_account_from_cygserver (arg);
+ return (struct passwd *) add_account_post_fetch (line, true);
+}
+
+void *
+pwdgrp::add_account_from_cygserver (const char *name)
+{
+ fetch_user_arg_t arg;
+ arg.type = NAME_arg;
+ arg.name = name;
+ char *line = fetch_account_from_cygserver (arg);
+ return (struct passwd *) add_account_post_fetch (line, true);
+}
+
+void *
+pwdgrp::add_account_from_cygserver (uint32_t id)
+{
+ fetch_user_arg_t arg;
+ arg.type = ID_arg;
+ arg.id = id;
+ char *line = fetch_account_from_cygserver (arg);
+ return (struct passwd *) add_account_post_fetch (line, true);
+}