|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.