X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fconflict.c;h=3670e8e73cd5d29dcb548944865f72919779e580;hp=07e77fc97eda8648d9b1be3f9f37eb10c557bcb0;hb=5b92ee6942b9b466914f5faa5fa4c00a2ebc6d35;hpb=5dd6771b28c257af405d7248639ed0e3bcdce38b diff --git a/uip/conflict.c b/uip/conflict.c index 07e77fc..3670e8e 100644 --- a/uip/conflict.c +++ b/uip/conflict.c @@ -1,41 +1,39 @@ - /* - * conflict.c -- check for conflicts in mail system - * - * This code is Copyright (c) 2002, by the authors of nmh. See the - * COPYRIGHT file in the root directory of the nmh distribution for - * complete copyright information. - */ +** conflict.c -- check for conflicts in mail system +** +** This code is Copyright (c) 2002, by the authors of nmh. See the +** COPYRIGHT file in the root directory of the nmh distribution for +** complete copyright information. +*/ #include #include #include -#include #include #include #include /* - * maximum number of directories that can - * be specified using -search switch. - */ -#define NDIRS 100 +** maximum number of directories that can +** be specified using -search switch. +*/ +#define NDIRS 100 /* - * Add space for group names, 100 at a time - */ -#define NGRPS 100 +** Add space for group names, 100 at a time +*/ +#define NGRPS 100 static struct swit switches[] = { -#define MAILSW 0 - { "mail name", 0 }, -#define SERCHSW 1 - { "search directory", 0 }, -#define VERSIONSW 2 - { "version", 0 }, -#define HELPSW 3 - { "help", 0 }, - { NULL, 0 } +#define MAILSW 0 + { "mail name", 0 }, +#define SERCHSW 1 + { "search directory", 0 }, +#define VERSIONSW 2 + { "version", 0 }, +#define HELPSW 3 + { "help", 0 }, + { NULL, 0 } }; static char *mail = NULL; @@ -46,502 +44,323 @@ extern struct aka *akahead; extern struct home *homehead; /* - * prototypes - */ -void alias_files (int, char **); -void pwd_names (void); -void grp_names (void); -void grp_members (void); -void grp_ids (void); -void maildrops (void); +** prototypes +*/ +void alias_files(int, char **); +void pwd_names(void); +void grp_names(void); +void grp_members(void); +void grp_ids(void); +void maildrops(void); void mdrop(char *); -int check (char *); -void setup (void); +int check(char *); +void setup(void); int -main (int argc, char **argv) +main(int argc, char **argv) { - int akp = 0, dp = 0; - char *cp, **argp, **arguments; - char buf[BUFSIZ], *akv[50]; + int akp = 0, dp = 0; + char *cp, **argp, **arguments; + char buf[BUFSIZ], *akv[50]; #ifdef LOCALE - setlocale(LC_ALL, ""); + setlocale(LC_ALL, ""); #endif - invo_name = r1bindex (argv[0], '/'); - - /* foil search of user profile/context */ - if (context_foil (NULL) == -1) - done (1); - - mts_init (invo_name); - arguments = getarguments (invo_name, argc, argv, 0); - argp = arguments; - - while ((cp = *argp++)) { - if (*cp == '-') { - switch (smatch (++cp, switches)) { - case AMBIGSW: - ambigsw (cp, switches); - done (1); - case UNKWNSW: - adios (NULL, "-%s unknown", cp); - - case HELPSW: - snprintf (buf, sizeof(buf), "%s [switches] [aliasfiles ...]", - invo_name); - print_help (buf, switches, 0); - done (1); - case VERSIONSW: - print_version(invo_name); - done (1); - - case MAILSW: - if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); - if (mail) - adios (NULL, "mail to one address only"); - else - mail = cp; - continue; - - case SERCHSW: - if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); - if (dp >= NDIRS) - adios (NULL, "more than %d directories", NDIRS); - dirs[dp++] = cp; - continue; - } + invo_name = mhbasename(argv[0]); + + /* foil search of user profile/context */ + if (context_foil(NULL) == -1) + done(1); + + arguments = getarguments(invo_name, argc, argv, 0); + argp = arguments; + + while ((cp = *argp++)) { + if (*cp == '-') { + switch (smatch(++cp, switches)) { + case AMBIGSW: + ambigsw(cp, switches); + done(1); + case UNKWNSW: + adios(NULL, "-%s unknown", cp); + + case HELPSW: + snprintf(buf, sizeof(buf), "%s [switches] [aliasfiles ...]", invo_name); + print_help(buf, switches, 0); + done(1); + case VERSIONSW: + print_version(invo_name); + done(1); + + case MAILSW: + if (!(cp = *argp++) || *cp == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + if (mail) + adios(NULL, "mail to one address only"); + else + mail = cp; + continue; + + case SERCHSW: + if (!(cp = *argp++) || *cp == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + if (dp >= NDIRS) + adios(NULL, "more than %d directories", + NDIRS); + dirs[dp++] = cp; + continue; + } + } + akv[akp++] = cp; } - 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); - return 1; + + if (!homehead) + init_pw(); + if (!mail) + out = stdout; + dirs[dp] = NULL; + + alias_files(akp, akv); + pwd_names(); + grp_names(); + grp_members(); + grp_ids(); + maildrops(); + + done(0); + return 1; } void -alias_files (int akp, char **akv) +alias_files(int akp, 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]); + 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]); } void -pwd_names (void) +pwd_names(void) { - 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, (int) lm->h_uid); - hit++; - } - - if (!hit && out && !mail) - fprintf (out, "no duplicate users\n"); + 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, (int) lm->h_uid); + hit++; + } + + if (!hit && out && !mail) + fprintf(out, "no duplicate users\n"); } void -grp_names (void) +grp_names(void) { - int numgroups, maxgroups; - int i, hit = 0; - char **grps; - struct group *gr; - - /* allocate space NGRPS at a time */ - numgroups = 0; - maxgroups = NGRPS; - grps = (char **) mh_xmalloc((size_t) (maxgroups * sizeof(*grps))); - - setgrent (); - while ((gr = getgrent ())) { - for (i = 0; i < numgroups; i++) - if (!strcmp (grps[i], gr->gr_name)) { - setup (); - fprintf (out, "duplicate group %s(gid=%d)\n", - gr->gr_name, (int) gr->gr_gid); - hit++; - break; - } - if (i >= numgroups) { - if (numgroups >= maxgroups) { - maxgroups += NGRPS; - grps = (char **) mh_xrealloc(grps, - (size_t) (maxgroups * sizeof(*grps))); - } - grps[numgroups++] = getcpy (gr->gr_name); + int numgroups, maxgroups; + int i, hit = 0; + char **grps; + struct group *gr; + + /* allocate space NGRPS at a time */ + numgroups = 0; + maxgroups = NGRPS; + grps = (char **) mh_xmalloc((size_t) (maxgroups * sizeof(*grps))); + + setgrent(); + while ((gr = getgrent())) { + for (i = 0; i < numgroups; i++) + if (strcmp(grps[i], gr->gr_name)==0) { + setup(); + fprintf(out, "duplicate group %s(gid=%d)\n", + gr->gr_name, (int) gr->gr_gid); + hit++; + break; + } + if (i >= numgroups) { + if (numgroups >= maxgroups) { + maxgroups += NGRPS; + grps = (char **) mh_xrealloc(grps, + (size_t) (maxgroups * sizeof(*grps))); + } + grps[numgroups++] = getcpy(gr->gr_name); + } } - } - endgrent (); + endgrent(); - for (i = 0; i < numgroups; i++) - free (grps[i]); - free (grps); + for (i = 0; i < numgroups; i++) + free(grps[i]); + free(grps); - if (!hit && out && !mail) - fprintf (out, "no duplicate groups\n"); + if (!hit && out && !mail) + fprintf(out, "no duplicate groups\n"); } void -grp_members (void) +grp_members(void) { - register int hit = 0; - register char **cp, **dp; - register struct group *gr; - register struct home *hm; - - 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, (int) gr->gr_gid, *cp); - hit++; - } else { - hm->h_ngrps++; - } - - 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, (int) gr->gr_gid, *cp); - hit++; + register int hit = 0; + register char **cp, **dp; + register struct group *gr; + register struct home *hm; + + 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)==0) + break; + if (hm == NULL) { + setup(); + fprintf(out, "group %s(gid=%d) has unknown member %s\n", gr->gr_name, (int) gr->gr_gid, *cp); + hit++; + } else { + hm->h_ngrps++; + } + + 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, (int) gr->gr_gid, *cp); + hit++; + } } } - } - endgrent (); - - for (hm = homehead; hm; hm = hm->h_next) - if (hm->h_ngrps > NGROUPS_MAX) { - setup (); - fprintf (out, "user %s is a member of %d groups (max %d)\n", - hm->h_name, hm->h_ngrps, NGROUPS_MAX); - hit++; - } + endgrent(); + + for (hm = homehead; hm; hm = hm->h_next) + if (hm->h_ngrps > NGROUPS_MAX) { + setup(); + fprintf(out, "user %s is a member of %d groups (max %d)\n", + hm->h_name, hm->h_ngrps, NGROUPS_MAX); + hit++; + } - if (!hit && out && !mail) - fprintf (out, "all group members accounted for\n"); + if (!hit && out && !mail) + fprintf(out, "all group members accounted for\n"); } void -grp_ids (void) -{ /* -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, (int) hm->h_uid, (int) hm->h_gid); - hit++; - } +grp_ids(void) +{ /* -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, (int) hm->h_uid, (int) hm->h_gid); + hit++; + } - if (!hit && out && !mail) - fprintf (out, "all group-id users accounted for\n"); + if (!hit && out && !mail) + fprintf(out, "all group-id users accounted for\n"); } void -maildrops (void) +maildrops(void) { - register int i; - - if (mmdfldir && *mmdfldir) - mdrop (mmdfldir); - if (uucpldir && *uucpldir) - mdrop (uucpldir); - for (i = 0; dirs[i]; i++) - mdrop (dirs[i]); + register int i; + + mdrop(mailspool); + for (i = 0; dirs[i]; i++) + mdrop(dirs[i]); } void mdrop(char *drop) { - register int hit = 0; - register struct dirent *dp; - 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++; + register int hit = 0; + register struct dirent *dp; + register DIR *dd = opendir(drop); + + if (!dd) { + setup(); + fprintf(out, "unable to open maildrop area %s\n", drop); + return; } - closedir (dd); - if (!hit && out && !mail) - fprintf (out, "all maildrops accounted for in %s\n", drop); + 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 (char *s) +check(char *s) { - register struct home *hm; + register struct home *hm; - for (hm = homehead; hm; hm = hm->h_next) - if (!strcmp (s, hm->h_name)) - return 1; - return 0; + for (hm = homehead; hm; hm = hm->h_next) + if (strcmp(s, hm->h_name)==0) + return 1; + return 0; } void -setup (void) -{ - 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: - close (pd[1]); - if (pd[0] != 0) { - dup2 (pd[0], 0); - close (pd[0]); - } - if ((fd = open ("/dev/null", O_WRONLY)) != NOTOK) - if (fd != 1) { - dup2 (fd, 1); - close (fd); - } - execlp (mailproc, r1bindex (mailproc, '/'), - mail, "-subject", invo_name, NULL); - adios (mailproc, "unable to exec "); - - default: - 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 */ - -#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 */ - -#define MAXGLS 100 - -static 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) { - 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++ = '\0'; - if (*cp == '\0') - break; - if (q < gl_ldr + MAXGLS) - *q++ = cp; - else - break; - } - *q = NULL; - - return (&grpldr); -} - -struct grpldr *getglnam (name) -char *name; +setup(void) { - register struct grpldr *gl = NULL; - - setglent (); - while (gl = getglent ()) - if (strcmp (name, gl->gl_name) == 0) - break; - endglent (); - - return gl; -} - -ldr_names () { - register int gp, - hit = 0; - char *gldrs[NGRPS]; - register struct grpldr *gl; - - gldrs[0] = NULL; - 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++; - } - } - 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; - - 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++; + 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: + close(pd[1]); + if (pd[0] != 0) { + dup2(pd[0], 0); + close(pd[0]); + } + if ((fd = open("/dev/null", O_WRONLY)) + != NOTOK) + if (fd != 1) { + dup2(fd, 1); + close(fd); + } + execlp("mhmail", "mhmail", + mail, "-subject", invo_name, + NULL); + adios("mhmail", "unable to exec "); + + default: + close(pd[0]); + out = fdopen(pd[1], "w"); + fprintf(out, "%s: the following is suspicious\n\n", invo_name); } } - endglent (); - - if (!hit && out && !mail) - fprintf (out, "all group leaders accounted for\n"); } -#endif /* UCI */