⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conflict.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
/* conflict.c - the new conflict */#ifndef	lintstatic char ident[] = "@(#)$Id: conflict.c,v 1.2 90/11/25 19:04:32 sharpe Exp $";#endif	lint#include "../h/mh.h"#include "../h/aliasbr.h"#include "../h/local.h"#include <stdio.h>#include "../zotnet/mts.h"#include <grp.h>#include <pwd.h>#define	NDIRS	100#define	NGRPS	100/*  */static struct swit switches[] = {#define	MAILSW	0    "mail name", 0,#define	SERCHSW	1    "search directory", 0,#define	HELPSW	2    "help", 4,    NULL, NULL};/*  */static	char   *mail = NULL;static	char   *dirs[NDIRS];static	FILE * out = NULL;extern struct aka  *akahead;extern struct home *homehead;struct	group *getgrent (),*getgrgid();/*  *//* ARGSUSED */main (argc, argv)int     argc;char   *argv[];{    int	    akp = 0,            dp = 0;    char   *cp,          **argp = argv + 1,            buf[80],           *akv[50];    invo_name = r1bindex (argv[0], '/');    m_foil (NULLCP);    mts_init (invo_name);/*  */    while (cp = *argp++) {	if (*cp == '-')	    switch (smatch (++cp, switches)) {		case AMBIGSW: 		    ambigsw (cp, switches);		    done (1);		case UNKWNSW: 		    adios (NULLCP, "-%s unknown", cp);		case HELPSW: 		    (void) sprintf (buf, "%s [switches] [aliasfiles ...]",			    invo_name);		    help (buf, switches);		    done (1);		case MAILSW: 		    if (!(cp = *argp++) || *cp == '-')			adios (NULLCP, "missing argument to %s", argp[-2]);		    if (mail)			adios (NULLCP, "mail to one address only");		    else			mail = cp;		    continue;		case SERCHSW: 		    if (!(cp = *argp++) || *cp == '-')			adios (NULLCP, "missing argument to %s", argp[-2]);		    if (dp >= NDIRS)			adios (NULLCP, "more than %d directories", NDIRS);		    dirs[dp++] = cp;		    continue;	    }	akv[akp++] = cp;    }/*  */    if (akp == 0)	akv[akp++] = AliasFile;    if (!homehead)	init_pw ();    if (!mail)	out = stdout;    dirs[dp] = NULL;    alias_files (akp, akv);    pwd_names ();    grp_names ();    grp_members ();    grp_ids ();#ifdef	UCI    ldr_names ();    ldr_ship ();#endif	UCI    maildrops ();    done (0);}/*  */alias_files (akp, akv)int     akp;register char   **akv;{    register int    i, err;    for (i = 0; i < akp; i++)	if ((err = alias (akv[i])) != AK_OK) {	    setup ();	    fprintf (out, "aliasing error in %s - %s\n", akv[i], akerror (err));	}	else	    if (out && !mail)		fprintf (out, "alias file %s is ok\n", akv[i]);}/*  */pwd_names () {    int     hit = 0;    register struct home   *hm,                           *lm;    for (hm = homehead; hm; hm = hm -> h_next)	for (lm = hm -> h_next; lm; lm = lm -> h_next)	    if (strcmp (hm -> h_name, lm -> h_name) == 0) {		setup ();		fprintf (out, "duplicate user %s(uid=%d)\n",			lm -> h_name, lm -> h_uid);		hit++;	    }    if (!hit && out && !mail)	fprintf (out, "no duplicate users\n");}grp_names () {    register int    gp,                    hit = 0;    char   *grps[NGRPS];    register struct group  *gr;    grps[0] = NULL;    (void) setgrent ();    while (gr = getgrent ()) {	for (gp = 0; grps[gp]; gp++)	    if (strcmp (grps[gp], gr -> gr_name) == 0) {		setup ();		fprintf (out, "duplicate group %s(gid=%d)\n",			gr -> gr_name, gr -> gr_gid);		hit++;		break;	    }	if (grps[gp] == NULL)	    if (gp < NGRPS) {		grps[gp++] = getcpy (gr -> gr_name);		grps[gp] = NULL;	    }	    else {		setup ();		fprintf (out, "more than %d groups (time to recompile)\n",			NGRPS - 1);		hit++;	    }    }    (void) endgrent ();    for (gp = 0; grps[gp]; gp++)	free (grps[gp]);    if (!hit && out && !mail)	fprintf (out, "no duplicate groups\n");}/*  */grp_members () {    register int    hit = 0;    register char **cp,                  **dp;    register struct group  *gr;    register struct home   *hm;    (void) setgrent ();    while (gr = getgrent ())	for (cp = gr -> gr_mem; *cp; cp++) {	    for (hm = homehead; hm; hm = hm -> h_next)		if (!strcmp (*cp, hm -> h_name))		    break;	    if (hm == NULL) {		setup ();		fprintf (out, "group %s(gid=%d) has unknown member %s\n",			gr -> gr_name, gr -> gr_gid, *cp);		hit++;	    }#ifdef	BSD42	    else		hm -> h_ngrps++;#endif	BSD42	    for (dp = cp + 1; *dp; dp++)		if (strcmp (*cp, *dp) == 0) {		    setup ();		    fprintf (out, "group %s(gid=%d) has duplicate member %s\n",			    gr -> gr_name, gr -> gr_gid, *cp);		    hit++;		}	}    (void) endgrent ();#ifdef	BSD42    for (hm = homehead; hm; hm = hm -> h_next)	if (hm -> h_ngrps > NGROUPS) {	    setup ();	    fprintf (out, "user %s is a member of %d groups (max %d)",		    hm -> h_name, hm -> h_ngrps, NGROUPS);	    hit++;	}#endif	BSD42    if (!hit && out && !mail)	fprintf (out, "all group members accounted for\n");}grp_ids () {		/* -DRAND not implemented at most places */    register int    hit = 0;    register struct home   *hm;    for (hm = homehead; hm; hm = hm -> h_next)	if (getgrgid (hm -> h_gid) == NULL) {	    setup ();	    fprintf (out, "user %s(uid=%d) has unknown group-id %d\n",		    hm -> h_name, hm -> h_uid, hm -> h_gid);	    hit++;	}    if (!hit && out && !mail)	fprintf (out, "all group-id users accounted for\n");}/*  */maildrops () {    register int    i;    if (mmdfldir && *mmdfldir)	mdrop (mmdfldir);    if (uucpldir && *uucpldir)	mdrop (uucpldir);    for (i = 0; dirs[i]; i++)	mdrop (dirs[i]);}mdrop(drop)register char *drop;{    register int    hit = 0;#ifdef SYS5DIR    register struct dirent *dp;#else  SYS5DIR    register struct direct *dp;#endif SYS5DIR    register DIR *dd = opendir (drop);    if (!dd) {	setup ();	fprintf (out, "unable to open maildrop area %s\n", drop);	return;    }    while (dp = readdir (dd))	if (dp -> d_name[0] != '.' && !check (dp ->d_name)) {	    setup ();	    fprintf (out,		    "there is a maildrop for the unknown user %s in %s\n",		    dp -> d_name, drop);	    hit++;	}    closedir (dd);    if (!hit && out && !mail)	fprintf (out, "all maildrops accounted for in %s\n", drop);}/*  */int     check (s)register char   *s;{    register struct home *hm;    for (hm = homehead; hm; hm = hm -> h_next)	if (!strcmp (s, hm -> h_name))	    return 1;    return 0;}/*  */setup () {    int     fd,            pd[2];    if (out)	return;    if (mail) {	if (pipe (pd) == NOTOK)	    adios ("pipe", "unable to");	switch (fork ()) {	    case NOTOK: 		adios ("fork", "unable to");	    case OK: 		(void) close (pd[1]);		if (pd[0] != 0) {		    (void) dup2 (pd[0], 0);		    (void) close (pd[0]);		}		if ((fd = open ("/dev/null", 1)) != NOTOK)		    if (fd != 1) {			(void) dup2 (fd, 1);			(void) close (fd);		    }		execlp (mailproc, r1bindex (mailproc, '/'),			mail, "-subject", invo_name, NULLCP);		adios (mailproc, "unable to exec ");	    default: 		(void) close (pd[0]);		out = fdopen (pd[1], "w");		fprintf (out, "%s: the following is suspicious\n\n",			invo_name);	}    }}/*  */#ifdef	UCI/* UCI specific stuff for conflict *//* taken from <grpldr.h> */#define	GLDRS	"/admin/etc/GroupLeaders"struct grpldr {    char *gl_name;    char **gl_ldr;};int	setglent (), endglent ();struct grpldr *getglent (), *getglnam ();/* taken from the getglent() routines */#include <ctype.h>#define	MAXGLS	100static FILE *glp = NULL;static char line[BUFSIZ+1];static struct grpldr grpldr;static char *gl_ldr[MAXGLS + 1];/*  */setglent() {    if (glp == NULL)	glp = fopen (GLDRS, "r");    else	rewind (glp);    return (glp != NULL);}endglent() {    if (glp != NULL) {	(void) fclose (glp);	glp = NULL;    }    return 1;}/*  */struct grpldr  *getglent () {    register char  *cp,                  **q;    if (glp == NULL && !setglent ())	return NULL;    if ((cp = fgets (line, BUFSIZ, glp)) == NULL)	return NULL;    grpldr.gl_name = cp;    grpldr.gl_ldr = q = gl_ldr;    while (*cp) {	while (*cp && !isspace (*cp))	    cp++;	while (*cp && isspace (*cp))	    *cp++ = NULL;	if (*cp == NULL)	    break;	if (q < gl_ldr + MAXGLS)	    *q++ = cp;	else	    break;    }    *q = NULL;    return (&grpldr);}/*  */struct grpldr  *getglnam (name)char   *name;{    register struct grpldr  *gl = NULL;    (void) setglent ();    while (gl = getglent ())	if (strcmp (name, gl -> gl_name) == 0)	    break;    (void) endglent ();    return gl;}/*  */ldr_names () {    register int     gp,		     hit = 0;    char   *gldrs[NGRPS];    register struct grpldr  *gl;    gldrs[0] = NULL;    (void) setglent ();    while (gl = getglent ()) {	if (getgrnam (gl -> gl_name) == NULL) {	    setup ();	    fprintf (out, "unknown group %s in group leaders file\n",		    gl -> gl_name);	    hit++;	}	for (gp = 0; gldrs[gp]; gp++)	    if (strcmp (gldrs[gp], gl -> gl_name) == 0) {		setup ();		fprintf (out, "duplicate group %s in group leaders file\n",			gl -> gl_name);		hit++;		break;	    }	if (gldrs[gp] == NULL)	    if (gp < NGRPS) {		gldrs[gp++] = getcpy (gl -> gl_name);		gldrs[gp] = NULL;	    }	    else {		setup ();		fprintf (out, "more than %d groups in group leaders file%s\n",			" (time to recompile)", NGRPS - 1);		hit++;	    }    }    (void) endglent ();    for (gp = 0; gldrs[gp]; gp++)	free (gldrs[gp]);    if (!hit && out && !mail)	fprintf (out, "all groups in group leaders file accounted for\n");}ldr_ship () {    register int     hit = 0;    register char  **cp,		   **dp;    register struct grpldr  *gl;    (void) setglent ();    while (gl = getglent ())	for (cp = gl -> gl_ldr; *cp; cp++) {	    if (!check (*cp)) {		setup ();		fprintf (out, "group %s has unknown leader %s\n",			gl -> gl_name, *cp);		hit++;	    }	    for (dp = cp + 1; *dp; dp++)		if (strcmp (*cp, *dp) == 0) {		    setup ();		    fprintf (out, "group %s had duplicate leader %s\n",			    gl -> gl_name, *cp);		    hit++;		}	}    (void) endglent ();    if (!hit && out && !mail)	fprintf (out, "all group leaders accounted for\n");}#endif	UCI

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -