|
|
1.1 ! root 1: #ifndef lint ! 2: static char rcsid[] = ! 3: "@(#) $Header: mhconfig.c,v 1.7 89/12/15 23:34:02 leres Exp $ (LBL)"; ! 4: #endif ! 5: /* mhconfig.c - configure MH */ ! 6: ! 7: #include <sys/param.h> ! 8: #if defined(BSD4_4) ! 9: #define BSD44 ! 10: #endif ! 11: #include "../h/strings.h" ! 12: #include <ctype.h> ! 13: #include <stdio.h> ! 14: ! 15: ! 16: #define BANNER "This is %s, for generic UNIX (MH.6 configuration program)\n\n" ! 17: ! 18: ! 19: #define SED "config.sed" ! 20: #define SEDOC "doc/config.sed" ! 21: #define MFIL(f) "makefiles/f", "f" ! 22: #define MMFIL(f,g) "makefiles/f", "g" ! 23: #define MAKE "../%s/Makefile" ! 24: ! 25: #define WARNING "This file is automatically generated. Do not edit!" ! 26: ! 27: #define NOTOK (-1) ! 28: ! 29: #define NULLCP ((char *) 0) ! 30: ! 31: #define SVAL(s) (s ? s : "") ! 32: ! 33: #define QUOTE '\\' ! 34: ! 35: /* */ ! 36: ! 37: static int smtp = 0; ! 38: ! 39: static int sedP = 1; ! 40: static int filesP = 1; ! 41: static int docP = 1; ! 42: static int makeP = 1; ! 43: ! 44: static char *myname = "mhconfig"; ! 45: ! 46: static char *myopts = NULL; ! 47: ! 48: static char *binpath = "/usr/local"; ! 49: static char *bbhome = "/usr/spool/bboards"; ! 50: static char *bboards = "off"; ! 51: static char *cc = "cc"; ! 52: static char *ccoptions = NULL; ! 53: #if defined(BSD44) ! 54: static char *chownpath = "/usr/sbin/chown"; ! 55: #else ! 56: static char *chownpath = "/etc/chown"; ! 57: #endif ! 58: static char *curses = "-lcurses -ltermlib"; ! 59: static char *debug = "off"; ! 60: static char *editor = "prompter"; ! 61: static char *etcpath = "/usr/local/lib/mh"; ! 62: static char *ldoptions = NULL; ! 63: static char *ldoptlibs = NULL; ! 64: #if defined(BSD44) ! 65: static char *mailpath = "/var/mail"; ! 66: #else ! 67: static char *mailpath = "/usr/spool/mail"; ! 68: #endif ! 69: static char *maildir = NULL; ! 70: static char *mailfile = NULL; ! 71: #if defined(BSD44) ! 72: static char *mandir = "/usr/man"; ! 73: #else ! 74: static char *mandir = "/usr/share/man"; ! 75: #endif ! 76: static char *manuals = "standard"; ! 77: static char *mf = "off"; ! 78: static char *mts = "sendmail"; ! 79: static char *remove = "mv -f"; ! 80: static char *oldload = "off"; ! 81: static char *options = NULL; ! 82: static char *pop = "off"; ! 83: static char *popbboards = "off"; ! 84: static char *ranlib = "on"; ! 85: static char *flex = "off"; ! 86: static char *tma = "off"; ! 87: ! 88: #define unknown 0 ! 89: #define mmdf 1 ! 90: #define mmdf2 2 ! 91: #define mh 3 ! 92: #define sendmail 4 ! 93: static int mtsnum = unknown; ! 94: ! 95: static struct mtsopt { ! 96: char *mtskey; ! 97: char *optval; ! 98: int code; ! 99: int mtsflags; ! 100: #define NOFLAGS 0x00 ! 101: #define DOSMTP 0x01 ! 102: #define NOMF 0x02 ! 103: } mtsopts[] = { ! 104: "mmdf", "MMDFMTS MMDFI", mmdf, NOFLAGS, ! 105: "mmdf/smtp", "SENDMTS SMTP", mmdf, DOSMTP, ! 106: "mmdf2", "MMDFMTS MMDFII", mmdf2, NOFLAGS, ! 107: "mmdf2/smtp", "SENDMTS MMDFII SMTP", mmdf2, DOSMTP, ! 108: "mh", "MHMTS", mh, NOFLAGS, ! 109: "sendmail", "SENDMTS", sendmail, NOMF, ! 110: "sendmail/smtp", "SENDMTS SMTP", sendmail, NOMF, ! 111: NULL, NULL, unknown, NOFLAGS ! 112: }; ! 113: ! 114: static struct bind { ! 115: char *keyword; ! 116: ! 117: char **value; ! 118: ! 119: int flags; ! 120: #define BD_NIL 0x00 ! 121: #define BD_ADD 0x01 ! 122: } binds[] = { ! 123: "bin", &binpath, BD_NIL, ! 124: "bbhome", &bbhome, BD_NIL, ! 125: "bboards", &bboards, BD_NIL, ! 126: "cc", &cc, BD_NIL, ! 127: "ccoptions", &ccoptions, BD_ADD, ! 128: "chown", &chownpath, BD_NIL, ! 129: "curses", &curses, BD_NIL, ! 130: "debug", &debug, BD_NIL, ! 131: "editor", &editor, BD_NIL, ! 132: "etc", &etcpath, BD_NIL, ! 133: "ldoptions", &ldoptions, BD_ADD, ! 134: "ldoptlibs", &ldoptlibs, BD_ADD, ! 135: "mail", &mailpath, BD_NIL, ! 136: "mandir", &mandir, BD_NIL, ! 137: "manuals", &manuals, BD_NIL, ! 138: "mf", &mf, BD_NIL, ! 139: "mts", &mts, BD_NIL, ! 140: "oldload", &oldload, BD_NIL, ! 141: "options", &options, BD_ADD, ! 142: "pop", &pop, BD_NIL, ! 143: "popbboards", &popbboards, BD_NIL, ! 144: "ranlib", &ranlib, BD_NIL, ! 145: "flex", &flex, BD_NIL, ! 146: "remove", &remove, BD_NIL, ! 147: "tma", &tma, BD_NIL, ! 148: NULL ! 149: }; ! 150: ! 151: ! 152: char *files[] = { ! 153: "../support/bboards/bboards.daily", ! 154: "../support/bboards/bboards.weekly", ! 155: "../support/bboards/crontab", ! 156: "../support/bboards/MakeBBoards", ! 157: "../config/config.c", ! 158: "../zotnet/mts/mts.c", ! 159: "../zotnet/mts/mtstailor", ! 160: "../support/general/MailAliases", ! 161: "../mts/sendmail/bboardsMH.m4", ! 162: "../mts/sendmail/popMH.m4", ! 163: NULL ! 164: }; ! 165: ! 166: static struct pair { ! 167: char *infile; ! 168: char *outfile; ! 169: } makefiles[] = { ! 170: MFIL (config), ! 171: MFIL (dist), ! 172: MFIL (doc), ! 173: MMFIL (mtsM,mts), ! 174: MFIL (mts/mh), ! 175: MFIL (mts/mmdf), ! 176: MFIL (mts/sendmail), ! 177: MFIL (papers), ! 178: MFIL (sbr), ! 179: MMFIL (supportM,support), ! 180: MFIL (support/bboards), ! 181: MFIL (support/general), ! 182: MFIL (support/pop), ! 183: MFIL (uip), ! 184: MMFIL (zotnetM,zotnet), ! 185: MFIL (zotnet/bboards), ! 186: MFIL (zotnet/mf), ! 187: MFIL (zotnet/mts), ! 188: MFIL (zotnet/tws), ! 189: NULL ! 190: }; ! 191: ! 192: ! 193: char *stradd (), *strdup (), *tail (); ! 194: ! 195: long time (); ! 196: ! 197: /* */ ! 198: ! 199: /* ARGSUSED */ ! 200: ! 201: main (argc, argv, envp) ! 202: int argc; ! 203: char **argv, ! 204: **envp; ! 205: { ! 206: arginit (argc, argv); ! 207: ! 208: if (sedP) ! 209: do_sed (); ! 210: if (filesP) ! 211: do_files (); ! 212: if (docP) ! 213: do_doc (); ! 214: if (makeP) ! 215: do_make (); ! 216: ! 217: if (filesP || makeP) ! 218: printf ("Don't forget to run \"make clean\" before proceeding\n"); ! 219: ! 220: exit (0); ! 221: } ! 222: ! 223: /* */ ! 224: ! 225: static do_sed () { ! 226: do_sedfile (SED, 0); ! 227: do_sedfile (SEDOC, smtp); ! 228: } ! 229: ! 230: ! 231: static do_sedfile (sed, flag) ! 232: char *sed; ! 233: int flag; ! 234: { ! 235: int i; ! 236: FILE * fp; ! 237: ! 238: if ((fp = fopen (sed, "w")) == NULL) ! 239: adios (sed, "unable to write"); ! 240: printf ("generating %s\n", sed); ! 241: ! 242: fprintf (fp, "s%%@(MHWARNING)%%%s%%g\n", WARNING); ! 243: fprintf (fp, "s%%@(MHBINPATH)%%%s%%g\n", SVAL (binpath)); ! 244: fprintf (fp, "s%%@(MHETCPATH)%%%s%%g\n", SVAL (etcpath)); ! 245: fprintf (fp, "s%%@(MHCHOWNPATH)%%%s%%g\n", SVAL (chownpath)); ! 246: fprintf (fp, "s%%@(MHDROPATH)%%%s%%g\n", SVAL (maildir)); ! 247: fprintf (fp, "s%%@(MHDROPFIL)%%%s%%g\n", SVAL (mailfile)); ! 248: if (maildir) ! 249: fprintf (fp, "s%%@(MHDROPLOC)%%%s/$USER%%g\n", SVAL (maildir)); ! 250: else ! 251: fprintf (fp, "s%%@(MHDROPLOC)%%$HOME/%s%%g\n", SVAL (mailfile)); ! 252: fprintf (fp, "s%%@(MHDROPHAK)%%%s%%g\n",/* HACK */ ! 253: maildir ? maildir : "/usr/spool/mail"); ! 254: ! 255: fprintf (fp, "s%%@(MHMANDIR)%%%s%%g\n", mandir); ! 256: if (strcmp (manuals, "standard") == 0 || strcmp (manuals, "gen") == 0) ! 257: for (i = 1; i <= 8; i++) { ! 258: fprintf (fp, "s%%@(MHMANDIR%d)%%man%d%%g\n", i, i); ! 259: fprintf (fp, "s%%@(MHMANEXT%d)%%%d%%g\n", i, i); ! 260: } ! 261: else ! 262: for (i = 1; i <= 8; i++) { ! 263: fprintf (fp, "s%%@(MHMANDIR%d)%%man%c%%g\n", i, ! 264: strcmp (manuals, "new") == 0 ? 'n' ! 265: : strcmp (manuals, "old") == 0 ? 'o' ! 266: : 'l'); ! 267: fprintf (fp, "s%%@(MHMANEXT%d)%%%c%%g\n", i, ! 268: strcmp (manuals, "new") == 0 ? 'n' ! 269: : strcmp (manuals, "old") == 0 ? 'o' ! 270: : 'l'); ! 271: } ! 272: if (strcmp (manuals, "gen") == 0) ! 273: fprintf (fp, "s%%@(MHMANGEN)%%%s%%g\n", "#"); /* comment char */ ! 274: else ! 275: fprintf (fp, "s%%@(MHMANGEN)%%%s%%g\n", ""); ! 276: ! 277: fprintf (fp, "s%%@(MHEDITOR)%%%s%%g\n", SVAL (editor)); ! 278: fprintf (fp, "s%%@(MHCONFIG)%%%s%%g\n", SVAL (myopts)); ! 279: fprintf (fp, "s%%@(CC)%%%s%%g\n", SVAL (cc)); ! 280: if (ccoptions) ! 281: fprintf (fp, "s%%@(MHOPTIONS)%%%s %s%%g\n", ! 282: SVAL (options), SVAL (ccoptions)); ! 283: else ! 284: fprintf (fp, "s%%@(MHOPTIONS)%%%s%%g\n", SVAL (options)); ! 285: fprintf (fp, "s%%@(LDOPTIONS)%%%s%%g\n", SVAL (ldoptions)); ! 286: fprintf (fp, "s%%@(LDOPTLIB)%%%s%%g\n", SVAL (ldoptlibs)); ! 287: fprintf (fp, "s%%@(LDCURSES)%%%s%%g\n", SVAL (curses)); ! 288: ! 289: if (strcmp (bboards, "on") == 0) ! 290: fprintf (fp, "/^@BEGIN: BBOARDS$/d\n/^@END: BBOARDS$/d\n"); ! 291: else ! 292: fprintf (fp, "/^@BEGIN: BBOARDS$/,/^@END: BBOARDS$/d\n"); ! 293: fprintf (fp, "s%%@(BBHOME)%%%s%%g\n", SVAL (bbhome)); ! 294: ! 295: if (strcmp (debug, "on") == 0) { ! 296: fprintf (fp, "/^@BEGIN: DEBUG$/d\n/^@END: DEBUG$/d\n"); ! 297: fprintf (fp, "/^@BEGIN: OPTIM$/,/^@END: OPTIM$/d\n"); ! 298: } ! 299: else { ! 300: fprintf (fp, "/^@BEGIN: DEBUG$/,/^@END: DEBUG$/d\n"); ! 301: fprintf (fp, "/^@BEGIN: OPTIM$/d\n/^@END: OPTIM$/d\n"); ! 302: } ! 303: ! 304: if (strcmp (oldload, "on") == 0) { ! 305: fprintf (fp, "/^@BEGIN: OLDLOAD$/d\n/^@END: OLDLOAD$/d\n"); ! 306: fprintf (fp, "/^@BEGIN: NEWLOAD$/,/^@END: NEWLOAD$/d\n"); ! 307: } ! 308: else { ! 309: fprintf (fp, "/^@BEGIN: NEWLOAD$/d\n/^@END: NEWLOAD$/d\n"); ! 310: fprintf (fp, "/^@BEGIN: OLDLOAD$/,/^@END: OLDLOAD$/d\n"); ! 311: } ! 312: ! 313: if (strcmp (ranlib, "on") == 0) { ! 314: fprintf (fp, "/^@BEGIN: RANLIB$/d\n/^@END: RANLIB$/d\n"); ! 315: fprintf (fp, "/^@BEGIN: LORDER$/,/^@END: LORDER$/d\n"); ! 316: } ! 317: else { ! 318: fprintf (fp, "/^@BEGIN: LORDER$/d\n/^@END: LORDER$/d\n"); ! 319: fprintf (fp, "/^@BEGIN: RANLIB$/,/^@END: RANLIB$/d\n"); ! 320: } ! 321: ! 322: if (strcmp (flex, "on") == 0) { ! 323: fprintf (fp, "/^@BEGIN: FLEX$/d\n/^@END: FLEX$/d\n"); ! 324: fprintf (fp, "/^@BEGIN: LEX$/,/^@END: LEX$/d\n"); ! 325: } ! 326: else { ! 327: fprintf (fp, "/^@BEGIN: LEX$/d\n/^@END: LEX$/d\n"); ! 328: fprintf (fp, "/^@BEGIN: FLEX$/,/^@END: FLEX$/d\n"); ! 329: } ! 330: ! 331: if (strcmp (tma, "on") == 0) ! 332: fprintf (fp, "/^@BEGIN: TMA$/d\n/^@END: TMA$/d\n"); ! 333: else ! 334: fprintf (fp, "/^@BEGIN: TMA$/,/^@END: TMA$/d\n"); ! 335: if (flag || ((mtsnum == mmdf || mtsnum == mmdf2) && !smtp)) { ! 336: fprintf (fp, "/^@BEGIN: MMDFMTS$/d\n/^@END: MMDFMTS$/d\n"); ! 337: if (mtsnum == mmdf) ! 338: fprintf (fp, "/^@BEGIN: MMDFIMTS$/d\n/^@END: MMDFIMTS$/d\n"); ! 339: else ! 340: fprintf (fp, "/^@BEGIN: MMDFIMTS$/,/^@END: MMDFIMTS$/d\n"); ! 341: if (mtsnum == mmdf2) ! 342: fprintf (fp, "/^@BEGIN: MMDFIIMTS$/d\n/^@END: MMDFIIMTS$/d\n"); ! 343: else ! 344: fprintf (fp, "/^@BEGIN: MMDFIIMTS$/,/^@END: MMDFIIMTS$/d\n"); ! 345: } ! 346: else { ! 347: fprintf (fp, "/^@BEGIN: MMDFMTS$/,/^@END: MMDFMTS$/d\n"); ! 348: fprintf (fp, "/^@BEGIN: MMDFIMTS$/,/^@END: MMDFIMTS$/d\n"); ! 349: fprintf (fp, "/^@BEGIN: MMDFIIMTS$/,/^@END: MMDFIIMTS$/d\n"); ! 350: } ! 351: ! 352: if (mtsnum == mh) ! 353: fprintf (fp, "/^@BEGIN: MHMTS$/d\n/^@END: MHMTS$/d\n"); ! 354: else ! 355: fprintf (fp, "/^@BEGIN: MHMTS$/,/^@END: MHMTS$/d\n"); ! 356: ! 357: if (!flag && (mtsnum == sendmail || smtp)) ! 358: fprintf (fp, "/^@BEGIN: SENDMTS$/d\n/^@END: SENDMTS$/d\n"); ! 359: else ! 360: fprintf (fp, "/^@BEGIN: SENDMTS$/,/^@END: SENDMTS$/d\n"); ! 361: ! 362: switch (mtsnum) { ! 363: case mh: ! 364: case sendmail: ! 365: case mmdf: ! 366: fprintf (fp, "/^@BEGIN: SENDMTSHACK$/d\n/^@END: SENDMTSHACK$/d\n"); ! 367: break; ! 368: ! 369: default: ! 370: fprintf (fp, "/^@BEGIN: SENDMTSHACK$/,/^@END: SENDMTSHACK$/d\n"); ! 371: break; ! 372: } ! 373: ! 374: if (smtp) ! 375: fprintf (fp, "/^@BEGIN: SMTP$/d\n/^@END: SMTP$/d\n"); ! 376: else ! 377: fprintf (fp, "/^@BEGIN: SMTP$/,/^@END: SMTP$/d\n"); ! 378: ! 379: if (strcmp (pop, "on") == 0) ! 380: fprintf (fp, "/^@BEGIN: POP$/d\n/^@END: POP$/d\n"); ! 381: else ! 382: fprintf (fp, "/^@BEGIN: POP$/,/^@END: POP$/d\n"); ! 383: ! 384: if (strcmp (popbboards, "on") == 0) ! 385: fprintf (fp, "/^@BEGIN: BPOP$/d\n/^@END: BPOP$/d\n"); ! 386: else ! 387: fprintf (fp, "/^@BEGIN: BPOP$/,/^@END: BPOP$/d\n"); ! 388: ! 389: if (strcmp (mf, "on") == 0) ! 390: fprintf (fp, "/^@BEGIN: MF$/d\n/^@END: MF$/d\n"); ! 391: else ! 392: fprintf (fp, "/^@BEGIN: MF$/,/^@END: MF$/d\n"); ! 393: ! 394: fprintf (fp, "s%%@(MHREMOVE)%%%s%%g\n", SVAL (remove)); ! 395: ! 396: (void) fclose (fp); ! 397: } ! 398: ! 399: /* */ ! 400: ! 401: static do_files () { ! 402: char **pp; ! 403: ! 404: for (pp = files; *pp; pp++) ! 405: shell ("rm -f %s; sed -f %s < config/%s > %s", ! 406: *pp, SED, tail (*pp), *pp); ! 407: } ! 408: ! 409: ! 410: static do_doc () { ! 411: shell ("mhdoc"); ! 412: } ! 413: ! 414: ! 415: static do_make () { ! 416: char buffer[BUFSIZ]; ! 417: struct pair *pp; ! 418: ! 419: for (pp = makefiles; pp -> infile; pp++) { ! 420: (void) sprintf (buffer, MAKE, pp -> outfile); ! 421: shell ("rm -f %s; sed -f %s < %s > %s", ! 422: buffer, SED, pp -> infile, buffer); ! 423: } ! 424: } ! 425: ! 426: /* */ ! 427: ! 428: /* VARARGS */ ! 429: ! 430: static shell (fmt, a, b, c, d) ! 431: char *fmt, ! 432: *a, ! 433: *b, ! 434: *c, ! 435: *d; ! 436: { ! 437: int s; ! 438: char buffer[BUFSIZ]; ! 439: ! 440: (void) sprintf (buffer, fmt, a, b, c, d); ! 441: printf ("%s\n", buffer); ! 442: (void) fflush (stdout); ! 443: ! 444: s = system (buffer); ! 445: if (s == 256) { ! 446: printf ("(Not found, let's see if it's in \".\")\n"); ! 447: buffer[0] = '.'; ! 448: buffer[1] = '/'; ! 449: (void) sprintf (&buffer[2], fmt, a, b, c, d); ! 450: printf ("%s\n", buffer); ! 451: (void) fflush (stdout); ! 452: s = system (buffer); ! 453: } ! 454: if (s) ! 455: adios (NULLCP, "failed"); ! 456: } ! 457: ! 458: /* */ ! 459: ! 460: static arginit (n, vec) ! 461: int n; ! 462: char **vec; ! 463: { ! 464: int i; ! 465: char *ap, ! 466: *cp, ! 467: *dp, ! 468: *config, ! 469: buffer[BUFSIZ]; ! 470: struct bind *bp; ! 471: FILE * fp; ! 472: ! 473: myname = tail (*vec); ! 474: printf (BANNER, myname); ! 475: (void) fflush (stdout); ! 476: ! 477: vec++; ! 478: for (n--; n > 0; n--) { ! 479: if (strcmp (*vec, "-s") == 0) { ! 480: sedP = !sedP; ! 481: vec++; ! 482: continue; ! 483: } ! 484: if (strcmp (*vec, "-f") == 0) { ! 485: filesP = !filesP; ! 486: vec++; ! 487: continue; ! 488: } ! 489: if (strcmp (*vec, "-d") == 0) { ! 490: docP = !docP; ! 491: vec++; ! 492: continue; ! 493: } ! 494: if (strcmp (*vec, "-m") == 0) { ! 495: makeP = !makeP; ! 496: vec++; ! 497: continue; ! 498: } ! 499: break; ! 500: } ! 501: if ((config = *vec++) == NULL || *vec != NULL) ! 502: adios (NULLCP, "usage: %s file", myname); ! 503: ! 504: if ((fp = fopen (config, "r")) == NULL) ! 505: adios (config, "unable to read"); ! 506: ! 507: while (fgets (buffer, sizeof buffer, fp)) { ! 508: if (ap = index (buffer, '\n')) ! 509: *ap-- = NULL; ! 510: else ! 511: ap = &buffer[strlen (buffer) - 1]; ! 512: while (ap >= buffer) ! 513: if (isspace (*ap)) ! 514: *ap = NULL; ! 515: else ! 516: break; ! 517: for (cp = buffer; isspace (*cp); cp++) ! 518: continue; ! 519: if (*cp == NULL || *cp == '#') ! 520: continue; ! 521: for (ap = cp; *ap; ap++) ! 522: if (isspace (*ap)) { ! 523: *ap++ = NULL; ! 524: while (isspace (*ap)) ! 525: ap++; ! 526: break; ! 527: } ! 528: for (bp = binds; bp -> keyword; bp++) ! 529: if (strcmp (bp -> keyword, cp) == 0) ! 530: break; ! 531: if (bp -> keyword == NULL) ! 532: adios (NULLCP, "unknown option %s in %s", cp, config); ! 533: else ! 534: if (*(bp -> value) == NULL || !(bp -> flags & BD_ADD)) ! 535: *(bp -> value) = strdup (ap); ! 536: else ! 537: *(bp -> value) = stradd (ap, stradd (" ", *(bp -> value))); ! 538: } ! 539: ! 540: (void) fclose (fp); ! 541: ! 542: /* */ ! 543: ! 544: if (binpath == NULL) ! 545: adios (NULLCP, "bin must be specified in %s", config); ! 546: trim (binpath); ! 547: ! 548: if (strcmp (bboards, "on") && strcmp (bboards, "off")) ! 549: adios (NULLCP, "bboards should be either \"on\" or \"off\", not %s", ! 550: bboards); ! 551: if (bbhome == NULL) ! 552: adios (NULLCP, "bbhome must be specified in %s", config); ! 553: trim (bbhome); ! 554: ! 555: if (strcmp (debug, "on") && strcmp (debug, "off")) ! 556: adios (NULLCP, "debug should be either \"on\" or \"off\", not %s", ! 557: debug); ! 558: ! 559: if (etcpath == NULL) ! 560: adios (NULLCP, "etc must be specified in %s", config); ! 561: trim (etcpath); ! 562: ! 563: if (mailpath == NULL) ! 564: adios (NULLCP, "mail must be specified in %s", config); ! 565: trim (mailpath); ! 566: if (*mailpath == '/') ! 567: maildir = mailpath; ! 568: else ! 569: mailfile = mailpath; ! 570: ! 571: if (strcmp (manuals, "standard") ! 572: && strcmp (manuals, "local") ! 573: && strcmp (manuals, "new") ! 574: && strcmp (manuals, "old") ! 575: && strcmp (manuals, "gen") ! 576: && strcmp (manuals, "none")) ! 577: adios (NULLCP,"invalid manuals setting: %s",manuals); ! 578: ! 579: if (mts == NULL) ! 580: adios (NULLCP, "mts must be specified in %s", config); ! 581: for (i = 0; mtsopts[i].mtskey; i++) ! 582: if (strcmp (mts, mtsopts[i].mtskey) == 0) ! 583: break; ! 584: if ((mtsnum = mtsopts[i].code) == unknown) ! 585: adios (NULLCP, "invalid mts setting: %s", mts); ! 586: add_option (mtsopts[i].optval); ! 587: smtp = mtsopts[i].mtsflags & DOSMTP; ! 588: if (mtsopts[i].mtsflags & NOMF) ! 589: mf = "off"; /* hack... */ ! 590: ! 591: if (strcmp (pop, "on") && strcmp (pop, "off")) ! 592: adios (NULLCP, "pop should be either \"on\" or \"off\", not %s", pop); ! 593: if (strcmp (pop, "on") == 0) ! 594: add_option ("POP"); ! 595: ! 596: if (strcmp (popbboards, "on") && strcmp (popbboards, "off")) ! 597: adios (NULLCP, "popbboards should be either \"on\" or \"off\", not %s", ! 598: popbboards); ! 599: if (strcmp (popbboards, "on") == 0) { ! 600: add_option ("BPOP"); ! 601: if (strcmp (bboards, "on") || strcmp (pop, "on")) ! 602: adios (NULLCP, ! 603: "popbboards \"on\" requires both bboards and pop \"on\""); ! 604: } ! 605: ! 606: if (strcmp (mf, "on") && strcmp (mf, "off")) ! 607: adios (NULLCP, "mf should be either \"on\" or \"off\", not %s", mf); ! 608: if (strcmp (mf, "on") == 0) ! 609: add_option ("MF"); ! 610: ! 611: if (strcmp (tma, "on") && strcmp (tma, "off")) ! 612: adios (NULLCP, "tma should be either \"on\" or \"off\", not %s", tma); ! 613: if (strcmp (tma, "on") == 0) ! 614: add_option ("TMA"); ! 615: ! 616: begin_myopt (); ! 617: if (cp = options) { ! 618: for (ap = cp; *ap; ap++) ! 619: if (isspace (*ap)) ! 620: *ap = ' '; ! 621: options = NULL; ! 622: for (ap = cp; dp = index (ap, ' '); ap = dp) { ! 623: *dp++ = NULL; ! 624: add_myopt (ap); ! 625: (void) sprintf (buffer, "%s-D%s", options ? " " : "", ap); ! 626: ap = buffer; ! 627: options = stradd (ap, options); ! 628: while (isspace (*dp)) ! 629: dp++; ! 630: } ! 631: if (*ap) { ! 632: add_myopt (ap); ! 633: (void) sprintf (buffer, "%s-D%s", options ? " " : "", ap); ! 634: ap = buffer; ! 635: options = stradd (ap, options); ! 636: } ! 637: free (cp); ! 638: } ! 639: end_myopt (); ! 640: } ! 641: ! 642: /* */ ! 643: ! 644: static add_option (s) ! 645: char *s; ! 646: { ! 647: options = options ? stradd (s, stradd (" ", options)) : strdup (s); ! 648: } ! 649: ! 650: ! 651: begin_myopt () { ! 652: myopts = strdup ("char *options[] = {"); ! 653: } ! 654: ! 655: ! 656: add_myopt (s) ! 657: char *s; ! 658: { ! 659: int len; ! 660: char *bp, ! 661: buffer[BUFSIZ]; ! 662: static int nameoutput = 0; ! 663: static int linepos = 0; ! 664: static int outputlinelen = 72; ! 665: ! 666: if (!nameoutput) { ! 667: printf ("%s: ", bp = "options"); ! 668: linepos += (nameoutput = strlen (bp) + 2); ! 669: } ! 670: len = strlen (s); ! 671: if (linepos != nameoutput) ! 672: if (len + linepos + 3 > outputlinelen) ! 673: printf ("\n%*s", linepos = nameoutput, ""); ! 674: else ! 675: printf (" "), linepos++; ! 676: printf ("[%s]", s); ! 677: linepos += len + 2; ! 678: (void) fflush (stdout); ! 679: ! 680: bp = buffer; ! 681: *bp++ = '"'; ! 682: while (*s) { ! 683: if (*s == '"') ! 684: *bp++ = QUOTE, *bp++ = QUOTE; ! 685: *bp++ = *s++; ! 686: } ! 687: (void) strcpy (bp, "\", "); ! 688: myopts = stradd (buffer, myopts); ! 689: } ! 690: ! 691: ! 692: end_myopt () { ! 693: printf ("\n"); ! 694: (void) fflush (stdout); ! 695: ! 696: myopts = stradd ("NULL};", myopts); ! 697: } ! 698: ! 699: /* */ ! 700: ! 701: static trim (s) ! 702: char *s; ! 703: { ! 704: char *p; ! 705: ! 706: if (s == NULL || (p = rindex (s, '/')) == NULL) ! 707: return; ! 708: if (*++p == NULL) ! 709: *--p = NULL; ! 710: } ! 711: ! 712: ! 713: static char *tail (s) ! 714: char *s; ! 715: { ! 716: char *p; ! 717: ! 718: if (p = rindex (s, '/')) ! 719: p++; ! 720: return ((p == NULL || *p == NULL) ? s : p); ! 721: } ! 722: ! 723: /* */ ! 724: ! 725: static char *stradd (s1, s2) ! 726: char *s1, ! 727: *s2; ! 728: { ! 729: char *p; ! 730: ! 731: if (s1 == NULL || *s1 == NULL) ! 732: return s2; ! 733: if (s2 == NULL) ! 734: return strdup (s1); ! 735: if ((p = malloc ((unsigned) (strlen (s1) + strlen (s2) + 2))) == NULL) ! 736: adios (NULLCP, "insufficient memory"); ! 737: ! 738: (void) sprintf (p, "%s%s", s2, s1); ! 739: if (s2) ! 740: free (s2); ! 741: return p; ! 742: } ! 743: ! 744: ! 745: static char *strdup (s) ! 746: char *s; ! 747: { ! 748: char *p; ! 749: ! 750: if ((p = malloc ((unsigned) (strlen (s) + 1))) == NULL) ! 751: adios (NULLCP, "insufficient memory"); ! 752: ! 753: (void) strcpy (p, s); ! 754: return p; ! 755: } ! 756: ! 757: /* */ ! 758: ! 759: static char *index (s, c) ! 760: char *s, ! 761: c; ! 762: { ! 763: char i; ! 764: ! 765: while (i = *s++) ! 766: if (i == c) ! 767: return (s - 1); ! 768: ! 769: return NULL; ! 770: } ! 771: ! 772: ! 773: static char *rindex (s, c) ! 774: char *s, ! 775: c; ! 776: { ! 777: char i, ! 778: *t; ! 779: ! 780: t = NULL; ! 781: while (i = *s++) ! 782: if (i == c) ! 783: t = s - 1; ! 784: ! 785: return t; ! 786: } ! 787: ! 788: /* */ ! 789: ! 790: /* VARARGS */ ! 791: ! 792: adios (what, fmt, a, b, c) ! 793: char *what, ! 794: *fmt, ! 795: *a, ! 796: *b, ! 797: *c; ! 798: { ! 799: (void) fflush (stdout); ! 800: ! 801: fprintf (stderr, "%s: ", myname); ! 802: fprintf (stderr, fmt, a, b, c); ! 803: if (what) { ! 804: (void) fputc (' ', stderr); ! 805: perror (what); ! 806: } ! 807: else ! 808: (void) fputc ('\n', stderr); ! 809: ! 810: exit (1); ! 811: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.