mirror of git://sourceware.org/git/glibc.git
* nis/nss_nisplus/nisplus-pwd.c (_nss_pwd_create_tablename):
Renamed from _nss_create_tablename. Export from file (but not DSO). (pwd_tablename_val): Renamed from tablename_val, mark hidden. (pwd_tablename_len): Renamed from tablename_len, mark hidden. Change all users. * nis/nss_nisplus/nisplus-spwd.c (_nss_create_tablename): Removed. Use _nss_pwd_create_tablename now. Use pwd_tablename_val and pwd_tablename_len. Remove unnecessary variables, general cleanup. * nis/nss_nisplus/nisplus-grp.c: Likewise.
This commit is contained in:
parent
49b24791e0
commit
48b293913b
10
ChangeLog
10
ChangeLog
|
|
@ -1,8 +1,18 @@
|
|||
2005-12-02 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* nis/nss_nisplus/nisplus-pwd.c (_nss_pwd_create_tablename):
|
||||
Renamed from _nss_create_tablename. Export from file (but not DSO).
|
||||
(pwd_tablename_val): Renamed from tablename_val, mark hidden.
|
||||
(pwd_tablename_len): Renamed from tablename_len, mark hidden.
|
||||
Change all users.
|
||||
* nis/nss_nisplus/nisplus-spwd.c (_nss_create_tablename): Removed.
|
||||
Use _nss_pwd_create_tablename now. Use pwd_tablename_val and
|
||||
pwd_tablename_len. Remove unnecessary variables, general cleanup.
|
||||
|
||||
* nis/nss_nisplus/nisplus-pwd.c: Fix locking to use
|
||||
_nss_create_tablename. Avoid unnecessary copying, remove
|
||||
unnecessary variables, general cleanup.
|
||||
* nis/nss_nisplus/nisplus-grp.c: Likewise.
|
||||
|
||||
* io/Makefile (routines): Add mknodat, xmknodat, mkdirat, mkfifoat.
|
||||
(static-only-routines): Add mknodat.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1997, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1997, 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
|
||||
|
||||
|
|
@ -17,6 +17,7 @@
|
|||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <atomic.h>
|
||||
#include <nss.h>
|
||||
#include <grp.h>
|
||||
#include <ctype.h>
|
||||
|
|
@ -28,31 +29,39 @@
|
|||
#include "nss-nisplus.h"
|
||||
#include "nisplus-parser.h"
|
||||
|
||||
|
||||
__libc_lock_define_initialized (static, lock);
|
||||
|
||||
static nis_result *result;
|
||||
static unsigned long next_entry;
|
||||
static nis_name tablename_val;
|
||||
static u_long tablename_len;
|
||||
static size_t tablename_len;
|
||||
|
||||
static enum nss_status
|
||||
_nss_create_tablename (int *errnop)
|
||||
{
|
||||
if (tablename_val == NULL)
|
||||
{
|
||||
char buf [40 + strlen (nis_local_directory ())];
|
||||
char *p;
|
||||
const char *local_dir = nis_local_directory ();
|
||||
size_t local_dir_len = strlen (local_dir);
|
||||
static const char prefix[] = "group.org_dir.";
|
||||
|
||||
p = __stpcpy (buf, "group.org_dir.");
|
||||
p = __stpcpy (p, nis_local_directory ());
|
||||
tablename_val = __strdup (buf);
|
||||
char *p = malloc (sizeof (prefix) + local_dir_len);
|
||||
if (tablename_val == NULL)
|
||||
{
|
||||
*errnop = errno;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
tablename_len = strlen (tablename_val);
|
||||
|
||||
memcpy (__stpcpy (p, prefix), local_dir, local_dir_len + 1);
|
||||
|
||||
tablename_len = sizeof (prefix) - 1 + local_dir_len;
|
||||
|
||||
atomic_write_barrier ();
|
||||
|
||||
tablename_val = p;
|
||||
}
|
||||
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -60,16 +69,20 @@ static enum nss_status
|
|||
internal_setgrent (void)
|
||||
{
|
||||
enum nss_status status;
|
||||
int err;
|
||||
|
||||
if (result)
|
||||
nis_freeresult (result);
|
||||
result = NULL;
|
||||
if (result != NULL)
|
||||
{
|
||||
nis_freeresult (result);
|
||||
result = NULL;
|
||||
}
|
||||
next_entry = 0;
|
||||
|
||||
if (tablename_val == NULL)
|
||||
if (_nss_create_tablename (&err) != NSS_STATUS_SUCCESS)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
{
|
||||
int err;
|
||||
if (_nss_create_tablename (&err) != NSS_STATUS_SUCCESS)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
}
|
||||
|
||||
result = nis_list (tablename_val, FOLLOW_LINKS | FOLLOW_PATH, NULL, NULL);
|
||||
if (result == NULL)
|
||||
|
|
@ -108,9 +121,11 @@ _nss_nisplus_endgrent (void)
|
|||
{
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
if (result)
|
||||
nis_freeresult (result);
|
||||
result = NULL;
|
||||
if (result != NULL)
|
||||
{
|
||||
nis_freeresult (result);
|
||||
result = NULL;
|
||||
}
|
||||
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
|
|
@ -173,8 +188,12 @@ _nss_nisplus_getgrnam_r (const char *name, struct group *gr,
|
|||
|
||||
if (tablename_val == NULL)
|
||||
{
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
enum nss_status status = _nss_create_tablename (errnop);
|
||||
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
if (status != NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
|
|
@ -184,47 +203,46 @@ _nss_nisplus_getgrnam_r (const char *name, struct group *gr,
|
|||
*errnop = EINVAL;
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
else
|
||||
|
||||
nis_result *result;
|
||||
char buf[strlen (name) + 9 + tablename_len];
|
||||
int olderr = errno;
|
||||
|
||||
snprintf (buf, sizeof (buf), "[name=%s],%s", name, tablename_val);
|
||||
|
||||
result = nis_list (buf, FOLLOW_LINKS | FOLLOW_PATH, NULL, NULL);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
nis_result *result;
|
||||
char buf[strlen (name) + 24 + tablename_len];
|
||||
int olderr = errno;
|
||||
*errnop = ENOMEM;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
|
||||
sprintf (buf, "[name=%s],%s", name, tablename_val);
|
||||
if (__builtin_expect (niserr2nss (result->status) != NSS_STATUS_SUCCESS, 0))
|
||||
{
|
||||
enum nss_status status = niserr2nss (result->status);
|
||||
|
||||
result = nis_list (buf, FOLLOW_LINKS | FOLLOW_PATH, NULL, NULL);
|
||||
nis_freeresult (result);
|
||||
return status;
|
||||
}
|
||||
|
||||
if (result == NULL)
|
||||
parse_res = _nss_nisplus_parse_grent (result, 0, gr, buffer, buflen, errnop);
|
||||
nis_freeresult (result);
|
||||
if (__builtin_expect (parse_res < 1, 0))
|
||||
{
|
||||
if (parse_res == -1)
|
||||
{
|
||||
*errnop = ENOMEM;
|
||||
*errnop = ERANGE;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
||||
else
|
||||
{
|
||||
enum nss_status status = niserr2nss (result->status);
|
||||
|
||||
nis_freeresult (result);
|
||||
return status;
|
||||
__set_errno (olderr);
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
|
||||
parse_res = _nss_nisplus_parse_grent (result, 0, gr, buffer, buflen,
|
||||
errnop);
|
||||
nis_freeresult (result);
|
||||
if (parse_res < 1)
|
||||
{
|
||||
if (parse_res == -1)
|
||||
{
|
||||
*errnop = ERANGE;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
__set_errno (olderr);
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
}
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
enum nss_status
|
||||
|
|
@ -233,53 +251,57 @@ _nss_nisplus_getgrgid_r (const gid_t gid, struct group *gr,
|
|||
{
|
||||
if (tablename_val == NULL)
|
||||
{
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
enum nss_status status = _nss_create_tablename (errnop);
|
||||
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
if (status != NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
|
||||
{
|
||||
int parse_res;
|
||||
nis_result *result;
|
||||
char buf[36 + tablename_len];
|
||||
int olderr = errno;
|
||||
int parse_res;
|
||||
nis_result *result;
|
||||
char buf[8 + 3 * sizeof (unsigned long int) + tablename_len];
|
||||
int olderr = errno;
|
||||
|
||||
sprintf (buf, "[gid=%lu],%s", (unsigned long int) gid, tablename_val);
|
||||
snprintf (buf, sizeof (buf), "[gid=%lu],%s",
|
||||
(unsigned long int) gid, tablename_val);
|
||||
|
||||
result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
|
||||
result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
*errnop = ENOMEM;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
||||
{
|
||||
enum nss_status status = niserr2nss (result->status);
|
||||
if (result == NULL)
|
||||
{
|
||||
*errnop = ENOMEM;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
|
||||
__set_errno (olderr);
|
||||
if (__builtin_expect (niserr2nss (result->status) != NSS_STATUS_SUCCESS, 0))
|
||||
{
|
||||
enum nss_status status = niserr2nss (result->status);
|
||||
|
||||
nis_freeresult (result);
|
||||
return status;
|
||||
}
|
||||
__set_errno (olderr);
|
||||
|
||||
parse_res = _nss_nisplus_parse_grent (result, 0, gr, buffer, buflen,
|
||||
errnop);
|
||||
nis_freeresult (result);
|
||||
return status;
|
||||
}
|
||||
|
||||
nis_freeresult (result);
|
||||
if (parse_res < 1)
|
||||
{
|
||||
__set_errno (olderr);
|
||||
parse_res = _nss_nisplus_parse_grent (result, 0, gr, buffer, buflen, errnop);
|
||||
|
||||
if (parse_res == -1)
|
||||
{
|
||||
*errnop = ERANGE;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
else
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
nis_freeresult (result);
|
||||
if (__builtin_expect (parse_res < 1, 0))
|
||||
{
|
||||
__set_errno (olderr);
|
||||
|
||||
if (parse_res == -1)
|
||||
{
|
||||
*errnop = ERANGE;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
else
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1997, 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1997,1999,2001,2002,2003,2005 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
|
||||
|
||||
|
|
@ -17,6 +17,7 @@
|
|||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <atomic.h>
|
||||
#include <nss.h>
|
||||
#include <errno.h>
|
||||
#include <pwd.h>
|
||||
|
|
@ -30,27 +31,34 @@
|
|||
__libc_lock_define_initialized (static, lock)
|
||||
|
||||
static nis_result *result;
|
||||
static nis_name tablename_val;
|
||||
static u_long tablename_len;
|
||||
nis_name pwd_tablename_val attribute_hidden;
|
||||
size_t pwd_tablename_len attribute_hidden;
|
||||
|
||||
static enum nss_status
|
||||
_nss_create_tablename (int *errnop)
|
||||
enum nss_status
|
||||
_nss_pwd_create_tablename (int *errnop)
|
||||
{
|
||||
if (tablename_val == NULL)
|
||||
if (pwd_tablename_val == NULL)
|
||||
{
|
||||
char buf [40 + strlen (nis_local_directory ())];
|
||||
char *p;
|
||||
const char *local_dir = nis_local_directory ();
|
||||
size_t local_dir_len = strlen (local_dir);
|
||||
static const char prefix[] = "passwd.org_dir.";
|
||||
|
||||
p = __stpcpy (buf, "passwd.org_dir.");
|
||||
p = __stpcpy (p, nis_local_directory ());
|
||||
tablename_val = __strdup (buf);
|
||||
if (tablename_val == NULL)
|
||||
char *p = malloc (sizeof (prefix) + local_dir_len);
|
||||
if (pwd_tablename_val == NULL)
|
||||
{
|
||||
*errnop = errno;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
tablename_len = strlen (tablename_val);
|
||||
|
||||
memcpy (__stpcpy (p, prefix), local_dir, local_dir_len + 1);
|
||||
|
||||
pwd_tablename_len = sizeof (prefix) - 1 + local_dir_len;
|
||||
|
||||
atomic_write_barrier ();
|
||||
|
||||
pwd_tablename_val = p;
|
||||
}
|
||||
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -59,16 +67,20 @@ enum nss_status
|
|||
_nss_nisplus_setpwent (int stayopen)
|
||||
{
|
||||
enum nss_status status = NSS_STATUS_SUCCESS;
|
||||
int err;
|
||||
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
if (result)
|
||||
nis_freeresult (result);
|
||||
result = NULL;
|
||||
if (result != NULL)
|
||||
{
|
||||
nis_freeresult (result);
|
||||
result = NULL;
|
||||
}
|
||||
|
||||
if (tablename_val == NULL)
|
||||
status = _nss_create_tablename (&err);
|
||||
if (pwd_tablename_val == NULL)
|
||||
{
|
||||
int err;
|
||||
status = _nss_pwd_create_tablename (&err);
|
||||
}
|
||||
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
|
|
@ -80,9 +92,11 @@ _nss_nisplus_endpwent (void)
|
|||
{
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
if (result)
|
||||
nis_freeresult (result);
|
||||
result = NULL;
|
||||
if (result != NULL)
|
||||
{
|
||||
nis_freeresult (result);
|
||||
result = NULL;
|
||||
}
|
||||
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
|
|
@ -103,25 +117,22 @@ internal_nisplus_getpwent_r (struct passwd *pw, char *buffer, size_t buflen,
|
|||
if (result == NULL)
|
||||
{
|
||||
saved_res = NULL;
|
||||
if (tablename_val == NULL)
|
||||
if (pwd_tablename_val == NULL)
|
||||
{
|
||||
enum nss_status status = _nss_create_tablename (errnop);
|
||||
enum nss_status status = _nss_pwd_create_tablename (errnop);
|
||||
|
||||
if (status != NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
|
||||
result = nis_first_entry (tablename_val);
|
||||
result = nis_first_entry (pwd_tablename_val);
|
||||
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
||||
return niserr2nss (result->status);
|
||||
}
|
||||
else
|
||||
{
|
||||
nis_result *res;
|
||||
|
||||
saved_res = result;
|
||||
res = nis_next_entry (tablename_val, &result->cookie);
|
||||
result = res;
|
||||
result = nis_next_entry (pwd_tablename_val, &result->cookie);
|
||||
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
||||
{
|
||||
nis_freeresult (saved_res);
|
||||
|
|
@ -131,19 +142,18 @@ internal_nisplus_getpwent_r (struct passwd *pw, char *buffer, size_t buflen,
|
|||
|
||||
parse_res = _nss_nisplus_parse_pwent (result, pw, buffer,
|
||||
buflen, errnop);
|
||||
if (parse_res == -1)
|
||||
if (__builtin_expect (parse_res == -1, 0))
|
||||
{
|
||||
nis_freeresult (result);
|
||||
result = saved_res;
|
||||
*errnop = ERANGE;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (saved_res)
|
||||
nis_freeresult (saved_res);
|
||||
}
|
||||
} while (!parse_res);
|
||||
|
||||
if (saved_res)
|
||||
nis_freeresult (saved_res);
|
||||
}
|
||||
while (!parse_res);
|
||||
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
@ -169,9 +179,13 @@ _nss_nisplus_getpwnam_r (const char *name, struct passwd *pw,
|
|||
{
|
||||
int parse_res;
|
||||
|
||||
if (tablename_val == NULL)
|
||||
if (pwd_tablename_val == NULL)
|
||||
{
|
||||
enum nss_status status = _nss_create_tablename (errnop);
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
enum nss_status status = _nss_pwd_create_tablename (errnop);
|
||||
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
if (status != NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
|
|
@ -182,107 +196,111 @@ _nss_nisplus_getpwnam_r (const char *name, struct passwd *pw,
|
|||
*errnop = EINVAL;
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
}
|
||||
else
|
||||
|
||||
nis_result *result;
|
||||
char buf[strlen (name) + 9 + pwd_tablename_len];
|
||||
int olderr = errno;
|
||||
|
||||
snprintf (buf, sizeof (buf), "[name=%s],%s", name, pwd_tablename_val);
|
||||
|
||||
result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
nis_result *result;
|
||||
char buf[strlen (name) + 24 + tablename_len];
|
||||
int olderr = errno;
|
||||
*errnop = ENOMEM;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
|
||||
sprintf (buf, "[name=%s],%s", name, tablename_val);
|
||||
if (__builtin_expect (niserr2nss (result->status) != NSS_STATUS_SUCCESS, 0))
|
||||
{
|
||||
enum nss_status status = niserr2nss (result->status);
|
||||
|
||||
result = nis_list(buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
*errnop = ENOMEM;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
||||
{
|
||||
enum nss_status status = niserr2nss (result->status);
|
||||
|
||||
__set_errno (olderr);
|
||||
|
||||
nis_freeresult (result);
|
||||
return status;
|
||||
}
|
||||
|
||||
parse_res = _nss_nisplus_parse_pwent (result, pw, buffer, buflen,
|
||||
errnop);
|
||||
__set_errno (olderr);
|
||||
|
||||
nis_freeresult (result);
|
||||
|
||||
if (parse_res < 1)
|
||||
{
|
||||
if (parse_res == -1)
|
||||
{
|
||||
*errnop = ERANGE;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
__set_errno (olderr);
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
}
|
||||
return NSS_STATUS_SUCCESS;
|
||||
return status;
|
||||
}
|
||||
|
||||
parse_res = _nss_nisplus_parse_pwent (result, pw, buffer, buflen, errnop);
|
||||
|
||||
nis_freeresult (result);
|
||||
|
||||
if (__builtin_expect (parse_res < 1, 0))
|
||||
{
|
||||
if (parse_res == -1)
|
||||
{
|
||||
*errnop = ERANGE;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
__set_errno (olderr);
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
}
|
||||
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
enum nss_status
|
||||
_nss_nisplus_getpwuid_r (const uid_t uid, struct passwd *pw,
|
||||
char *buffer, size_t buflen, int *errnop)
|
||||
{
|
||||
if (tablename_val == NULL)
|
||||
if (pwd_tablename_val == NULL)
|
||||
{
|
||||
enum nss_status status = _nss_create_tablename (errnop);
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
enum nss_status status = _nss_pwd_create_tablename (errnop);
|
||||
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
if (status != NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
|
||||
{
|
||||
int parse_res;
|
||||
nis_result *result;
|
||||
char buf[100 + tablename_len];
|
||||
int olderr = errno;
|
||||
int parse_res;
|
||||
nis_result *result;
|
||||
char buf[8 + 3 * sizeof (unsigned long int) + pwd_tablename_len];
|
||||
int olderr = errno;
|
||||
|
||||
sprintf (buf, "[uid=%lu],%s", (unsigned long int) uid, tablename_val);
|
||||
snprintf (buf, sizeof (buf), "[uid=%lu],%s",
|
||||
(unsigned long int) uid, pwd_tablename_val);
|
||||
|
||||
result = nis_list(buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
|
||||
result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
*errnop = ENOMEM;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
||||
{
|
||||
enum nss_status status = niserr2nss (result->status);
|
||||
if (result == NULL)
|
||||
{
|
||||
*errnop = ENOMEM;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
|
||||
__set_errno (olderr);
|
||||
if (__builtin_expect (niserr2nss (result->status) != NSS_STATUS_SUCCESS, 0))
|
||||
{
|
||||
enum nss_status status = niserr2nss (result->status);
|
||||
|
||||
nis_freeresult (result);
|
||||
return status;
|
||||
}
|
||||
__set_errno (olderr);
|
||||
|
||||
parse_res = _nss_nisplus_parse_pwent (result, pw, buffer, buflen, errnop);
|
||||
nis_freeresult (result);
|
||||
return status;
|
||||
}
|
||||
|
||||
nis_freeresult (result);
|
||||
parse_res = _nss_nisplus_parse_pwent (result, pw, buffer, buflen, errnop);
|
||||
|
||||
if (parse_res < 1)
|
||||
{
|
||||
if (parse_res == -1)
|
||||
{
|
||||
*errnop = ERANGE;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
__set_errno (olderr);
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
}
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
nis_freeresult (result);
|
||||
|
||||
if (__builtin_expect (parse_res < 1, 0))
|
||||
{
|
||||
if (parse_res == -1)
|
||||
{
|
||||
*errnop = ERANGE;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
__set_errno (olderr);
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
}
|
||||
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1997, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1997, 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
|
||||
|
||||
|
|
@ -30,29 +30,12 @@
|
|||
__libc_lock_define_initialized (static, lock)
|
||||
|
||||
static nis_result *result;
|
||||
static nis_name tablename_val;
|
||||
static u_long tablename_len;
|
||||
|
||||
static enum nss_status
|
||||
_nss_create_tablename (int *errnop)
|
||||
{
|
||||
if (tablename_val == NULL)
|
||||
{
|
||||
char buf [40 + strlen (nis_local_directory ())];
|
||||
char *p;
|
||||
/* Defined in nisplus-pwd.c. */
|
||||
extern nis_name pwd_tablename_val attribute_hidden;
|
||||
extern size_t pwd_tablename_len attribute_hidden;
|
||||
extern enum nss_status _nss_pwd_create_tablename (int *errnop);
|
||||
|
||||
p = __stpcpy (buf, "passwd.org_dir.");
|
||||
p = __stpcpy (p, nis_local_directory ());
|
||||
tablename_val = __strdup (buf);
|
||||
if (tablename_val == NULL)
|
||||
{
|
||||
*errnop = errno;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
tablename_len = strlen (tablename_val);
|
||||
}
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
enum nss_status
|
||||
_nss_nisplus_setspent (int stayopen)
|
||||
|
|
@ -62,12 +45,14 @@ _nss_nisplus_setspent (int stayopen)
|
|||
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
if (result)
|
||||
nis_freeresult (result);
|
||||
result = NULL;
|
||||
if (result != NULL)
|
||||
{
|
||||
nis_freeresult (result);
|
||||
result = NULL;
|
||||
}
|
||||
|
||||
if (tablename_val == NULL)
|
||||
status = _nss_create_tablename (&err);
|
||||
if (pwd_tablename_val == NULL)
|
||||
status = _nss_pwd_create_tablename (&err);
|
||||
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
|
|
@ -79,9 +64,11 @@ _nss_nisplus_endspent (void)
|
|||
{
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
if (result)
|
||||
nis_freeresult (result);
|
||||
result = NULL;
|
||||
if (result != NULL)
|
||||
{
|
||||
nis_freeresult (result);
|
||||
result = NULL;
|
||||
}
|
||||
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
|
|
@ -103,25 +90,22 @@ internal_nisplus_getspent_r (struct spwd *sp, char *buffer, size_t buflen,
|
|||
{
|
||||
saved_res = NULL;
|
||||
|
||||
if (tablename_val == NULL)
|
||||
if (pwd_tablename_val == NULL)
|
||||
{
|
||||
enum nss_status status = _nss_create_tablename (errnop);
|
||||
enum nss_status status = _nss_pwd_create_tablename (errnop);
|
||||
|
||||
if (status != NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
|
||||
result = nis_first_entry (tablename_val);
|
||||
result = nis_first_entry (pwd_tablename_val);
|
||||
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
||||
return niserr2nss (result->status);
|
||||
}
|
||||
else
|
||||
{
|
||||
nis_result *res;
|
||||
|
||||
saved_res = result;
|
||||
res = nis_next_entry (tablename_val, &result->cookie);
|
||||
result = res;
|
||||
result = nis_next_entry (pwd_tablename_val, &result->cookie);
|
||||
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
||||
{
|
||||
nis_freeresult (saved_res);
|
||||
|
|
@ -131,19 +115,18 @@ internal_nisplus_getspent_r (struct spwd *sp, char *buffer, size_t buflen,
|
|||
|
||||
parse_res = _nss_nisplus_parse_spent (result, sp, buffer,
|
||||
buflen, errnop);
|
||||
if (parse_res == -1)
|
||||
if (__builtin_expect (parse_res == -1, 0))
|
||||
{
|
||||
nis_freeresult (result);
|
||||
result = saved_res;
|
||||
*errnop = ERANGE;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (saved_res)
|
||||
nis_freeresult (saved_res);
|
||||
}
|
||||
} while (!parse_res);
|
||||
|
||||
if (saved_res != NULL)
|
||||
nis_freeresult (saved_res);
|
||||
}
|
||||
while (!parse_res);
|
||||
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
@ -169,9 +152,13 @@ _nss_nisplus_getspnam_r (const char *name, struct spwd *sp,
|
|||
{
|
||||
int parse_res;
|
||||
|
||||
if (tablename_val == NULL)
|
||||
if (pwd_tablename_val == NULL)
|
||||
{
|
||||
enum nss_status status = _nss_create_tablename (errnop);
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
enum nss_status status = _nss_pwd_create_tablename (errnop);
|
||||
|
||||
__libc_lock_unlock (lock);
|
||||
|
||||
if (status != NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
|
|
@ -182,48 +169,47 @@ _nss_nisplus_getspnam_r (const char *name, struct spwd *sp,
|
|||
*errnop = EINVAL;
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
else
|
||||
|
||||
nis_result *result;
|
||||
char buf[strlen (name) + 9 + pwd_tablename_len];
|
||||
int olderr = errno;
|
||||
|
||||
snprintf (buf, sizeof (buf), "[name=%s],%s", name, pwd_tablename_val);
|
||||
|
||||
result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
nis_result *result;
|
||||
char buf[strlen (name) + 24 + tablename_len];
|
||||
int olderr = errno;
|
||||
*errnop = ENOMEM;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
|
||||
sprintf (buf, "[name=%s],%s", name, tablename_val);
|
||||
if (__builtin_expect (niserr2nss (result->status) != NSS_STATUS_SUCCESS, 0))
|
||||
{
|
||||
enum nss_status status = niserr2nss (result->status);
|
||||
|
||||
result = nis_list (buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
|
||||
__set_errno (olderr);
|
||||
|
||||
if (result == NULL)
|
||||
nis_freeresult (result);
|
||||
return status;
|
||||
}
|
||||
|
||||
parse_res = _nss_nisplus_parse_spent (result, sp, buffer, buflen, errnop);
|
||||
nis_freeresult (result);
|
||||
|
||||
if (__builtin_expect (parse_res < 1, 0))
|
||||
{
|
||||
if (parse_res == -1)
|
||||
{
|
||||
*errnop = ENOMEM;
|
||||
*errnop = ERANGE;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
if (niserr2nss (result->status) != NSS_STATUS_SUCCESS)
|
||||
else
|
||||
{
|
||||
enum nss_status status = niserr2nss (result->status);
|
||||
|
||||
__set_errno (olderr);
|
||||
|
||||
nis_freeresult (result);
|
||||
return status;
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
|
||||
parse_res = _nss_nisplus_parse_spent (result, sp, buffer, buflen,
|
||||
errnop);
|
||||
nis_freeresult (result);
|
||||
|
||||
if (parse_res < 1)
|
||||
{
|
||||
if (parse_res == -1)
|
||||
{
|
||||
*errnop = ERANGE;
|
||||
return NSS_STATUS_TRYAGAIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
__set_errno (olderr);
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
}
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue