1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-12-24 17:51:17 +03:00
1998-09-01 10:34  Ulrich Drepper  <drepper@cygnus.com>

	* manual/locale.texi: Almost compelte rewrite.  Document more functions
	and functionality.
	* manual/arith.texi: Correct reference.
	* manual/string.texi: Pretty printing.

	* manual/texinfo.tex: Update from last available version.

1998-08-31 22:44  Ulrich Drepper  <drepper@cygnus.com>

	* nis/nss_nis/nis-pwd.c (_nss_nis_getpwnam_r): Correct test for
	invalid password.
	(_nss_nis_getpwuid_r): Likewise.
	Patch by Matthew Arnison <matthewa@physics.usyd.edu.au>.

	* inet/rcmd.c: Implement netgroup support.
	Patch by Dick Streefland <dick_streefland@tasking.com>.
This commit is contained in:
Ulrich Drepper
1998-09-01 10:41:59 +00:00
parent 6a805a0b40
commit 85c165befc
9 changed files with 820 additions and 148 deletions

View File

@@ -55,8 +55,10 @@ static char sccsid[] = "@(#)rcmd.c 8.3 (Berkeley) 3/26/94";
#include <string.h>
int __ivaliduser __P((FILE *, u_int32_t, const char *, const char *));
static int __icheckhost __P((u_int32_t, char *)) internal_function;
int __ivaliduser __P ((FILE *, u_int32_t, const char *, const char *));
static int __ivaliduser2 __P ((FILE *, u_int32_t, const char *, const char *,
const char *));
int
rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
@@ -283,7 +285,7 @@ ruserok(rhost, superuser, ruser, luser)
for (ap = hp->h_addr_list; *ap; ++ap) {
bcopy(*ap, &addr, sizeof(addr));
if (iruserok(addr, superuser, ruser, luser) == 0)
if (iruserok(addr, superuser, ruser, luser, rhost) == 0)
return 0;
}
return -1;
@@ -341,11 +343,11 @@ iruserfopen (char *file, uid_t okuser)
*
* Returns 0 if ok, -1 if not ok.
*/
int
iruserok (raddr, superuser, ruser, luser)
static int
iruserok2 (raddr, superuser, ruser, luser, rhost)
u_int32_t raddr;
int superuser;
const char *ruser, *luser;
const char *ruser, *luser, *rhost;
{
FILE *hostf = NULL;
int isbad;
@@ -355,7 +357,7 @@ iruserok (raddr, superuser, ruser, luser)
if (hostf)
{
isbad = __ivaliduser (hostf, raddr, luser, ruser);
isbad = __ivaliduser2 (hostf, raddr, luser, ruser, rhost);
fclose (hostf);
if (!isbad)
@@ -388,7 +390,7 @@ iruserok (raddr, superuser, ruser, luser)
if (hostf != NULL)
{
isbad = __ivaliduser (hostf, raddr, luser, ruser);
isbad = __ivaliduser2 (hostf, raddr, luser, ruser, rhost);
fclose (hostf);
}
@@ -398,10 +400,25 @@ iruserok (raddr, superuser, ruser, luser)
return -1;
}
/* This is the exported version. */
int
iruserok (raddr, superuser, ruser, luser)
u_int32_t raddr;
int superuser;
const char *ruser, *luser;
{
return iruserok2 (raddr, superuser, ruser, luser, "-");
}
/*
* XXX
* Don't make static, used by lpd(8).
*
* This function is not used anymore. It is only present because lpd(8)
* calls it (!?!). We simply call __invaliduser2() with an illegal rhost
* argument. This means that netgroups won't work in .rhost/hosts.equiv
* files. If you want lpd to work with netgroups, fix lpd to use ruserok()
* or PAM.
* Returns 0 if ok, -1 if not ok.
*/
int
@@ -410,87 +427,194 @@ __ivaliduser(hostf, raddr, luser, ruser)
u_int32_t raddr;
const char *luser, *ruser;
{
register char *user, *p;
int ch;
char *buf = NULL;
char *cp;
size_t bufsize = 0;
ssize_t nread;
while ((nread = __getline (&buf, &bufsize, hostf)) > 0) {
buf[bufsize - 1] = '\0'; /* Make sure it's terminated. */
/* Because the file format does not know any form of quoting we
can search forward for the next '#' character and if found
make it terminating the line. */
cp = strchr (buf, '#');
if (cp != NULL)
*cp = '\0';
p = buf;
while (*p != '\n' && *p != ' ' && *p != '\t' && *p != '\0') {
*p = isupper(*p) ? tolower(*p) : *p;
p++;
}
if (*p == ' ' || *p == '\t') {
*p++ = '\0';
while (*p == ' ' || *p == '\t')
p++;
user = p;
while (*p != '\n' && *p != ' ' &&
*p != '\t' && *p != '\0')
p++;
} else
user = p;
*p = '\0';
if (__icheckhost(raddr, buf) &&
strcmp(ruser, *user ? user : luser) == 0) {
free (buf);
return 0;
}
}
if (buf != NULL)
free (buf);
return -1;
return __ivaliduser2(hostf, raddr, luser, ruser, "-");
}
/*
* Returns "true" if match, 0 if no match.
*/
/* Returns 1 on positive match, 0 on no match, -1 on negative match. */
static int
internal_function
__icheckhost(raddr, lhost)
__icheckhost (raddr, lhost, rhost)
u_int32_t raddr;
register char *lhost;
char *lhost;
const char *rhost;
{
struct hostent hostbuf, *hp;
size_t buflen;
char *buffer;
register u_int32_t laddr;
register char **pp;
int herr;
int save_errno;
u_int32_t laddr;
int negate=1; /* Multiply return with this to get -1 instead of 1 */
char **pp, *user;
/* Check nis netgroup. */
if (strncmp ("+@", lhost, 2) == 0)
return innetgr (&lhost[2], rhost, NULL, NULL);
if (strncmp ("-@", lhost, 2) == 0)
return -innetgr (&lhost[2], rhost, NULL, NULL);
/* -host */
if (strncmp ("-", lhost,1) == 0) {
negate = -1;
lhost++;
} else if (strcmp ("+",lhost) == 0) {
return 1; /* asking for trouble, but ok.. */
}
/* Try for raw ip address first. */
if (isdigit(*lhost) && (int32_t)(laddr = inet_addr(lhost)) != -1)
return raddr == laddr;
if (isdigit (*lhost) && (long) (laddr = inet_addr (lhost)) != -1)
return negate * (! (raddr ^ laddr));
/* Better be a hostname. */
buflen = 1024;
buffer = __alloca (buflen);
save_errno = errno;
while (__gethostbyname_r (lhost, &hostbuf, buffer, buflen, &hp, &herr)
< 0)
if (herr != NETDB_INTERNAL || errno != ERANGE)
return 0;
else
{
/* Enlarge the buffer. */
buflen *= 2;
buffer = __alloca (buflen);
}
if (herr != NETDB_INTERNAL || errno != ERANGE)
return (0);
else {
/* Enlarge the buffer. */
buflen *= 2;
buffer = __alloca (buflen);
__set_errno (0);
}
__set_errno (save_errno);
if (hp == NULL)
return 0;
/* Spin through ip addresses. */
for (pp = hp->h_addr_list; *pp; ++pp)
if (!memcmp(&raddr, *pp, sizeof(u_int32_t)))
return 1;
if (!memcmp (&raddr, *pp, sizeof (u_int32_t)))
return negate;
/* No match. */
return 0;
return (0);
}
/* Returns 1 on positive match, 0 on no match, -1 on negative match. */
static int
internal_function
__icheckuser (luser, ruser)
const char *luser, *ruser;
{
/*
luser is user entry from .rhosts/hosts.equiv file
ruser is user id on remote host
*/
char *user;
/* [-+]@netgroup */
if (strncmp ("+@", luser, 2) == 0)
return innetgr (&luser[2], NULL, ruser, NULL);
if (strncmp ("-@", luser,2) == 0)
return -innetgr (&luser[2], NULL, ruser, NULL);
/* -user */
if (strncmp ("-", luser, 1) == 0)
return -(strcmp (&luser[1], ruser) == 0);
/* + */
if (strcmp ("+", luser) == 0)
return 1;
/* simple string match */
return strcmp (ruser, luser) == 0;
}
/*
* Returns 1 for blank lines (or only comment lines) and 0 otherwise
*/
static int
__isempty(p)
char *p;
{
while (*p && isspace (*p)) {
++p;
}
return (*p == '\0' || *p == '#') ? 1 : 0 ;
}
/*
* Returns 0 if positive match, -1 if _not_ ok.
*/
static int
__ivaliduser2(hostf, raddr, luser, ruser, rhost)
FILE *hostf;
u_int32_t raddr;
const char *luser, *ruser, *rhost;
{
register const char *user;
register char *p;
int hcheck, ucheck;
char *buf = NULL;
size_t bufsize = 0;
while (__getline (&buf, &bufsize, hostf) > 0) {
buf[bufsize - 1] = '\0'; /* Make sure it's terminated. */
p = buf;
/* Skip empty or comment lines */
if (__isempty (p)) {
continue;
}
/* Skip lines that are too long. */
if (strchr (p, '\n') == NULL) {
int ch = getc (hostf);
while (ch != '\n' && ch != EOF)
ch = getc (hostf);
continue;
}
for (;*p && !isspace(*p); ++p) {
*p = tolower (*p);
}
/* Next we want to find the permitted name for the remote user. */
if (*p == ' ' || *p == '\t') {
/* <nul> terminate hostname and skip spaces */
for (*p++='\0'; *p && isspace (*p); ++p);
user = p; /* this is the user's name */
while (*p && !isspace (*p))
++p; /* find end of user's name */
} else
user = p;
*p = '\0'; /* <nul> terminate username (+host?) */
/* buf -> host(?) ; user -> username(?) */
/* First check host part */
hcheck = __icheckhost (raddr, buf, rhost);
if (hcheck < 0)
return -1;
if (hcheck) {
/* Then check user part */
if (! (*user))
user = luser;
ucheck = __icheckuser (user, ruser);
/* Positive 'host user' match? */
if (ucheck > 0)
return 0;
/* Negative 'host -user' match? */
if (ucheck < 0)
return -1;
/* Neither, go on looking for match */
}
}
return -1;
}