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