0
|
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 }
|