* Copyright (c) 1989 The Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)pwcache.c 5.4 (Berkeley) 6/1/90";
#endif /* LIBC_SCCS and not lint */
#define NCACHE 64 /* power of 2 */
#define MASK NCACHE - 1 /* bits to store with */
user_from_uid(uid
, nouser
)
char name
[UT_NAMESIZE
+ 1];
static char nbuf
[15]; /* 32 bits == 10 digits */
register struct passwd
*pw
;
register struct ncache
*cp
;
cp
= c_uid
+ (uid
& MASK
);
if (cp
->uid
!= uid
|| !*cp
->name
) {
if (!(pw
= getpwuid(uid
))) {
(void)sprintf(nbuf
, "%u", uid
);
(void)strncpy(cp
->name
, pw
->pw_name
, UT_NAMESIZE
);
cp
->name
[UT_NAMESIZE
] = '\0';
group_from_gid(gid
, nogroup
)
static char nbuf
[15]; /* 32 bits == 10 digits */
register struct group
*gr
;
register struct ncache
*cp
;
cp
= c_gid
+ (gid
& MASK
);
if (cp
->gid
!= gid
|| !*cp
->name
) {
if (!(gr
= getgrgid(gid
))) {
(void)sprintf(nbuf
, "%u", gid
);
(void)strncpy(cp
->name
, gr
->gr_name
, UT_NAMESIZE
);
cp
->name
[UT_NAMESIZE
] = '\0';