|
|
1.1 ! root 1: /* conflict.c - the new conflict */ ! 2: ! 3: #include "../h/mh.h" ! 4: #include "../h/aliasbr.h" ! 5: #include <stdio.h> ! 6: #include "../zotnet/mts.h" ! 7: #include <grp.h> ! 8: #include <pwd.h> ! 9: #ifndef BSD42 ! 10: #include <sys/types.h> ! 11: #ifndef SYS5 ! 12: #include <ndir.h> ! 13: #else SYS5 ! 14: #include <dir.h> ! 15: #endif SYS5 ! 16: #else BSD42 ! 17: #include <sys/param.h> ! 18: #include <sys/dir.h> ! 19: #endif BSD42 ! 20: ! 21: ! 22: #define NDIRS 100 ! 23: #define NGRPS 100 ! 24: ! 25: /* */ ! 26: ! 27: static struct swit switches[] = { ! 28: #define MAILSW 0 ! 29: "mail name", 0, ! 30: ! 31: #define SERCHSW 1 ! 32: "search directory", 0, ! 33: ! 34: #define HELPSW 2 ! 35: "help", 4, ! 36: ! 37: NULL, NULL ! 38: }; ! 39: ! 40: /* */ ! 41: ! 42: static char *mail = NULL; ! 43: ! 44: static char *dirs[NDIRS]; ! 45: ! 46: static FILE * out = NULL; ! 47: ! 48: ! 49: extern struct aka *akahead; ! 50: extern struct home *homehead; ! 51: ! 52: ! 53: struct group *getgrent (),*getgrgid(); ! 54: ! 55: /* */ ! 56: ! 57: /* ARGSUSED */ ! 58: ! 59: main (argc, argv) ! 60: int argc; ! 61: char *argv[]; ! 62: { ! 63: int akp = 0, ! 64: dp = 0; ! 65: char *cp, ! 66: **argp = argv + 1, ! 67: buf[80], ! 68: *akv[50]; ! 69: ! 70: invo_name = r1bindex (argv[0], '/'); ! 71: m_foil (NULLCP); ! 72: mts_init (invo_name); ! 73: ! 74: /* */ ! 75: ! 76: while (cp = *argp++) { ! 77: if (*cp == '-') ! 78: switch (smatch (++cp, switches)) { ! 79: case AMBIGSW: ! 80: ambigsw (cp, switches); ! 81: done (1); ! 82: case UNKWNSW: ! 83: adios (NULLCP, "-%s unknown", cp); ! 84: case HELPSW: ! 85: (void) sprintf (buf, "%s [switches] [aliasfiles ...]", ! 86: invo_name); ! 87: help (buf, switches); ! 88: done (1); ! 89: ! 90: case MAILSW: ! 91: if (!(cp = *argp++) || *cp == '-') ! 92: adios (NULLCP, "missing argument to %s", argp[-2]); ! 93: if (mail) ! 94: adios (NULLCP, "mail to one address only"); ! 95: else ! 96: mail = cp; ! 97: continue; ! 98: ! 99: case SERCHSW: ! 100: if (!(cp = *argp++) || *cp == '-') ! 101: adios (NULLCP, "missing argument to %s", argp[-2]); ! 102: if (dp >= NDIRS) ! 103: adios (NULLCP, "more than %d directories", NDIRS); ! 104: dirs[dp++] = cp; ! 105: continue; ! 106: } ! 107: akv[akp++] = cp; ! 108: } ! 109: ! 110: /* */ ! 111: ! 112: if (akp == 0) ! 113: akv[akp++] = AliasFile; ! 114: if (!homehead) ! 115: init_pw (); ! 116: if (!mail) ! 117: out = stdout; ! 118: dirs[dp] = NULL; ! 119: ! 120: alias_files (akp, akv); ! 121: pwd_names (); ! 122: grp_names (); ! 123: grp_members (); ! 124: grp_ids (); ! 125: #ifdef UCI ! 126: ldr_names (); ! 127: ldr_ship (); ! 128: #endif UCI ! 129: maildrops (); ! 130: ! 131: done (0); ! 132: } ! 133: ! 134: /* */ ! 135: ! 136: alias_files (akp, akv) ! 137: int akp; ! 138: register char **akv; ! 139: { ! 140: register int i; ! 141: ! 142: for (i = 0; i < akp; i++) ! 143: if ((i = alias (akv[i])) != AK_OK) { ! 144: setup (); ! 145: fprintf (out, "aliasing error in %s - %s\n", akv[i], akerror (i)); ! 146: } ! 147: else ! 148: if (out && !mail) ! 149: fprintf (out, "alias file %s is ok\n", akv[i]); ! 150: } ! 151: ! 152: /* */ ! 153: ! 154: pwd_names () { ! 155: int hit = 0; ! 156: register struct home *hm, ! 157: *lm; ! 158: ! 159: for (hm = homehead; hm; hm = hm -> h_next) ! 160: for (lm = hm -> h_next; lm; lm = lm -> h_next) ! 161: if (strcmp (hm -> h_name, lm -> h_name) == 0) { ! 162: setup (); ! 163: fprintf (out, "duplicate user %s(uid=%d)\n", ! 164: lm -> h_name, lm -> h_uid); ! 165: hit++; ! 166: } ! 167: ! 168: if (!hit && out && !mail) ! 169: fprintf (out, "no duplicate users\n"); ! 170: } ! 171: ! 172: ! 173: grp_names () { ! 174: register int gp, ! 175: hit = 0; ! 176: char *grps[NGRPS]; ! 177: register struct group *gr; ! 178: ! 179: grps[0] = NULL; ! 180: (void) setgrent (); ! 181: while (gr = getgrent ()) { ! 182: for (gp = 0; grps[gp]; gp++) ! 183: if (strcmp (grps[gp], gr -> gr_name) == 0) { ! 184: setup (); ! 185: fprintf (out, "duplicate group %s(gid=%d)\n", ! 186: gr -> gr_name, gr -> gr_gid); ! 187: hit++; ! 188: break; ! 189: } ! 190: if (grps[gp] == NULL) ! 191: if (gp < NGRPS) { ! 192: grps[gp++] = getcpy (gr -> gr_name); ! 193: grps[gp] = NULL; ! 194: } ! 195: else { ! 196: setup (); ! 197: fprintf (out, "more than %d groups (time to recompile)\n", ! 198: NGRPS - 1); ! 199: hit++; ! 200: } ! 201: } ! 202: (void) endgrent (); ! 203: ! 204: for (gp = 0; grps[gp]; gp++) ! 205: free (grps[gp]); ! 206: ! 207: if (!hit && out && !mail) ! 208: fprintf (out, "no duplicate groups\n"); ! 209: } ! 210: ! 211: /* */ ! 212: ! 213: grp_members () { ! 214: register int hit = 0; ! 215: register char **cp, ! 216: **dp; ! 217: register struct group *gr; ! 218: register struct home *hm; ! 219: ! 220: (void) setgrent (); ! 221: while (gr = getgrent ()) ! 222: for (cp = gr -> gr_mem; *cp; cp++) { ! 223: for (hm = homehead; hm; hm = hm -> h_next) ! 224: if (!strcmp (*cp, hm -> h_name)) ! 225: break; ! 226: if (hm == NULL) { ! 227: setup (); ! 228: fprintf (out, "group %s(gid=%d) has unknown member %s\n", ! 229: gr -> gr_name, gr -> gr_gid, *cp); ! 230: hit++; ! 231: } ! 232: #ifdef BSD42 ! 233: else ! 234: hm -> h_ngrps++; ! 235: #endif BSD42 ! 236: ! 237: for (dp = cp + 1; *dp; dp++) ! 238: if (strcmp (*cp, *dp) == 0) { ! 239: setup (); ! 240: fprintf (out, "group %s(gid=%d) has duplicate member %s\n", ! 241: gr -> gr_name, gr -> gr_gid, *cp); ! 242: hit++; ! 243: } ! 244: } ! 245: (void) endgrent (); ! 246: ! 247: #ifdef BSD42 ! 248: for (hm = homehead; hm; hm = hm -> h_next) ! 249: if (hm -> h_ngrps > NGROUPS) { ! 250: setup (); ! 251: fprintf (out, "user %s is a member of %d groups (max %d)", ! 252: hm -> h_name, hm -> h_ngrps, NGROUPS); ! 253: hit++; ! 254: } ! 255: #endif BSD42 ! 256: ! 257: if (!hit && out && !mail) ! 258: fprintf (out, "all group members accounted for\n"); ! 259: } ! 260: ! 261: ! 262: grp_ids () { /* -DRAND not implemented at most places */ ! 263: register int hit = 0; ! 264: register struct home *hm; ! 265: ! 266: for (hm = homehead; hm; hm = hm -> h_next) ! 267: if (getgrgid (hm -> h_gid) == NULL) { ! 268: setup (); ! 269: fprintf (out, "user %s(uid=%d) has unknown group-id %d\n", ! 270: hm -> h_name, hm -> h_uid, hm -> h_gid); ! 271: hit++; ! 272: } ! 273: ! 274: if (!hit && out && !mail) ! 275: fprintf (out, "all group-id users accounted for\n"); ! 276: } ! 277: ! 278: /* */ ! 279: ! 280: maildrops () ! 281: { ! 282: register int i; ! 283: ! 284: if (mmdfldir && *mmdfldir) ! 285: mdrop (mmdfldir); ! 286: if (uucpldir && *uucpldir) ! 287: mdrop (uucpldir); ! 288: for (i = 0; dirs[i]; i++) ! 289: mdrop (dirs[i]); ! 290: } ! 291: ! 292: ! 293: mdrop(drop) ! 294: register char *drop; ! 295: { ! 296: register int hit = 0; ! 297: register struct direct *dp; ! 298: register DIR *dd = opendir (drop); ! 299: ! 300: if (!dd) { ! 301: setup (); ! 302: fprintf (out, "unable to open maildrop area %s\n", drop); ! 303: return; ! 304: } ! 305: ! 306: while (dp = readdir (dd)) ! 307: if (dp -> d_name[0] != '.' && !check (dp ->d_name)) { ! 308: setup (); ! 309: fprintf (out, ! 310: "there is a maildrop for the unknown user %s in %s\n", ! 311: dp -> d_name, drop); ! 312: hit++; ! 313: } ! 314: ! 315: closedir (dd); ! 316: if (!hit && out && !mail) ! 317: fprintf (out, "all maildrops accounted for in %s\n", drop); ! 318: } ! 319: ! 320: ! 321: /* */ ! 322: ! 323: int check (s) ! 324: register char *s; ! 325: { ! 326: register struct home *hm; ! 327: ! 328: for (hm = homehead; hm; hm = hm -> h_next) ! 329: if (!strcmp (s, hm -> h_name)) ! 330: return 1; ! 331: return 0; ! 332: } ! 333: ! 334: /* */ ! 335: ! 336: setup () { ! 337: int fd, ! 338: pd[2]; ! 339: ! 340: if (out) ! 341: return; ! 342: ! 343: if (mail) { ! 344: if (pipe (pd) == NOTOK) ! 345: adios ("pipe", "unable to"); ! 346: ! 347: switch (fork ()) { ! 348: case NOTOK: ! 349: adios ("fork", "unable to"); ! 350: ! 351: case OK: ! 352: (void) close (pd[1]); ! 353: if (pd[0] != 0) { ! 354: (void) dup2 (pd[0], 0); ! 355: (void) close (pd[0]); ! 356: } ! 357: if ((fd = open ("/dev/null", 1)) != NOTOK) ! 358: if (fd != 1) { ! 359: (void) dup2 (fd, 1); ! 360: (void) close (fd); ! 361: } ! 362: execlp (mailproc, r1bindex (mailproc, '/'), ! 363: mail, "-subject", invo_name, NULLCP); ! 364: adios (mailproc, "unable to exec "); ! 365: ! 366: default: ! 367: (void) close (pd[0]); ! 368: out = fdopen (pd[1], "w"); ! 369: fprintf (out, "%s: the following is suspicious\n\n", ! 370: invo_name); ! 371: } ! 372: } ! 373: } ! 374: ! 375: /* */ ! 376: ! 377: #ifdef UCI ! 378: /* UCI specific stuff for conflict */ ! 379: ! 380: /* taken from <grpldr.h> */ ! 381: ! 382: #define GLDRS "/admin/etc/GroupLeaders" ! 383: ! 384: struct grpldr { ! 385: char *gl_name; ! 386: char **gl_ldr; ! 387: }; ! 388: ! 389: int setglent (), endglent (); ! 390: struct grpldr *getglent (), *getglnam (); ! 391: ! 392: ! 393: /* taken from the getglent() routines */ ! 394: ! 395: #include <ctype.h> ! 396: ! 397: #define MAXGLS 100 ! 398: ! 399: ! 400: static FILE *glp = NULL; ! 401: static char line[BUFSIZ+1]; ! 402: static struct grpldr grpldr; ! 403: static char *gl_ldr[MAXGLS + 1]; ! 404: ! 405: /* */ ! 406: ! 407: setglent() { ! 408: if (glp == NULL) ! 409: glp = fopen (GLDRS, "r"); ! 410: else ! 411: rewind (glp); ! 412: ! 413: return (glp != NULL); ! 414: } ! 415: ! 416: ! 417: endglent() { ! 418: if (glp != NULL) { ! 419: (void) fclose (glp); ! 420: glp = NULL; ! 421: } ! 422: ! 423: return 1; ! 424: } ! 425: ! 426: /* */ ! 427: ! 428: struct grpldr *getglent () { ! 429: register char *cp, ! 430: **q; ! 431: ! 432: if (glp == NULL && !setglent ()) ! 433: return NULL; ! 434: if ((cp = fgets (line, BUFSIZ, glp)) == NULL) ! 435: return NULL; ! 436: ! 437: grpldr.gl_name = cp; ! 438: grpldr.gl_ldr = q = gl_ldr; ! 439: ! 440: while (*cp) { ! 441: while (*cp && !isspace (*cp)) ! 442: cp++; ! 443: while (*cp && isspace (*cp)) ! 444: *cp++ = NULL; ! 445: if (*cp == NULL) ! 446: break; ! 447: if (q < gl_ldr + MAXGLS) ! 448: *q++ = cp; ! 449: else ! 450: break; ! 451: } ! 452: *q = NULL; ! 453: ! 454: return (&grpldr); ! 455: } ! 456: ! 457: /* */ ! 458: ! 459: struct grpldr *getglnam (name) ! 460: char *name; ! 461: { ! 462: register struct grpldr *gl = NULL; ! 463: ! 464: (void) setglent (); ! 465: while (gl = getglent ()) ! 466: if (strcmp (name, gl -> gl_name) == 0) ! 467: break; ! 468: (void) endglent (); ! 469: ! 470: return gl; ! 471: } ! 472: ! 473: /* */ ! 474: ! 475: ldr_names () { ! 476: register int gp, ! 477: hit = 0; ! 478: char *gldrs[NGRPS]; ! 479: register struct grpldr *gl; ! 480: ! 481: gldrs[0] = NULL; ! 482: (void) setglent (); ! 483: while (gl = getglent ()) { ! 484: if (getgrnam (gl -> gl_name) == NULL) { ! 485: setup (); ! 486: fprintf (out, "unknown group %s in group leaders file\n", ! 487: gl -> gl_name); ! 488: hit++; ! 489: } ! 490: for (gp = 0; gldrs[gp]; gp++) ! 491: if (strcmp (gldrs[gp], gl -> gl_name) == 0) { ! 492: setup (); ! 493: fprintf (out, "duplicate group %s in group leaders file\n", ! 494: gl -> gl_name); ! 495: hit++; ! 496: break; ! 497: } ! 498: if (gldrs[gp] == NULL) ! 499: if (gp < NGRPS) { ! 500: gldrs[gp++] = getcpy (gl -> gl_name); ! 501: gldrs[gp] = NULL; ! 502: } ! 503: else { ! 504: setup (); ! 505: fprintf (out, "more than %d groups in group leaders file%s\n", ! 506: " (time to recompile)", NGRPS - 1); ! 507: hit++; ! 508: } ! 509: } ! 510: (void) endglent (); ! 511: ! 512: for (gp = 0; gldrs[gp]; gp++) ! 513: free (gldrs[gp]); ! 514: ! 515: if (!hit && out && !mail) ! 516: fprintf (out, "all groups in group leaders file accounted for\n"); ! 517: } ! 518: ! 519: ! 520: ldr_ship () { ! 521: register int hit = 0; ! 522: register char **cp, ! 523: **dp; ! 524: register struct grpldr *gl; ! 525: ! 526: (void) setglent (); ! 527: while (gl = getglent ()) ! 528: for (cp = gl -> gl_ldr; *cp; cp++) { ! 529: if (!check (*cp)) { ! 530: setup (); ! 531: fprintf (out, "group %s has unknown leader %s\n", ! 532: gl -> gl_name, *cp); ! 533: hit++; ! 534: } ! 535: ! 536: for (dp = cp + 1; *dp; dp++) ! 537: if (strcmp (*cp, *dp) == 0) { ! 538: setup (); ! 539: fprintf (out, "group %s had duplicate leader %s\n", ! 540: gl -> gl_name, *cp); ! 541: hit++; ! 542: } ! 543: } ! 544: (void) endglent (); ! 545: ! 546: if (!hit && out && !mail) ! 547: fprintf (out, "all group leaders accounted for\n"); ! 548: } ! 549: #endif UCI
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.