79 lines
1.5 KiB
C
79 lines
1.5 KiB
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);
|
|
}
|