Annotation of coherent/d/usr/bin/uuinstall/uuinstall.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Create /usr/lib/uucp/L.sys file
                      3:  */
                      4: #include <curses.h>
                      5: #include <ctype.h>
                      6: #include <string.h>
                      7: #include <assert.h>
                      8: 
                      9: #include "choices.h"   /* include files from various screens */
                     10: #include "choices1.h"
                     11: #include "choices2.h"
                     12: #include "escapes.h"
                     13: #include "lsys1.h"
                     14: #include "uuin.h"
                     15: #include "uunam.h"
                     16: #include "devices.h"
                     17: #include "permis.h"
                     18: #include "helpscn.h"
                     19: #include "comment.h"
                     20: 
                     21: #define LIMIT 78 /* Characters per output line */
                     22: 
                     23: #define UUNAME  fileList[0]
                     24: #define DOMAIN  fileList[1]
                     25: #define SYSFILE fileList[2]
                     26: #define DEVFILE fileList[3]
                     27: #define PERMISS fileList[4]
                     28: #define PASSWD  fileList[5]
                     29: 
                     30: static char **fileList;
                     31: static *testFiles[] = {        /* use these files if uuinstall -d */
                     32:   "../uucpname",
                     33:   "../domain",
                     34:   "../L.sys",
                     35:   "../L-devices",
                     36:   "../Permissions",
                     37:   "../passwd"
                     38: };
                     39: 
                     40: static char *realFiles[] = { /* the real files */
                     41:   "/etc/uucpname",
                     42:   "/etc/domain",
                     43:   "/usr/lib/uucp/L.sys",
                     44:   "/usr/lib/uucp/L-devices",
                     45:   "/usr/lib/uucp/Permissions",
                     46:   "/etc/passwd"
                     47: };
                     48: 
                     49: static int nameMod;    /* 1 if name modified */
                     50: 
                     51: static char buf[1024];
                     52: static char work[200];
                     53: static char schedule[200];
                     54: 
                     55: static int pos, lineNo;        /* current screen position */
                     56: static char seps[] = " \t\n";  /*strtok seperators */
                     57: static char oldSys[21];
                     58: 
                     59: typedef struct line line;
                     60: struct line {
                     61:        line *next;
                     62:        char str[1];    /* data in line */
                     63: };
                     64: 
                     65: #define Trace showError
                     66: #undef strlcpy
                     67: #define strlcpy(to, from) cplim((to), (from), sizeof(to))
                     68: 
                     69: /*
                     70:  * Structure that describes multi line files.
                     71:  */
                     72: typedef struct fillin fillin;
                     73: struct fillin {
                     74:        line    *root;          /* beginning of line list (must be first) */
                     75:        char    fileno;         /* index into filelist */
                     76:        char    mod;            /* 1 if mod has been made */
                     77:        void    (*zero)();      /* clear fields */
                     78:        void    (*distrib)();   /* get fields from line */
                     79:        void    (*clump)();     /* put fields back in line */
                     80:        backGrnd *ch_data;      /* back ground table for choices */
                     81:        loc     *ch_loc;        /* loc table for choices */
                     82:        backGrnd *s_data;       /* back ground table for data */
                     83:        loc     *s_loc;         /* loc table for data */
                     84: };
                     85: 
                     86: void zeroLsys(), showLsys(), clumpLsys();
                     87: fillin lsys = {
                     88:        NULL, 2, 0,
                     89:        zeroLsys, showLsys, clumpLsys,
                     90:        choices2_data, choices2_locs,
                     91:        lsys1_data, lsys1_locs
                     92: };
                     93: 
                     94: void zeroDev(), showDev(), clumpDev();
                     95: fillin dev = {
                     96:        NULL, 3, 0,
                     97:        zeroDev, showDev, clumpDev,
                     98:        choices_data, choices_locs,
                     99:        devices_data, devices_locs
                    100: };
                    101: 
                    102: void zeroPerm(), showPerm(), clumpPerm();
                    103: fillin permis = {
                    104:        NULL, 4, 0,
                    105:        zeroPerm, showPerm, clumpPerm,
                    106:        choices1_data, choices1_locs,
                    107:        permis_data, permis_locs
                    108: };
                    109: 
                    110: /*
                    111:  * Copy for limit if source not null.
                    112:  */
                    113: static char *
                    114: cplim(to, from, len)
                    115: char *to, *from;
                    116: {
                    117:        if (NULL == from)
                    118:                return (memchr(to, '\0', len));
                    119: 
                    120:        return (memcpy(to, from, len));
                    121: }
                    122: 
                    123: /*
                    124:  * do "" for null.
                    125:  */
                    126: static char *
                    127: lump(x)
                    128: char *x;
                    129: {
                    130:        return(*x ? x : "\"\"");
                    131: }
                    132: 
                    133: /*
                    134:  * Read a 1 line file into a string.
                    135:  */
                    136: void
                    137: shortFile(fn, s)
                    138: char *fn, *s;
                    139: {
                    140:        FILE *ifp;
                    141: 
                    142:        if (NULL == (ifp = fopen(fn, "r"))) {
                    143:                if (yn("Cannot open %s continue", fn))
                    144:                        s[0] = '\0';
                    145:                exit(1);
                    146:        }
                    147:        else {
                    148:                fgets(s, 64, ifp);
                    149:                if (NULL != (s = strchr(s, '\n')))
                    150:                        *s = '\0';
                    151:        }
                    152:        fclose(ifp);
                    153: }
                    154: 
                    155: /*
                    156:  * Inhale a file to a list.
                    157:  */
                    158: static void
                    159: inhale(f)
                    160: fillin *f;
                    161: {
                    162:        line *this, *last;
                    163:        FILE *ifp;
                    164:        char *s;
                    165:        int lineNo;
                    166: 
                    167:        if (NULL == (ifp = fopen((s = fileList[f->fileno]), "r"))) {
                    168:                if (yn("Cannot open %s continue", s))
                    169:                        return;
                    170:                exit(1);
                    171:        }
                    172:        
                    173:        for (lineNo = 1; NULL != (s = getline(ifp, &lineNo)); ) {
                    174:                this = (line *)alloc(strlen(s) + sizeof(line));
                    175:                if (NULL == f->root)
                    176:                        last = f->root = this;
                    177:                else
                    178:                        last = last->next = this;
                    179:                strcpy(this->str, s);
                    180:        }
                    181:        fclose(ifp);
                    182: }
                    183: 
                    184: /*
                    185:  * Clean out strings.
                    186:  */
                    187: static void
                    188: zeroLsys()
                    189: {
                    190:        register int i;
                    191: 
                    192:        code[0] = sys[0] = Line[0] = baudRate[0] = phoneNo[0] = 0;
                    193:        for (i = 0; i < TIMEPAIRS; i++)
                    194:                day[i][0] = timeFrom[i][0] = timeTo[i][0] = 0;
                    195:        for (i = 0; i < SENDPAIRS; i++) {
                    196:                free(expect[i]);
                    197:                free(send[i]);
                    198:                expect[i] = send[i] = NULL;
                    199:        }
                    200: }
                    201: static void
                    202: zeroDev()
                    203: {
                    204:        code[0] = devType[0] = devLine[0] = devRemote[0] = devBaud[0] = 
                    205:        devBrand[0] = 0;
                    206: }
                    207: 
                    208: static void
                    209: zeroPerm()
                    210: {
                    211:        perNoWrite = perComm = perRead =
                    212:        perNoRead = perWrite = NULL;
                    213: 
                    214:        perSite[0] = perMyName[0] = perLogn[0] = perEtc[0] =
                    215:        code[0] = perCallIn[1] = perSendFiles[1] = perRequest[1] = 0;
                    216: }
                    217: 
                    218: /*
                    219:  * Show off a permissions line.
                    220:  */
                    221: static void
                    222: showPerm()
                    223: {
                    224:        grabKey("MACHINE=", perSite, sizeof(perSite));
                    225: 
                    226:        strcpy(perCallIn, 
                    227:          (grabKey("LOGNAME=", perLogn, sizeof(perLogn)) ? "y" : "n"));
                    228:        if (!grabKey("MYNAME=", perMyName, sizeof(perMyName)))
                    229:                strcpy(perMyName, perSite);
                    230:        lgrabKey("COMMANDS=", &perComm);
                    231:        lgrabKey("READ=", &perRead);
                    232:        lgrabKey("NOREAD=", &perNoRead);
                    233:        lgrabKey("WRITE=", &perWrite);
                    234:        lgrabKey("NOWRITE=", &perNoWrite);
                    235:        grabYn("SENDFILES=", perSendFiles, 'y');
                    236:        grabYn("REQUEST=", perRequest, 'y');
                    237: }
                    238: 
                    239: /*
                    240:  * Display a single system line.
                    241:  */
                    242: static void
                    243: showLsys()
                    244: {
                    245:        register char *w;
                    246:        int j, k;
                    247:        static char timeErr[] = "Invalid time field in file";
                    248: 
                    249:        strlcpy(sys, strtok(buf, seps));
                    250:        strcpy(oldSys, sys);
                    251:        strlcpy(work, strtok(NULL, seps));
                    252:        for ((w = work), (k = 0); *w && (k < TIMEPAIRS); k++) {
                    253:                if (!isalpha(*w)) {
                    254:                        showError(timeErr);
                    255:                        break;
                    256:                }
                    257:                for (j = 0; isalpha(*w) && (j < (sizeof(day[0]) - 1)); j++, w++)
                    258:                        day[k][j] = *w;
                    259:                day[k][j] = '\0';
                    260:                j = 4;
                    261:                while (isdigit(*w)) {   /* time field exists */
                    262:                        for (j = 0;
                    263:                            isdigit(*w) && (j < (sizeof(timeFrom[0]) - 1));
                    264:                            j++, w++)
                    265:                                timeFrom[k][j] = *w;
                    266:                        timeFrom[k][j] = '\0';
                    267:                        if ((j != 4) || (*w++ != '-')) {
                    268:                                showError(timeErr);
                    269:                                k = TIMEPAIRS;
                    270:                                break;
                    271:                        }
                    272:                        for (j = 0;
                    273:                            isdigit(*w) && (j < (sizeof(timeTo[0]) - 1));
                    274:                            j++, w++)
                    275:                                timeTo[k][j] = *w;
                    276:                        timeTo[k][j] = '\0';
                    277:                }
                    278:                if ((j != 4) || (*w && (*w++ != ','))) {
                    279:                        showError(timeErr);
                    280:                        break;
                    281:                }
                    282:        }
                    283: 
                    284:        strlcpy(Line, strtok(NULL, seps));
                    285:        strlcpy(baudRate, strtok(NULL, seps));
                    286:        strlcpy(phoneNo, strtok(NULL, seps));
                    287: 
                    288:        for (j = 0; j < SENDPAIRS; j++) {
                    289:                free(expect[j]);
                    290:                free(send[j]);
                    291:                send[j] = NULL;
                    292:                if (NULL == (expect[j] = newcpy(strtok(NULL, seps))))
                    293:                        break;
                    294:                if (NULL == (send[j] = newcpy(strtok(NULL, seps))))
                    295:                        break;
                    296:        }
                    297: }
                    298: 
                    299: /*
                    300:  * show an device line.
                    301:  */
                    302: static void
                    303: showDev()
                    304: {
                    305:        char *p;
                    306:        loc *f;
                    307: 
                    308:        p = buf;
                    309:        for (f = devices_locs; NULL != f->field; f++) {
                    310:                cplim(f->field, strtok(p, seps), f->len);
                    311:                p = NULL;
                    312:        }
                    313: }
                    314: 
                    315: /*
                    316:  * Find a key on a buffer.
                    317:  */
                    318: grabKey(key, to, len)
                    319: char *key, *to;
                    320: {
                    321:        register char *p, c;
                    322: 
                    323:        if (NULL == (p = strstr(buf, key)))
                    324:                return (to[0] = 0);
                    325:        for (p += strlen(key); --len && (c = *p++) && !isspace(c); )
                    326:                *to++ = c;
                    327:        *to = '\0';
                    328:        return (1);
                    329: }
                    330: 
                    331: /*
                    332:  * Find a key on a buffer. For long field.
                    333:  */
                    334: lgrabKey(key, to)
                    335: char *key, **to;
                    336: {
                    337:        register char *q, *p, c;
                    338:        int len;
                    339: 
                    340:        free(*to);
                    341:        *to = NULL;
                    342:        if (NULL == (p = strstr(buf, key)))
                    343:                return;
                    344:        for (len = 0, q = p += strlen(key); (c = *p++) && !isspace(c); )
                    345:                len++;
                    346:        *to = alloc(len + 1);
                    347:        memcpy(*to, q, len);
                    348:        return;
                    349: }
                    350: 
                    351: /*
                    352:  * Find a key on a buffer with yes or no.
                    353:  */
                    354: grabYn(key, to, def)
                    355: char *key, *to;
                    356: {
                    357:        register char *p;
                    358: 
                    359:        to[1] = '\0';
                    360:        if (NULL == (p = strstr(buf, key))) {
                    361:                to[0] = def;
                    362:                return (0);
                    363:        }
                    364:        to[0] = p[strlen(key)];
                    365:        return (1);
                    366: }
                    367: 
                    368: /*
                    369:  * Check a field against a list.
                    370:  */
                    371: checkList(field, list)
                    372: register char *field;
                    373: register char **list;
                    374: {
                    375:        for (; NULL != *list; list++)
                    376:                if (!strcmp(field, *list))
                    377:                        return (1);
                    378:        return (0);
                    379: }
                    380: 
                    381: /*
                    382:  * Check for Yes No Call
                    383:  */
                    384: yesNoCall(s)
                    385: register char *s;
                    386: {
                    387:        *s = tolower(*s);
                    388:        switch (*s) {
                    389:        case 'y':
                    390:        case 'n':
                    391:        case 'c':
                    392:                return (1);
                    393:        }
                    394:        return (0);
                    395: }
                    396: 
                    397: /*
                    398:  * Verify site name.
                    399:  */
                    400: vSite(s)
                    401: register char *s;
                    402: {
                    403:        if (!s[0]) {
                    404:                showError("There must be a site name");
                    405:                return (0);
                    406:        }
                    407:        sprintf(perLogn, "u%s", s);
                    408:        putField(permis_locs, perLogn);
                    409:        return (1);
                    410: }
                    411: 
                    412: /*
                    413:  * Check day part of scheduele field.
                    414:  */
                    415: checkDay(s)
                    416: char *s;
                    417: {
                    418:        register char *p, c, *w;
                    419:        char work[10];
                    420:        static char *dayList[] = {
                    421:                "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa",
                    422:                "Wk", "Any", "Never", NULL
                    423:        };
                    424: 
                    425:        if (!s[0]) {
                    426:                if (s == day)
                    427:                        return (0);     /* must have first day field */
                    428:                else
                    429:                        return (-1);    /* skip remainder */
                    430:        }
                    431: 
                    432:        for (p = s; c = *p; ) {
                    433:                if (!isupper(c)) {
                    434:                        showError("All day field Names start upper case");
                    435:                        return (0);
                    436:                }
                    437:                work[0] = c;
                    438:                for ((w = work + 1), p++; islower(c = *p) ; p++)
                    439:                        *w++ = c;
                    440:                *w = '\0';
                    441:                if (!checkList(work, dayList)) {
                    442:                        showError("Invalid day field %s", w);
                    443:                        return (0);
                    444:                }
                    445:        }
                    446:        return (1);
                    447: }
                    448: 
                    449: /*
                    450:  * Check Line field.
                    451:  */
                    452: checkLine(s)
                    453: char *s;
                    454: {
                    455:        register line *l;
                    456: 
                    457:        if (!strcmp(s, "ACU") || !strcmp(s, "None"))
                    458:                return (1);
                    459:        for (l = dev.root; NULL != l; l = l->next) {
                    460:                if ('#' == l->str[0])
                    461:                        continue;
                    462:                strcpy(buf, l->str);
                    463:                if (strcmp("DIR", strtok(buf, seps)))
                    464:                        continue;
                    465:                if (!strcmp(s, strtok(NULL, seps)))
                    466:                        return (1);
                    467:        }
                    468:        showError("Line must be ACU, None, or DIR line in %s", DEVFILE);
                    469:        return (0);
                    470: }
                    471: 
                    472: /*
                    473:  * Check time field.
                    474:  */
                    475: checkTime(s)
                    476: register char *s;
                    477: {
                    478:        register t;
                    479: 
                    480:        if (!s[0])
                    481:                return (-1);    /* skip fields */
                    482:        return (numeric(s) && ((t = atoi(s)) >= 0) && (t <= 2400));
                    483: }
                    484: 
                    485: /*
                    486:  * Save a list of lines.
                    487:  */
                    488: static void
                    489: saveAll(f)
                    490: register fillin *f;
                    491: {
                    492:        FILE *ofp;
                    493:        register line *l;
                    494: 
                    495:        if (!f->mod)
                    496:                return;
                    497:        ofp = xopen(fileList[f->fileno], "w");
                    498:        for (l = f->root; NULL != l; l = l->next)
                    499:                if ('#' == l->str[0])
                    500:                        fputs(l->str, ofp);
                    501:                else
                    502:                        splitter(ofp, l->str, LIMIT);
                    503:        fclose(ofp);
                    504: }
                    505: 
                    506: /*
                    507:  * Save a one line file.
                    508:  */
                    509: saveLine(fn, s)
                    510: char *fn, *s;
                    511: {
                    512:        FILE *ofp;
                    513: 
                    514:        ofp = xopen(fn, "w");
                    515:        fprintf(ofp, "%s\n", s);
                    516:        fclose(ofp);
                    517: }
                    518: 
                    519: /*
                    520:  * Delete a line entry.
                    521:  */
                    522: line *
                    523: deleteEntry(root, l)
                    524: line **root, *l;
                    525: {
                    526:        for (; *root != l; root = (line **)root->next)
                    527:                ;
                    528:        *root = l->next;
                    529:        free(l);                
                    530:        return(*root);
                    531: }
                    532: 
                    533: /*
                    534:  * Add a line to a queue after place.
                    535:  */
                    536: static line *
                    537: addLine(f, place, replace)
                    538: register fillin *f;
                    539: register line *place;
                    540: int replace;
                    541: {
                    542:        register line *this, *l;
                    543: 
                    544:        this = alloc(strlen(buf) + sizeof(line));
                    545:        strcpy(this->str, buf);
                    546: 
                    547:        if (NULL != place)
                    548:                this->next = place->next;
                    549: 
                    550:        if (!replace)   /* add entry */
                    551:                return (place->next = this);
                    552: 
                    553:        free(place);
                    554: 
                    555:        if (f->root == place)   /* do base of chain */
                    556:                return (f->root = this);
                    557: 
                    558:        /* find pointer to place */
                    559:        for (l = f->root; NULL != l; l = l->next)
                    560:                if (l->next == place)
                    561:                        return (l->next = this);
                    562: 
                    563:        fatal("Logic error in addLine");
                    564: }
                    565: 
                    566: /*
                    567:  * Put Lsys together into new line.
                    568:  */
                    569: static void
                    570: clumpLsys()
                    571: {
                    572:        int i;
                    573:        register char *s;
                    574: 
                    575:        for (schedule[0] = i = 0; (i < TIMEPAIRS) && day[i][0]; i++) {
                    576:                if (i)
                    577:                        strcat(schedule, ",");
                    578:                strcat(schedule, day[i]);
                    579:                if (timeFrom[i][0]) {
                    580:                        strcat(schedule, timeFrom[i]);
                    581:                        strcat(schedule, "-");
                    582:                        strcat(schedule, timeTo[i]);
                    583:                }
                    584:        }
                    585: 
                    586:        sprintf(buf, "%s %s %s %s %s",
                    587:                sys, schedule, Line, lump(baudRate), lump(phoneNo));
                    588: 
                    589:        for (s = buf, i = 0;
                    590:             (i < SENDPAIRS) && (expect[i][0] || send[i][0]);
                    591:             i++) {
                    592:                s = strchr(s, '\0');
                    593:                sprintf(s, " %s %s", lump(expect[i]), lump(send[i]));
                    594:        }
                    595: 
                    596:        /* create /usr/spool/uucp/sys directory */
                    597:        if (strcmp(sys, oldSys)) {
                    598:                /* If we truncate directorys %s becomes %.7s */
                    599:                sprintf(work,
                    600:                 "/usr/lib/uucp/uumkdir /usr/spool/uucp/%s > /dev/null", sys);
                    601:                system(work);
                    602:        }
                    603: }
                    604: 
                    605: /*
                    606:  * Put device stuff together into new line.
                    607:  */
                    608: static void
                    609: clumpDev()
                    610: {
                    611:        sprintf(buf, "%s\t%s\t%s\t%s\t%s",
                    612:                devType, devLine, devRemote, devBaud, devBrand);
                    613: }
                    614: 
                    615: /*
                    616:  * Add passwd.
                    617:  */
                    618: void
                    619: addPasswd()
                    620: {
                    621:        FILE *fp;
                    622:        char *p;
                    623: 
                    624:        if (!perLogn[0]) {
                    625:                showMsg("Must have LOGNAME to add to /etc/passwd");
                    626:                return;
                    627:        }
                    628: 
                    629:        if (NULL == (fp = fopen(PASSWD, "rw"))) {
                    630:                showMsg("Cannot open %s", PASSWD);
                    631:                return;
                    632:        }
                    633: 
                    634:        while (NULL != fgets(work, sizeof(work), fp)) {
                    635:                if (NULL != (p = strchr(work, ':'))) {
                    636:                        *p = '\0';
                    637:                        if (!strcmp(work, perLogn)) {
                    638:                                showMsg("%s already in %s", perLogn, PASSWD);
                    639:                                return;
                    640:                        }
                    641:                }
                    642:        }
                    643:        fprintf(fp, "%s::6:6::/usr/spool/uucp:/usr/lib/uucp/uucico\n", perLogn);
                    644:        fclose(fp);
                    645:        showMsg("%s added to %s successfully", perLogn, PASSWD);
                    646: }
                    647: 
                    648: /*
                    649:  * Put Permissions together into new line.
                    650:  */
                    651: static void
                    652: clumpPerm()
                    653: {
                    654:        if ('y' == perCallIn[0])
                    655:                sprintf(buf, "MACHINE=%s LOGNAME=%s ",
                    656:                        perSite, perLogn);
                    657:        else
                    658:                sprintf(buf, "MACHINE=%s ", perSite);
                    659: 
                    660:        if ('y' == perEtc[0])
                    661:                addPasswd();
                    662: 
                    663:        if (perMyName[0] && strcmp(perSite, perMyName)) {
                    664:                sprintf(work, "MYNAME=%s ", perMyName);
                    665:                strcat(buf, work);
                    666:        }
                    667:        if (perComm[0]) {
                    668:                sprintf(work, "COMMANDS=%s ", perComm);
                    669:                strcat(buf, work);
                    670:        }
                    671:        if (perRead[0]) {
                    672:                sprintf(work, "READ=%s ", perRead);
                    673:                strcat(buf, work);
                    674:        }
                    675:        if (perNoRead[0]) {
                    676:                sprintf(work, "NOREAD=%s ", perNoRead);
                    677:                strcat(buf, work);
                    678:        }
                    679:        if (perWrite[0]) {
                    680:                sprintf(work, "WRITE=%s ", perWrite);
                    681:                strcat(buf, work);
                    682:        }
                    683:        if (perNoWrite[0]) {
                    684:                sprintf(work, "NOWRITE=%s ", perNoWrite);
                    685:                strcat(buf, work);
                    686:        }
                    687:        sprintf(work, "SENDFILES=%s REQUEST=%s",
                    688:                ((perSendFiles[0] == 'y') ? "yes" : "no"),
                    689:                ((perRequest[0]   == 'y') ? "yes" : "no"));
                    690:        strcat(buf, work);
                    691: }
                    692: 
                    693: /*
                    694:  * Fix command char.
                    695:  */
                    696: static int
                    697: fixCode(c, l)
                    698: line *l;
                    699: {
                    700:        c = tolower(c);
                    701:        if (NULL == l) {        /* avoid modify etc with no data on file */
                    702:                switch (c) {
                    703:                case 'm':
                    704:                case 'n':
                    705:                case 'p':
                    706:                case 'd':
                    707:                        showError("No data yet on file");
                    708:                        return (0);
                    709:                }
                    710:        }
                    711:        return (c);
                    712: }
                    713: 
                    714: /*
                    715:  * Fill in a multi line file
                    716:  */
                    717: getMulti(f)
                    718: register fillin *f;
                    719: {
                    720:        register line *l;
                    721:        line *onDisp = NULL;
                    722: 
                    723:        l = f->root;
                    724:        clear();
                    725:        for (;;) {
                    726:                if ((NULL != l) && (onDisp != l)) {
                    727:                        onDisp = l;
                    728:                        clear();
                    729:                        if ('#' == l->str[0]) { /* show a comment */
                    730:                                comment = l->str + 1;
                    731:                                showDefs(comment_data, comment_locs);
                    732:                        }
                    733:                        else {  /* show a data page */
                    734:                                (*(f->zero))();
                    735:                                strcpy(buf, l->str);
                    736:                                (*(f->distrib))();
                    737:                                showDefs(f->s_data, f->s_loc);
                    738:                        }
                    739:                }
                    740:                showBak(f->ch_data);
                    741:                getField(f->ch_loc, code);
                    742:                switch (fixCode(code[0], l)) {
                    743:                case 'm':       /* modify */
                    744:                        f->mod = 1;
                    745:                        if ('#' == l->str[0]) {
                    746:                                getAll(comment_locs);
                    747:                                sprintf(buf, "#%s\n", comment);
                    748:                        }
                    749:                        else {
                    750:                                clearBak(f->ch_data, f->ch_loc);
                    751:                                getAll(f->s_loc);
                    752:                                (*(f->clump))();
                    753:                        }
                    754:                        l = addLine(f, l, 1);
                    755:                        break;
                    756:                case 'n':       /* next line */
                    757:                        if (NULL == l->next)
                    758:                                showError("No more entrys in file");
                    759:                        else
                    760:                                l = l->next;
                    761:                        break;
                    762:                case 'p': {     /* previous line */
                    763:                        line *p;
                    764: 
                    765:                        if (l == f->root) {
                    766:                                showError("No previous entrys on file");
                    767:                                break;
                    768:                        }
                    769:                        for (p = f->root; p != NULL; p = p->next)
                    770:                                if (p->next == l) {
                    771:                                        l = p;
                    772:                                        break;
                    773:                                }
                    774:                        break;
                    775:                        }
                    776:                case 'a':       /* add line */
                    777:                        f->mod = 1;
                    778:                        (*(f->zero))();
                    779:                        clear();
                    780:                        showBak(f->s_data);
                    781:                        getAll(f->s_loc);
                    782:                        (*(f->clump))();
                    783:                        l = addLine(f, l, 0);
                    784:                        break;
                    785:                case 'c':       /* add comment line */
                    786:                        f->mod = 1;
                    787:                        comment = NULL;
                    788:                        clear();
                    789:                        showBak(comment_data);
                    790:                        getAll(comment_locs);
                    791:                        sprintf(buf, "#%s\n", comment);
                    792:                        l = addLine(f, l, 0);
                    793:                        break;
                    794:                case 'h':       /* help message */
                    795:                        clear();
                    796:                        showBak(helpscn_data);
                    797:                        Query("Any key to continue");
                    798:                        onDisp = NULL;
                    799:                        break;
                    800:                case 'e':       /* extra help message for lsys */
                    801:                        if (&lsys == f) {
                    802:                                showBak(escapes_data);
                    803:                                Query("Any key to continue");
                    804:                                onDisp = NULL;
                    805:                        }
                    806:                        break;
                    807:                case 'd':       /* delete line */
                    808:                        f->mod = 1;
                    809:                        l = deleteEntry(f, l);
                    810:                        break;
                    811:                case 'x':
                    812:                        return;
                    813:                }
                    814:        }
                    815: }
                    816: 
                    817: /*
                    818:  * check for clean Ascii.
                    819:  */
                    820: cleanAlnum(s)
                    821: register char *s;
                    822: {
                    823:        register c;
                    824: 
                    825:        if (!*s) {
                    826:                showError("Field must have some data");
                    827:                return (0);
                    828:        }
                    829:        while (c = *s++)
                    830:                if (!isalnum(c)) {
                    831:                        showError("Field must be alphanumeric");
                    832:                        return (0);
                    833:                }
                    834:        return (1);
                    835: }
                    836: 
                    837: /*
                    838:  * check for clean Ascii.
                    839:  */
                    840: cleanAscii(s)
                    841: register char *s;
                    842: {
                    843:        register c;
                    844: 
                    845:        if (!*s) {
                    846:                showError("Field must have some data");
                    847:                return (0);
                    848:        }
                    849:        while (c = *s++)
                    850:                if ((c < ' ') || (c > '~')) {
                    851:                        showError("Field must be all printable");
                    852:                        return (0);
                    853:                }
                    854:        return (1);
                    855: }
                    856: 
                    857: /*
                    858:  * Fill in /etc/uucpname.
                    859:  */
                    860: void
                    861: uuName()
                    862: {
                    863:        clear();
                    864:        nameMod = 1;
                    865:        showDefs(uunam_data, uunam_locs);
                    866:        showBak(helpscn_data);
                    867:        getAll(uunam_locs);
                    868: }
                    869: 
                    870: /*
                    871:  * Base Lsys screen.
                    872:  */
                    873: uuinstall()
                    874: {
                    875:        clear();
                    876:        for (;;) {
                    877:                clear();
                    878:                showBak(uuin_data);
                    879:                getField(uuin_locs, code);
                    880:                switch (tolower(code[0])) {
                    881:                case 'h':
                    882:                        clear();
                    883:                        showBak(helpscn_data);
                    884:                        Query("Any key to continue");
                    885:                        break;
                    886:                case 's':
                    887:                        uuName();
                    888:                        break;
                    889:                case 'l':
                    890:                        getMulti(&lsys);
                    891:                        break;
                    892:                case 'd':
                    893:                        getMulti(&dev);
                    894:                        break;
                    895:                case 'p':
                    896:                        getMulti(&permis);
                    897:                        break;
                    898:                case 'x':
                    899:                        if (!(nameMod | lsys.mod | dev.mod | permis.mod))
                    900:                                return(1);
                    901:                        for (;;) {
                    902:                                switch (Query("Save changes <y/n> ")) {
                    903:                                case 'Y':
                    904:                                case 'y':
                    905:                                        saveAll(&dev);
                    906:                                        saveAll(&lsys);
                    907:                                        saveAll(&permis);
                    908:                                        if (nameMod) {
                    909:                                                saveLine(UUNAME, uuname);
                    910:                                                saveLine(DOMAIN, uudomain);
                    911:                                        }
                    912:                                        return(0);
                    913:                                case 'N':
                    914:                                case 'n':
                    915:                                        return(1);
                    916:                                }
                    917:                        }
                    918:                }
                    919:        }
                    920: }
                    921: 
                    922: /*
                    923:  * Create uucp files main line.
                    924:  */
                    925: main(argc, argv)
                    926: char **argv[];
                    927: {
                    928:        int rc;
                    929: 
                    930:        fileList = ((1 < argc) && !strcmp("-d", argv[1])) ?
                    931:                testFiles : realFiles;
                    932: 
                    933:        inhale(&lsys);  /* load files */
                    934:        inhale(&dev);
                    935:        inhale(&permis);
                    936:        shortFile(UUNAME, uuname);
                    937:        shortFile(DOMAIN, uudomain);
                    938: 
                    939:        setUpScreen(2, 22); /* set up screen 2 lines for error at line 22 */
                    940: 
                    941:        rc = uuinstall();
                    942: 
                    943:        closeUp();
                    944:        
                    945:        exit(rc);
                    946: }

unix.superglobalmegacorp.com

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