comparison support/bboards/mmdfII/bboards/getbbent.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:bce86c4163a3
1 /* getbbent.c - subroutines for accessing the BBoards file */
2
3 /* LINTLIBRARY */
4
5 #include "bboards.h"
6 #ifndef MMDFONLY
7 #include "../h/strings.h"
8 #include <sys/types.h>
9 #else MMDFONLY
10 #include "util.h"
11 #include "mmdf.h"
12 #include "strings.h"
13 #endif MMDFONLY
14 #include <ctype.h>
15 #include <pwd.h>
16 #include <grp.h>
17 #include <stdio.h>
18 #include <sys/stat.h>
19
20
21 #ifndef MMDFONLY
22 #define NOTOK (-1)
23 #define OK 0
24 #endif not MMDFONLY
25
26
27 #define MaxBBAka 100
28 #define MaxBBLdr 100
29 #define MaxBBDist 100
30
31
32 #define NCOLON 9 /* currently 10 fields per entry */
33
34 #define COLON ':'
35 #define COMMA ','
36 #define NEWLINE '\n'
37
38
39 #define ARCHIVE "archive"
40 #define CNTFILE ".cnt"
41 #define DSTFILE ".dist"
42 #define MAPFILE ".map"
43
44 /* */
45
46 static int BBuid = -1;
47
48 static unsigned int BBflags = SB_NULL;
49
50 static char BBName[BUFSIZ] = BBOARDS;
51 static char BBDir[BUFSIZ] = "";
52 static char BBData[BUFSIZ] = "";
53
54 static FILE *BBfile = NULL;
55
56
57 static struct bboard BB;
58 static struct bboard *bb = &BB;
59
60 static int BBload = 1;
61
62 static char BBFile[BUFSIZ];
63 static char BBArchive[BUFSIZ];
64 static char BBInfo[BUFSIZ];
65 static char BBMap[BUFSIZ];
66 static char *BBAkas[MaxBBAka];
67 static char *BBLeaders[MaxBBLdr];
68 static char *BBDists[MaxBBDist];
69 static char BBAddr[BUFSIZ];
70 static char BBRequest[BUFSIZ];
71 static char BBDate[BUFSIZ];
72 static char BBErrors[BUFSIZ];
73
74 #ifdef MMDFONLY
75 extern LLog *logptr;
76 #endif MMDFONLY
77
78 char *bbskip (), *getcpy ();
79
80 char *crypt (), *getpass ();
81 struct group *getgrnam ();
82 struct passwd *getpwnam (), *getpwuid ();
83
84 /* */
85
86 int setbbfile (file, f)
87 register char *file;
88 register int f;
89 {
90 if (BBuid == -1)
91 return setbbinfo (BBOARDS, file, f);
92
93 (void) strcpy (BBData, file);
94
95 BBflags = SB_NULL;
96 (void) endbbent ();
97
98 return setbbent (f);
99 }
100
101 /* */
102
103 int setbbinfo (user, file, f)
104 register char *user,
105 *file;
106 register int f;
107 {
108 register struct passwd *pw;
109
110 if ((pw = getpwnam (user)) == NULL) {
111 (void) sprintf (BBErrors, "unknown user: %s", user);
112 return 0;
113 }
114
115 return setpwinfo (pw, file, f);
116 }
117
118
119 int setpwinfo (pw, file, f)
120 register struct passwd *pw;
121 register char *file;
122 register int f;
123 {
124 if (!setpwaux (pw, file))
125 return 0;
126
127 BBflags = SB_NULL;
128 (void) endbbent ();
129
130 return setbbent (f);
131 }
132
133 /* */
134
135 static int setbbaux (name, file)
136 register char *name,
137 *file;
138 {
139 register struct passwd *pw;
140
141 if ((pw = getpwnam (name)) == NULL) {
142 (void) sprintf (BBErrors, "unknown user: %s", name);
143 return 0;
144 }
145
146 return setpwaux (pw, file);
147 }
148
149
150 static int setpwaux (pw, file)
151 register struct passwd *pw;
152 register char *file;
153 {
154 (void) strcpy (BBName, pw -> pw_name);
155 BBuid = pw -> pw_uid;
156 (void) strcpy (BBDir, pw -> pw_dir);
157 (void) sprintf (BBData, "%s/%s",
158 *file != '/' ? BBDir : "",
159 *file != '/' ? file : file + 1);
160
161 BBflags = SB_NULL;
162
163 return 1;
164 }
165
166 /* */
167
168 int setbbent (f)
169 register int f;
170 {
171 if (BBfile == NULL) {
172 if (BBuid == -1 && !setbbaux (BBOARDS, BBDB))
173 return 0;
174
175 if ((BBfile = fopen (BBData, "r")) == NULL) {
176 (void) sprintf (BBErrors, "unable to open: %s", BBData);
177 return 0;
178 }
179 }
180 else
181 rewind (BBfile);
182
183 BBflags |= f;
184 return (BBfile != NULL);
185 }
186
187
188 int endbbent () {
189 if (BBfile != NULL && !(BBflags & SB_STAY)) {
190 (void) fclose (BBfile);
191 BBfile = NULL;
192 }
193
194 return 1;
195 }
196
197
198 long getbbtime () {
199 struct stat st;
200
201 if (BBfile == NULL) {
202 if (BBuid == -1 && !setbbaux (BBOARDS, BBDB))
203 return 0;
204
205 if (stat (BBData, &st) == NOTOK) {
206 (void) sprintf (BBErrors, "unable to stat: %s", BBData);
207 return 0;
208 }
209 }
210 else
211 if (fstat (fileno (BBfile), &st) == NOTOK) {
212 (void) sprintf (BBErrors, "unable to fstat: %s", BBData);
213 return 0;
214 }
215
216 return ((long) st.st_mtime);
217 }
218
219 /* */
220
221 struct bboard *getbbent () {
222 register int count;
223 register char *p,
224 *q,
225 *r,
226 *d,
227 *f,
228 **s;
229 static char line[BUFSIZ];
230
231 if (BBfile == NULL && !setbbent (SB_NULL))
232 return NULL;
233
234 retry: ;
235 if ((p = fgets (line, sizeof line, BBfile)) == NULL)
236 return NULL;
237
238 for (q = p, count = 0; *q != NULL && *q != NEWLINE; q++)
239 if (*q == COLON)
240 count++;
241
242 if (count != NCOLON) {
243 #ifdef MMDFONLY
244 if (q = index (p, NEWLINE))
245 *q = NULL;
246 ll_log (logptr, LLOGTMP, "bad entry in %s: %s", BBData, p);
247 #endif MMDFONLY
248 goto retry;
249 }
250
251 bb -> bb_name = p;
252 p = q = bbskip (p, COLON);
253 p = bb -> bb_file = bbskip (p, COLON);
254 bb -> bb_archive = bb -> bb_info = bb -> bb_map = "";
255 p = bb -> bb_passwd = bbskip (p, COLON);
256 p = r = bbskip (p, COLON);
257 p = bb -> bb_addr = bbskip (p, COLON);
258 p = bb -> bb_request = bbskip (p, COLON);
259 p = bb -> bb_relay = bbskip (p, COLON);
260 p = d = bbskip (p, COLON);
261 p = f = bbskip (p, COLON);
262 (void) bbskip (p, NEWLINE);
263
264 s = bb -> bb_aka = BBAkas;
265 while (*q) {
266 *s++ = q;
267 q = bbskip (q, COMMA);
268 }
269 *s = NULL;
270
271 s = bb -> bb_leader = BBLeaders;
272 if (*r == NULL) {
273 if (!(BBflags & SB_FAST))
274 *s++ = BBName;
275 }
276 else
277 while (*r) {
278 *s++ = r;
279 r = bbskip (r, COMMA);
280 }
281 *s = NULL;
282
283 s = bb -> bb_dist = BBDists;
284 while (*d) {
285 *s++ = d;
286 d = bbskip (d, COMMA);
287 }
288 *s = NULL;
289
290 if (*f)
291 (void) sscanf (f, "%o", &bb -> bb_flags);
292 else
293 bb -> bb_flags = BB_NULL;
294 bb -> bb_count = bb -> bb_maxima = 0;
295 bb -> bb_date = NULL;
296 bb -> bb_next = bb -> bb_link = bb -> bb_chain = NULL;
297
298 if (BBload)
299 BBread ();
300
301 return bb;
302 }
303
304 /* */
305
306 struct bboard *getbbnam (name)
307 register char *name;
308 {
309 register struct bboard *b = NULL;
310
311 if (!setbbent (SB_NULL))
312 return NULL;
313 BBload = 0;
314 while ((b = getbbent ()) && strcmp (name, b -> bb_name))
315 continue;
316 BBload = 1;
317 (void) endbbent ();
318
319 if (b != NULL)
320 BBread ();
321
322 return b;
323 }
324
325
326 struct bboard *getbbaka (aka)
327 register char *aka;
328 {
329 register char **ap;
330 register struct bboard *b = NULL;
331
332 if (!setbbent (SB_NULL))
333 return NULL;
334 BBload = 0;
335 while ((b = getbbent ()) != NULL)
336 for (ap = b -> bb_aka; *ap; ap++)
337 if (strcmp (aka, *ap) == 0)
338 goto hit;
339 hit: ;
340 BBload = 1;
341 (void) endbbent ();
342
343 if (b != NULL)
344 BBread ();
345
346 return b;
347 }
348
349 /* */
350
351 static int BBread () {
352 register int i;
353 register char *cp,
354 *dp,
355 *p,
356 *r;
357 char prf[BUFSIZ];
358 static char line[BUFSIZ];
359 register FILE * info;
360
361 if (BBflags & SB_FAST)
362 return;
363
364 p = index (bb -> bb_request, '@');
365 r = index (bb -> bb_addr, '@');
366 BBRequest[0] = NULL;
367
368 if (*bb -> bb_request == '-')
369 if (p == NULL && r && *r == '@')
370 (void) sprintf (BBRequest, "%s%s%s",
371 bb -> bb_name, bb -> bb_request, r);
372 else
373 (void) sprintf (BBRequest, "%s%s",
374 bb -> bb_name, bb -> bb_request);
375 else
376 if (p == NULL && r && *r == '@' && *bb -> bb_request)
377 (void) sprintf (BBRequest, "%s%s", bb -> bb_request, r);
378
379 if (BBRequest[0])
380 bb -> bb_request = BBRequest;
381 else
382 if (*bb -> bb_request == NULL)
383 bb -> bb_request = *bb -> bb_addr ? bb -> bb_addr
384 : bb -> bb_leader[0];
385
386 if (*bb -> bb_addr == '@') {
387 (void) sprintf (BBAddr, "%s%s", bb -> bb_name, bb -> bb_addr);
388 bb -> bb_addr = BBAddr;
389 }
390 else
391 if (*bb -> bb_addr == NULL)
392 bb -> bb_addr = bb -> bb_name;
393
394 if (*bb -> bb_file == NULL)
395 return;
396 if (*bb -> bb_file != '/') {
397 (void) sprintf (BBFile, "%s/%s", BBDir, bb -> bb_file);
398 bb -> bb_file = BBFile;
399 }
400
401 if ((cp = rindex (bb -> bb_file, '/')) == NULL || *++cp == NULL)
402 (void) strcpy (prf, ""), cp = bb -> bb_file;
403 else
404 (void) sprintf (prf, "%.*s", cp - bb -> bb_file, bb -> bb_file);
405 if ((dp = index (cp, '.')) == NULL)
406 dp = cp + strlen (cp);
407
408 (void) sprintf (BBArchive, "%s%s/%s", prf, ARCHIVE, cp);
409 bb -> bb_archive = BBArchive;
410 (void) sprintf (BBInfo, "%s.%.*s%s", prf, dp - cp, cp, CNTFILE);
411 bb -> bb_info = BBInfo;
412 (void) sprintf (BBMap, "%s.%.*s%s", prf, dp - cp, cp, MAPFILE);
413 bb -> bb_map = BBMap;
414
415 if ((info = fopen (bb -> bb_info, "r")) == NULL)
416 return;
417
418 if (fgets (line, sizeof line, info) && (i = atoi (line)) > 0)
419 bb -> bb_maxima = (unsigned) i;
420 if (!feof (info) && fgets (line, sizeof line, info)) {
421 (void) strcpy (BBDate, line);
422 if (cp = index (BBDate, NEWLINE))
423 *cp = NULL;
424 bb -> bb_date = BBDate;
425 }
426
427 (void) fclose (info);
428 }
429
430 /* */
431
432 int ldrbb (b)
433 register struct bboard *b;
434 {
435 register char *p,
436 **q,
437 **r;
438 static int uid = 0,
439 gid = 0;
440 static char username[10] = "";
441 register struct passwd *pw;
442 register struct group *gr;
443
444 if (b == NULL)
445 return 0;
446 if (BBuid == -1 && !setbbaux (BBOARDS, BBDB))
447 return 0;
448
449 if (username[0] == NULL) {
450 if ((pw = getpwuid (uid = getuid ())) == NULL)
451 return 0;
452 gid = getgid ();
453 (void) strcpy (username, pw -> pw_name);
454 }
455
456 if (uid == BBuid)
457 return 1;
458
459 q = b -> bb_leader;
460 while (p = *q++)
461 if (*p == '=') {
462 if ((gr = getgrnam (++p)) == NULL)
463 continue;
464 if (gid == gr -> gr_gid)
465 return 1;
466 r = gr -> gr_mem;
467 while (p = *r++)
468 if (strcmp (username, p) == 0)
469 return 1;
470 }
471 else
472 if (strcmp (username, p) == 0)
473 return 1;
474
475 return 0;
476 }
477
478 /* */
479
480 int ldrchk (b)
481 register struct bboard *b;
482 {
483 if (b == NULL)
484 return 0;
485
486 if (*b -> bb_passwd == NULL)
487 return 1;
488
489 if (strcmp (b -> bb_passwd,
490 crypt (getpass ("Password: "), b -> bb_passwd)) == 0)
491 return 1;
492
493 fprintf (stderr, "Sorry\n");
494 return 0;
495 }
496
497 /* */
498
499 struct bboard *getbbcpy (bp)
500 register struct bboard *bp;
501 {
502 register char **p,
503 **q;
504 register struct bboard *b;
505
506 if (bp == NULL)
507 return NULL;
508
509 b = (struct bboard *) malloc ((unsigned) sizeof *b);
510 if (b == NULL)
511 return NULL;
512
513 b -> bb_name = getcpy (bp -> bb_name);
514 b -> bb_file = getcpy (bp -> bb_file);
515 b -> bb_archive = getcpy (bp -> bb_archive);
516 b -> bb_info = getcpy (bp -> bb_info);
517 b -> bb_map = getcpy (bp -> bb_map);
518 b -> bb_passwd = getcpy (bp -> bb_passwd);
519 b -> bb_flags = bp -> bb_flags;
520 b -> bb_count = bp -> bb_count;
521 b -> bb_maxima = bp -> bb_maxima;
522 b -> bb_date = getcpy (bp -> bb_date);
523 b -> bb_addr = getcpy (bp -> bb_addr);
524 b -> bb_request = getcpy (bp -> bb_request);
525 b -> bb_relay = getcpy (bp -> bb_relay);
526
527 for (p = bp -> bb_aka; *p; p++)
528 continue;
529 b -> bb_aka =
530 q = (char **) calloc ((unsigned) (p - bp -> bb_aka + 1), sizeof *q);
531 if (q == NULL)
532 return NULL;
533 for (p = bp -> bb_aka; *p; *q++ = getcpy (*p++))
534 continue;
535 *q = NULL;
536
537 for (p = bp -> bb_leader; *p; p++)
538 continue;
539 b -> bb_leader =
540 q = (char **) calloc ((unsigned) (p - bp -> bb_leader + 1), sizeof *q);
541 if (q == NULL)
542 return NULL;
543 for (p = bp -> bb_leader; *p; *q++ = getcpy (*p++))
544 continue;
545 *q = NULL;
546
547 for (p = bp -> bb_dist; *p; p++)
548 continue;
549 b -> bb_dist =
550 q = (char **) calloc ((unsigned) (p - bp -> bb_dist + 1), sizeof *q);
551 if (q == NULL)
552 return NULL;
553 for (p = bp -> bb_dist; *p; *q++ = getcpy (*p++))
554 continue;
555 *q = NULL;
556
557 b -> bb_next = bp -> bb_next;
558 b -> bb_link = bp -> bb_link;
559 b -> bb_chain = bp -> bb_chain;
560
561 return b;
562 }
563
564 /* */
565
566 int getbbdist (bb, action)
567 register struct bboard *bb;
568 register int (*action) ();
569 {
570 register int result;
571 register char **dp;
572
573 BBErrors[0] = NULL;
574 for (dp = bb -> bb_dist; *dp; dp++)
575 if (result = getbbitem (bb, *dp, action))
576 return result;
577
578 return result;
579 }
580
581 char *getbberr () {
582 return (BBErrors[0] ? BBErrors : NULL);
583 };
584
585 /* */
586
587 static int getbbitem (bb, item, action)
588 register struct bboard *bb;
589 register char *item;
590 register int (*action) ();
591 {
592 register int result;
593 register char *cp,
594 *dp,
595 *hp,
596 *np;
597 char mbox[BUFSIZ],
598 buffer[BUFSIZ],
599 file[BUFSIZ],
600 host[BUFSIZ],
601 prf[BUFSIZ];
602 register FILE *fp;
603
604 switch (*item) {
605 case '*':
606 switch (*++item) {
607 case '/':
608 hp = item;
609 break;
610
611 case NULL:
612 if ((cp = rindex (bb -> bb_file, '/')) == NULL || *++cp == NULL)
613 (void) strcpy (prf, ""), cp = bb -> bb_file;
614 else
615 (void) sprintf (prf, "%.*s", cp - bb -> bb_file, bb -> bb_file);
616 if ((dp = index (cp, '.')) == NULL)
617 dp = cp + strlen (cp);
618 (void) sprintf (file, "%s.%.*s%s", prf, dp - cp, cp, DSTFILE);
619 hp = file;
620 break;
621
622 default:
623 (void) sprintf (file, "%s/%s", BBDir, item);
624 hp = file;
625 break;
626 }
627
628 if ((fp = fopen (hp, "r")) == NULL)
629 return bblose ("unable to read file %s", hp);
630 while (fgets (buffer, sizeof buffer, fp)) {
631 if (np = index (buffer, '\n'))
632 *np = NULL;
633 if (result = getbbitem (bb, buffer, action)) {
634 (void) fclose (fp);
635 (void) bblose ("error with file %s, item %s", hp, buffer);
636 return result;
637 }
638 }
639 (void) fclose (fp);
640 return OK;
641
642 default:
643 if (hp = rindex (item, '@')) {
644 *hp++ = NULL;
645 (void) strcpy (mbox, item);
646 (void) strcpy (host, hp);
647 *--hp = '@';
648 }
649 else {
650 (void) sprintf (mbox, "%s%s", DISTADR, bb -> bb_name);
651 (void) strcpy (host, item);
652 }
653 if (result = (*action) (mbox, host))
654 (void) bblose ("action (%s, %s) returned 0%o", mbox, host, result);
655 return result;
656 }
657 }
658
659 /* */
660
661 /* VARARGS1 */
662
663 static int bblose (fmt, a, b, c)
664 char *fmt,
665 *a,
666 *b,
667 *c;
668 {
669 if (BBErrors[0] == NULL)
670 (void) sprintf (BBErrors, fmt, a, b, c);
671
672 return NOTOK;
673 }
674
675 /* */
676
677 void make_lower (s1, s2)
678 register char *s1,
679 *s2;
680 {
681 if (s1 == NULL || s2 == NULL)
682 return;
683
684 for (; *s2; s2++)
685 *s1++ = isupper (*s2) ? tolower (*s2) : *s2;
686 *s1 = NULL;
687 }
688
689 /* */
690
691 static char *bbskip (p, c)
692 register char *p,
693 c;
694 {
695 if (p == NULL)
696 return NULL;
697
698 while (*p && *p != c)
699 p++;
700 if (*p)
701 *p++ = NULL;
702
703 return p;
704 }
705
706
707 static char *getcpy (s)
708 register char *s;
709 {
710 register char *p;
711
712 if (s == NULL)
713 return NULL;
714
715 if (p = malloc ((unsigned) (strlen (s) + 1)))
716 (void) strcpy (p, s);
717 return p;
718 }