Annotation of 43BSD/contrib/mh/conf/mhconfig.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.