|
|
1.1 ! root 1: #include "parms.h" ! 2: #include "structs.h" ! 3: ! 4: #ifdef RCSIDENT ! 5: static char rcsid[] = "$Header: dropt.c,v 1.7.0.1 85/09/09 18:31:21 notes Rel $"; ! 6: #endif RCSIDENT ! 7: ! 8: #define BUFSZ 128 ! 9: ! 10: /* ! 11: * this file processes the director options. ! 12: * ! 13: * call: contains the io pointer to the file. ! 14: * ! 15: * allows continued access only if the user if a director. ! 16: * ! 17: * the functions of the director options includes: ! 18: * 1) granting/denial of director priviledges ! 19: * 2) granting/denial of regular access priviledges ! 20: * 3) changing the director message ! 21: * 4) writing a policy note ! 22: * ! 23: * Returns: -1 normally ! 24: * -4 if the user hit cntrl d ( to total exit) ! 25: * ! 26: * original author/outliner : Ray Essick may 29, 1981 ! 27: * ! 28: */ ! 29: ! 30: static int anonrow, /* allow anon */ ! 31: openrow, /* is open */ ! 32: archrow, /* is archive */ ! 33: keeprow, /* expire action */ ! 34: dirmsgrow, /* expire w/dirmsg */ ! 35: netrow, /* networked */ ! 36: expirerow, /* expire age */ ! 37: longrow, /* longest ok text */ ! 38: worksetrow; /* working set */ ! 39: static int lastrow; ! 40: ! 41: direct (io) struct io_f *io; ! 42: { ! 43: int i; /* scratch */ ! 44: int c; ! 45: long expires; ! 46: long workset; ! 47: long textlength; /* scratch */ ! 48: char title[DMLEN + 1]; /* hold new director message */ ! 49: char ntitle[NNLEN + 1]; /* hold note file title */ ! 50: struct note_f note; ! 51: struct auth_f auth; /* author of policy note */ ! 52: struct daddr_f where; ! 53: char *r, ! 54: buff[BUFSZ + 1]; ! 55: int buffptr; ! 56: int start, ! 57: end, ! 58: nnotes, ! 59: nresps; ! 60: int redraw; /* paint screen */ ! 61: ! 62: if (allow (io, DRCTOK) == 0) ! 63: { ! 64: at (0, PROMPTMSGX); ! 65: printf ("Sorry, you are not a director"); ! 66: fflush (stdout); ! 67: sleep (2); ! 68: return (-1); ! 69: } ! 70: ! 71: redraw = 1; ! 72: while (1) ! 73: { ! 74: if (redraw) ! 75: dirplot (io); ! 76: getkey: /* suck in a key */ ! 77: at (-1, 1); ! 78: printf ("Option: \010"); ! 79: c = gchar (); /* get command */ ! 80: printf ("\010 "); /* overwrite the character */ ! 81: redraw = 0; /* draw if want it */ ! 82: switch (c) ! 83: { ! 84: case '?': ! 85: case 'h': ! 86: help (DIRHLP); ! 87: redraw++; ! 88: break; ! 89: ! 90: case 'r': /* replot the screen */ ! 91: case '\f': /* control-L also */ ! 92: redraw++; ! 93: break; ! 94: ! 95: #ifdef K_KEY ! 96: case 'k': /* same as q */ ! 97: #endif K_KEY ! 98: case 'q': /* leave */ ! 99: return (-1); ! 100: ! 101: case '\004': ! 102: return QUITFAST; /* Universal exit */ ! 103: ! 104: case '!': /* give him a shell */ ! 105: gshell (); ! 106: redraw++; ! 107: break; ! 108: ! 109: case 'p': /* run access lists */ ! 110: if (accessedit (io) == QUITFAST) ! 111: return QUITFAST; /* doit */ ! 112: redraw++; ! 113: break; /* skipt out of the loop */ ! 114: ! 115: case 'a': /* toggle anonymous option */ ! 116: locknf (io, DSCRLOCK); /* lock the thing for a minute */ ! 117: getdscr (io, &io -> descr); /* get up to date descriptor */ ! 118: if (io -> descr.d_stat & ANONOK) ! 119: io -> descr.d_stat &= NOT ANONOK; ! 120: else ! 121: io -> descr.d_stat |= ANONOK; ! 122: putdscr (io, &io -> descr); ! 123: unlocknf (io, DSCRLOCK); ! 124: at (anonrow, 18); ! 125: printf (io -> descr.d_stat & ANONOK ? "ON " : "OFF"); ! 126: redraw = 0; ! 127: break; ! 128: ! 129: case 'A': /* Archive option */ ! 130: locknf (io, DSCRLOCK); /* lock the thing for a minute */ ! 131: getdscr (io, &io -> descr); /* get up to date descriptor */ ! 132: if (io -> descr.d_stat & ISARCH) ! 133: io -> descr.d_stat &= NOT ISARCH; ! 134: else ! 135: io -> descr.d_stat |= ISARCH; ! 136: putdscr (io, &io -> descr); ! 137: unlocknf (io, DSCRLOCK); ! 138: at (archrow, 18); ! 139: printf (io -> descr.d_stat & ISARCH ? "YES" : "NO "); ! 140: redraw = 0; ! 141: break; ! 142: ! 143: case 'l': /* message length */ ! 144: while (1) ! 145: { ! 146: at (lastrow, 10); ! 147: printf ("New Maximum Message Size: "); ! 148: ceol (); /* clear to eol */ ! 149: if (gline (buff, BUFSZ) == 1) /* empty line */ ! 150: { ! 151: at (lastrow + 1, 10); ! 152: printf ("Maximum Message Size Unchanged"); ! 153: goto getkey; ! 154: } ! 155: if (sscanf (buff, "%ld", &textlength) == 1) ! 156: { ! 157: if (textlength <= HARDMAX) /* too big? */ ! 158: break; ! 159: else ! 160: { ! 161: at (lastrow + 1, 10); ! 162: printf ("Maximum Allowed is %d", HARDMAX); ! 163: continue; ! 164: } ! 165: } ! 166: at (lastrow + 1, 10); ! 167: printf ("Enter an integer or <return>"); ! 168: } ! 169: locknf (io, DSCRLOCK); /* CRITICAL SECTION */ ! 170: getdscr (io, &io -> descr); /* update descriptor */ ! 171: io -> descr.d_longnote = textlength; /* new value */ ! 172: putdscr (io, &io -> descr); ! 173: unlocknf (io, DSCRLOCK); /* all done ... */ ! 174: at (longrow, 27); ! 175: printf ("%ld bytes ", io -> descr.d_longnote); ! 176: redraw = 0; ! 177: break; ! 178: ! 179: case 'c': /* compress the notefile */ ! 180: redraw = 0; ! 181: if (io -> descr.d_stat & OPEN) ! 182: { ! 183: at (lastrow, 10); ! 184: printf ("Notefile must be closed to compress"); ! 185: break; ! 186: } ! 187: else ! 188: { ! 189: at (lastrow, 10); ! 190: if (askyn ("Really Compress? (y/n) ") != 'y') ! 191: { ! 192: at (lastrow + 1, 10); ! 193: printf ("Compress not done"); ! 194: break; ! 195: } ! 196: at (lastrow + 1, 1); ! 197: printf ("Compressing "); ! 198: if (compress (io, LOCKIT, 1, &nnotes, &nresps) >= 0) ! 199: { ! 200: dirplot (io); /* show it */ ! 201: at (-3, 1); ! 202: printf ("Compress left %d notes and %d responses", ! 203: nnotes, nresps); ! 204: } ! 205: else ! 206: { ! 207: dirplot (io); /* show page */ ! 208: at (-3, 1); ! 209: printf ("Compress not done"); ! 210: } ! 211: break; ! 212: } ! 213: break; ! 214: ! 215: case 'e': /* change expiration time */ ! 216: while (1) ! 217: { ! 218: at (lastrow, 10); ! 219: printf ("New Expiration time: "); ! 220: ceol (); /* clear to eol */ ! 221: if (gline (buff, BUFSZ) == 1) /* empty line */ ! 222: { ! 223: at (lastrow + 1, 10); ! 224: printf ("Expiration Threshold Unchanged"); ! 225: goto getkey; ! 226: } ! 227: if (!strcmp (buff, "Never") || !strcmp (buff, "never") || ! 228: !strcmp (buff, "NEVER")) ! 229: { ! 230: expires = NEVER; ! 231: break; ! 232: } ! 233: if (!strcmp (buff, "Default") || !strcmp (buff, "default") || ! 234: !strcmp (buff, "DEFAULT")) ! 235: { ! 236: expires = 0; ! 237: break; ! 238: } ! 239: if (sscanf (buff, "%ld", &expires) == 1) ! 240: { ! 241: break; ! 242: } ! 243: ! 244: at (lastrow + 1, 10); ! 245: printf ("Want `default', `never', or a number"); ! 246: at (lastrow + 2, 10); ! 247: printf ("<return> to leave unchanged"); ! 248: } ! 249: ! 250: locknf (io, DSCRLOCK); /* critical section */ ! 251: getdscr (io, &io -> descr); ! 252: io -> descr.d_archtime = expires; /* update */ ! 253: putdscr (io, &io -> descr); /* replace */ ! 254: unlocknf (io, DSCRLOCK); /* leave critical */ ! 255: at (expirerow, 27); ! 256: switch ((int) (io -> descr.d_archtime)) /* update screen */ ! 257: { ! 258: case NEVER: ! 259: printf ("Never "); ! 260: break; ! 261: case 0: ! 262: printf ("Default "); ! 263: break; ! 264: default: ! 265: printf ("%ld days ", io -> descr.d_archtime); ! 266: break; ! 267: } ! 268: redraw = 0; ! 269: break; ! 270: ! 271: case 'W': /* working Set size */ ! 272: while (1) ! 273: { ! 274: at (lastrow, 10); ! 275: printf ("New Working Set Size: "); ! 276: ceol (); /* clear to eol */ ! 277: if (gline (buff, BUFSZ) == 1) /* empty line */ ! 278: { ! 279: at (lastrow + 1, 10); ! 280: printf ("Working Set Size Unchanged"); ! 281: goto getkey; ! 282: } ! 283: if (!strcmp (buff, "Default") || !strcmp (buff, "default") || ! 284: !strcmp (buff, "DEFAULT")) ! 285: { ! 286: workset = 0; ! 287: break; ! 288: } ! 289: if (sscanf (buff, "%ld", &workset) == 1) ! 290: { ! 291: break; ! 292: } ! 293: ! 294: at (lastrow + 1, 10); ! 295: printf ("Want `default' or a number"); ! 296: at (lastrow + 2, 10); ! 297: printf ("<return> to leave unchanged"); ! 298: } ! 299: ! 300: locknf (io, DSCRLOCK); /* critical section */ ! 301: getdscr (io, &io -> descr); ! 302: io -> descr.d_workset = workset; /* update */ ! 303: putdscr (io, &io -> descr); /* replace */ ! 304: unlocknf (io, DSCRLOCK); /* leave critical */ ! 305: at (worksetrow, 27); ! 306: switch ((int) io -> descr.d_workset) ! 307: { ! 308: case 0: ! 309: printf ("Default "); ! 310: break; ! 311: default: ! 312: printf ("%ld Notes ", io -> descr.d_workset); ! 313: } ! 314: redraw = 0; ! 315: break; ! 316: ! 317: case 'E': /* keep/delete/default */ ! 318: locknf (io, DSCRLOCK); /* critical section */ ! 319: getdscr (io, &io -> descr); ! 320: switch ((int) io -> descr.d_archkeep) /* change it */ ! 321: { ! 322: case KEEPNO: ! 323: io -> descr.d_archkeep = KEEPYES; ! 324: break; ! 325: case KEEPYES: ! 326: io -> descr.d_archkeep = KEEPDFLT; ! 327: break; ! 328: case KEEPDFLT: ! 329: default: ! 330: io -> descr.d_archkeep = KEEPNO; ! 331: break; ! 332: } ! 333: putdscr (io, &io -> descr); /* replace */ ! 334: unlocknf (io, DSCRLOCK); /* leave critical */ ! 335: at (keeprow, 27); ! 336: switch ((int) io -> descr.d_archkeep) /* update display */ ! 337: { ! 338: case KEEPYES: ! 339: printf ("ARCHIVE"); ! 340: break; ! 341: case KEEPNO: ! 342: printf ("DELETE "); ! 343: break; ! 344: case KEEPDFLT: ! 345: printf ("Default"); ! 346: break; ! 347: default: ! 348: printf ("UNKNOWN"); ! 349: break; ! 350: } ! 351: redraw = 0; ! 352: break; ! 353: ! 354: case 'D': /* Archive dirmsg */ ! 355: locknf (io, DSCRLOCK); /* critical section */ ! 356: getdscr (io, &io -> descr); ! 357: switch ((int) io -> descr.d_dmesgstat) /* change it */ ! 358: { ! 359: case DIRNOCARE: ! 360: io -> descr.d_dmesgstat = DIRON; ! 361: break; ! 362: case DIRON: ! 363: io -> descr.d_dmesgstat = DIROFF; ! 364: break; ! 365: case DIROFF: ! 366: io -> descr.d_dmesgstat = DIRDFLT; ! 367: break; ! 368: case DIRDFLT: ! 369: default: ! 370: io -> descr.d_dmesgstat = DIRNOCARE; ! 371: break; ! 372: } ! 373: putdscr (io, &io -> descr); /* replace */ ! 374: unlocknf (io, DSCRLOCK); /* leave critical */ ! 375: at (dirmsgrow, 27); ! 376: switch ((int) io -> descr.d_dmesgstat) ! 377: { ! 378: case DIRNOCARE: ! 379: printf ("NOCARE "); ! 380: break; ! 381: case DIRON: ! 382: printf ("ON "); ! 383: break; ! 384: case DIROFF: ! 385: printf ("OFF "); ! 386: break; ! 387: case DIRDFLT: ! 388: printf ("Default "); ! 389: break; ! 390: default: ! 391: printf ("UNKNOWN "); ! 392: break; ! 393: } ! 394: redraw = 0; ! 395: break; ! 396: ! 397: case 'o': /* toggle open status */ ! 398: locknf (io, DSCRLOCK); ! 399: getdscr (io, &io -> descr); ! 400: if (io -> descr.d_stat & OPEN) ! 401: io -> descr.d_stat &= NOT OPEN; ! 402: else ! 403: io -> descr.d_stat |= OPEN; ! 404: putdscr (io, &io -> descr); ! 405: unlocknf (io, DSCRLOCK); ! 406: at (openrow, 18); ! 407: printf (io -> descr.d_stat & OPEN ? "OPEN " : "CLOSED"); ! 408: redraw = 0; ! 409: break; ! 410: ! 411: case 'n': /* toggle network status */ ! 412: locknf (io, DSCRLOCK); ! 413: getdscr (io, &io -> descr); ! 414: if (io -> descr.d_stat & NETWRKD) ! 415: { ! 416: io -> descr.d_stat &= NOT NETWRKD; ! 417: } ! 418: else ! 419: { ! 420: io -> descr.d_stat |= NETWRKD; ! 421: } ! 422: putdscr (io, &io -> descr); ! 423: unlocknf (io, DSCRLOCK); ! 424: at (netrow, 18); ! 425: printf (io -> descr.d_stat & NETWRKD ? "YES" : "NO "); ! 426: redraw = 0; ! 427: break; ! 428: ! 429: ! 430: case 'm': /* collect a new director message */ ! 431: redraw++; ! 432: at (lastrow, 10); ! 433: printf ("Enter new director message"); ! 434: at (lastrow + 2, 10); ! 435: for (i = 0; i < DMLEN; i++) ! 436: printf ("-"); ! 437: at (lastrow + 1, 10); ! 438: i = gline (title, DMLEN - 1); /* grab message */ ! 439: if (i <= 1) ! 440: break; /* no new message */ ! 441: locknf (io, DSCRLOCK); /* mutual exclusion */ ! 442: getdscr (io, &io -> descr); /* get up-to-date */ ! 443: strncpy (io -> descr.d_drmes, title, DMLEN);/* replace */ ! 444: putdscr (io, &io -> descr); ! 445: unlocknf (io, DSCRLOCK); /* uncritical now */ ! 446: break; ! 447: ! 448: case 't': /* write title for note file */ ! 449: redraw++; ! 450: at (lastrow, 10); ! 451: printf ("Enter new title for notefile"); ! 452: at (lastrow + 2, 10); ! 453: for (i = 0; i < NNLEN; i++) ! 454: printf ("-"); ! 455: at (lastrow + 1, 10); ! 456: i = gline (ntitle, NNLEN - 1); /* suck the title */ ! 457: if (i <= 1) ! 458: break; /* no new message */ ! 459: locknf (io, DSCRLOCK); /* MUTEX */ ! 460: getdscr (io, &io -> descr); /* current descr */ ! 461: strncpy (io -> descr.d_title, ntitle, NNLEN);/* update */ ! 462: putdscr (io, &io -> descr); /* and replace */ ! 463: unlocknf (io, DSCRLOCK); /* uncritical now */ ! 464: break; ! 465: ! 466: case 'w': /* let him write a new policy note */ ! 467: if (io -> descr.d_plcy) ! 468: { ! 469: at (0, PROMPTMSGX); ! 470: if (askyn ("Rewrite policy? (y/n) :") == 'n') ! 471: { ! 472: redraw++; ! 473: break; ! 474: } ! 475: } ! 476: at (0, PROMPTMSGX); ! 477: printf ("\nEdit New Policy Text:\n"); ! 478: if (gettext (io, &where, (FILE *) NULL, EDIT) == 0) ! 479: { ! 480: redraw++; ! 481: break; ! 482: } ! 483: r = title; ! 484: strcpy (title, "POLICY NOTE"); ! 485: gettime (¬e.n_date); /* date of writing */ ! 486: getname (&auth, 0); /* get author */ ! 487: putnote (io, &where, title, 0, ¬e, &auth, 1, 1, 1, System, 1); ! 488: dspnote (io, ¬e, 0); /* show it to him */ ! 489: redraw++; ! 490: break; ! 491: ! 492: case 'z': /* zap a lot of notes/responses */ ! 493: case 'u': /* undelete a bunch */ ! 494: { ! 495: char *action; /* del/undel */ ! 496: ! 497: redraw++; /* want to repaint */ ! 498: action = c == 'z' ? "delete" : "un-delete";/* for prompts */ ! 499: at (lastrow, 1); ! 500: printf ("Enter list of notes to %s: ", action); ! 501: gline (buff, BUFSZ); /* grab line */ ! 502: at (lastrow + 1, 1); ! 503: printf ("Going to %s: %s", action, buff); ! 504: at (lastrow + 2, 1); ! 505: if (askyn ("Do you really want to do that? ") != 'y') ! 506: break; /* chicken out */ ! 507: buffptr = 0; ! 508: at (lastrow + 3, 1); ! 509: while (listget (buff, &buffptr, &start, &end)) ! 510: { ! 511: if (start > end) ! 512: { ! 513: printf ("IGNORING %d-%d", start, end); ! 514: continue; ! 515: } ! 516: if (start == end) ! 517: printf ("%d ", start); ! 518: else ! 519: printf ("%d-%d ", start, end); ! 520: mdelete (io, start, end, c == 'z');/* zap those */ ! 521: } ! 522: goto getkey; /* leave this stuff on screen */ ! 523: } ! 524: ! 525: default: ! 526: printf ("\07"); ! 527: redraw = 0; ! 528: goto getkey; /* hit a bad key */ ! 529: ! 530: } ! 531: } ! 532: } ! 533: /* ! 534: * dirplot - Plot the notesfile status ! 535: */ ! 536: ! 537: dirplot (io) ! 538: struct io_f *io; ! 539: { ! 540: int atrow; ! 541: int atcol; ! 542: ! 543: erase (); ! 544: center (io -> descr.d_title, NNLEN, 1, 40 - NNLEN / 2); ! 545: center (io -> descr.d_drmes, DMLEN, 2, 40 - DMLEN / 2); ! 546: atrow = 4; /* start filling in */ ! 547: atcol = 1; ! 548: at (anonrow = atrow++, atcol); ! 549: printf ("(a) Anonymous: "); /* at (3,18); */ ! 550: printf (io -> descr.d_stat & ANONOK ? "ON" : "OFF"); ! 551: at (openrow = atrow++, atcol); ! 552: printf ("(o) Notesfile: "); /* at(4,18); */ ! 553: printf (io -> descr.d_stat & OPEN ? "OPEN " : "CLOSED"); ! 554: at (netrow = atrow++, atcol); ! 555: printf ("(n) Networked: "); /* at(5,18); */ ! 556: printf (io -> descr.d_stat & NETWRKD ? "YES" : "NO "); ! 557: at (archrow = atrow++, atcol); ! 558: printf ("(A) Is Archive: "); /* at(6,18); */ ! 559: printf (io -> descr.d_stat & ISARCH ? "YES" : "NO"); ! 560: at (expirerow = atrow++, atcol); ! 561: printf ("(e) Expiration Threshold: "); /* at (6,27); */ ! 562: switch ((int) (io -> descr.d_archtime)) ! 563: { ! 564: case NEVER: ! 565: printf ("Never"); ! 566: break; ! 567: case 0: ! 568: printf ("Default"); ! 569: break; ! 570: default: ! 571: printf ("%ld days", io -> descr.d_archtime); ! 572: break; ! 573: } ! 574: at (keeprow = atrow++, atcol); ! 575: printf ("(E) Expiration Action: "); /* at(?,27); */ ! 576: switch ((int) io -> descr.d_archkeep) ! 577: { ! 578: case KEEPYES: ! 579: printf ("ARCHIVE"); ! 580: break; ! 581: case KEEPNO: ! 582: printf ("DELETE "); ! 583: break; ! 584: case KEEPDFLT: ! 585: printf ("Default"); ! 586: break; ! 587: default: ! 588: printf ("UNKNOWN"); ! 589: break; ! 590: } ! 591: at (dirmsgrow = atrow++, atcol); ! 592: printf ("(D) Expire with Dirmsg: "); /* at (?,27) */ ! 593: switch ((int) io -> descr.d_dmesgstat) ! 594: { ! 595: case DIRNOCARE: ! 596: printf ("NOCARE "); ! 597: break; ! 598: case DIRON: ! 599: printf ("ON "); ! 600: break; ! 601: case DIROFF: ! 602: printf ("OFF "); ! 603: break; ! 604: case DIRDFLT: ! 605: printf ("Default "); ! 606: break; ! 607: default: ! 608: printf ("UNKNOWN "); ! 609: break; ! 610: } ! 611: at (worksetrow = atrow++, atcol); ! 612: printf ("(W) Working Set Size: "); /* at (5,27) */ ! 613: switch ((int) io -> descr.d_workset) ! 614: { ! 615: case 0: ! 616: printf ("Default"); ! 617: break; ! 618: default: ! 619: printf ("%ld Notes", io -> descr.d_workset); ! 620: } ! 621: at (longrow = atrow++, atcol); ! 622: printf ("(l) Maximum text/article: "); /* at (6,27) */ ! 623: printf ("%ld bytes", io -> descr.d_longnote); ! 624: ! 625: lastrow = atrow; /* for queries */ ! 626: ! 627: /* ! 628: * Second Column ! 629: */ ! 630: ! 631: atrow = 4; ! 632: atcol = 40; ! 633: at (atrow++, atcol); ! 634: printf ("Policy Note Exists: %s", io -> descr.d_plcy ? "YES" : "NO"); ! 635: at (atrow++, atcol); ! 636: printf ("Next note in slot: %d", io -> descr.d_nnote + 1); ! 637: at (atrow++, atcol); ! 638: printf ("Deleted Notes (holes): %ld ", io -> descr.d_delnote); ! 639: at (atrow++, atcol); ! 640: printf ("Deleted Responses (holes): %ld ", io -> descr.d_delresp); ! 641: /* ! 642: * Should we show more statistics here? ! 643: * Things like orphans, adoptions, etc. ! 644: */ ! 645: ! 646: if (atrow > lastrow) ! 647: lastrow = atrow; ! 648: lastrow++; ! 649: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.