]> sourceware.org Git - newlib-cygwin.git/commitdiff
* cygheap.h (enum cygheap_pwdgrp::cache_t): Remove.
authorCorinna Vinschen <corinna@vinschen.de>
Wed, 12 Mar 2014 17:36:56 +0000 (17:36 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Wed, 12 Mar 2014 17:36:56 +0000 (17:36 +0000)
(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.

13 files changed:
winsup/cygwin/ChangeLog
winsup/cygwin/cygheap.h
winsup/cygwin/cygserver.h
winsup/cygwin/cygserver_pwdgrp.h [new file with mode: 0644]
winsup/cygwin/cygtls.h
winsup/cygwin/fhandler_disk_file.cc
winsup/cygwin/grp.cc
winsup/cygwin/include/sys/cygwin.h
winsup/cygwin/passwd.cc
winsup/cygwin/pwdgrp.h
winsup/cygwin/tlsoffsets.h
winsup/cygwin/tlsoffsets64.h
winsup/cygwin/uinfo.cc

index 65c7328e7ba84aa9f25518efd378ef57caca9902..6f71531b49d09c633f5f380067349004ba51a964 100644 (file)
@@ -1,3 +1,50 @@
+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
index 66603c0c7df3ac25c0a905c24d27f1865e0c7676..c4b2ed9ad32e6b6dcd44da822ac7e08cf2dea2f0 100644 (file)
@@ -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; }
 };
index 8bcc271f39db908f56ff048998059ffcab172dcf..1313d3c1eac49cf3c961eb3b68c0a823c7f4a432 100644 (file)
@@ -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 (file)
index 0000000..52b9b42
--- /dev/null
@@ -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__ */
index fd464f4ce232082e27abf4b1b89c920c5bbd97ac..b76dd2441daace23aa7a7f83cf3542a5a519f4c4 100644 (file)
@@ -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];
index a44bfb8b6aae6070a115f1a0ac67d539881d5352..b03e9c7fd091c2313783ed2e3c0529055a02ebd2 100644 (file)
@@ -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;
index be752a100937154a2f00283bf832d15dbd7cb74e..d941c0f9bfc5ad47b3fd4e95521e00c4cf93f8e1 100644 (file)
@@ -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;
index 32b9172a8ef3a4872cf5dcbf8d99b0fd23a76f44..17fa12d436227c87c8a26414dab34c9deb055aa2 100644 (file)
@@ -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. */
index fff5a0d81f0beef4e03ecc43399bde6a22e2b1dd..35a7ecf0bc52bf68b8c8fe72324758aff90f9a42 100644 (file)
@@ -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;
index 0d2d9cc2042781ed5663451913149129c3b92aff..1a964def311eb1341a8b576a20d9bd2baf36da75 100644 (file)
@@ -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)
index 8edc86c18562d41897a8143fab95c87c6e40761f..e59ea74300ea91097e5de08d2e0145db8fe42d0a 100644 (file)
 //; $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)
index e04fca10345e1470ae812efc16e47c4665032c34..d518f9d8c3ea7f9ea4c098798797b253d2598503 100644 (file)
 //; $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)
index 10d335644e5cb5993bf7aba19801fb9061ff10b7..3b42754ed630c5ba1a2542ef3e2e47d640b266e8 100644 (file)
@@ -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);
+}
This page took 0.074553 seconds and 5 git commands to generate.