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