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