* 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.
This commit is contained in:
Corinna Vinschen 2014-03-12 17:36:56 +00:00
parent 681bb2f78a
commit 29b7313d22
13 changed files with 593 additions and 378 deletions

View 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

View 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; }
};

View File

@ -52,6 +52,7 @@ protected:
CYGSERVER_REQUEST_SEM,
CYGSERVER_REQUEST_SHM,
CYGSERVER_REQUEST_SETPWD,
CYGSERVER_REQUEST_PWDGRP,
CYGSERVER_REQUEST_LAST
} request_code_t;

View File

@ -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__ */

View 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];

View 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;

View 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;

View 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. */

View 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;

View 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)

View File

@ -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)

View File

@ -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)

View 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);
}