Minix1.5/amoeba/util/prot.c
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#define isblank(c) ((c) == ' ' || (c) == '\t' || (c) == '\n')
#define MAXTOKEN 16
static char *gettok(fp)
FILE *fp;
{
static char buf[MAXTOKEN + 1];
register char c, *p = buf;
do /* skip blanks */
if ((c = getc(fp)) == EOF)
return(0);
while (isblank(c));
do {
if (c == '#') { /* skip comment */
while ((c = getc(fp)) != EOF)
if (c == '\n') break;
break;
}
*p++ = c;
} while (c != ':' && (c = getc(fp)) != EOF && !isblank(c));
*p++ = 0;
return(buf);
}
static number(p)
char *p;
{
int n;
return sscanf(p, "%d", &n) == 1 ? n : -1;
}
chkprot(chkfil, chkdefault, uid, gid)
char *chkfil;
char *chkdefault;
{
register userchk = 0, n;
register FILE *fp;
register char *p;
register struct passwd *pw;
register struct group *gr;
extern FILE *fopen();
extern struct passwd *getpwuid();
extern struct group *getgrgid();
pw = getpwuid(uid);
endpwent();
gr = getgrgid(gid);
endgrent();
if ((fp = fopen(chkfil, "r")) == NULL && (fp = fopen(chkdefault, "r")) == NULL)
return(-1);
while ((p = gettok(fp)) != 0)
if (strcmp(p, "group:") == 0)
userchk = 0;
else if (strcmp(p, "user:") == 0)
userchk = 1;
else if (userchk) {
if (pw && strcmp(p, pw->pw_name) == 0 ||
uid == number(p)) {
fclose(fp);
return(1);
}
}
else
if (gr && strcmp(p, gr->gr_name) == 0 ||
gid == number(p)) {
fclose(fp);
return(1);
}
return(0);
}