|
|
1.1 ! root 1: #include "parms.h" ! 2: #include "structs.h" ! 3: #include <sys/types.h> ! 4: #include <sys/stat.h> ! 5: ! 6: #ifdef RCSIDENT ! 7: static char rcsid[] = "$Header: readem.c,v 1.7.0.3 85/10/06 01:42:00 notes Rel $"; ! 8: #endif RCSIDENT ! 9: ! 10: ! 11: /* ! 12: * this particular collection of junk handles the basic idea ! 13: * of what to do when you are showing a note. ! 14: * It displays the note, and then manages to collect enough info ! 15: * from the terminal to either progress to the next note or ! 16: * show some of the responses. ! 17: * ! 18: * original author : rob kolstad ! 19: * modified : ray essick may 22, 1981 ! 20: * modified (again): Ray Essick December 1981 ! 21: * modified (more): Ray Essick, February 1982 ! 22: * ! 23: */ ! 24: readem (io, readnum, firstdis, resp) ! 25: struct io_f *io; ! 26: int *firstdis; ! 27: { ! 28: struct note_f note; ! 29: struct resp_f rsprec; ! 30: struct io_f io2; ! 31: FILE * txtfile; ! 32: int rrecnum, ! 33: roffset; ! 34: char tonf[WDLEN + 1]; /* for forwarding */ ! 35: char ntitle[TITLEN + 20]; /* scratch space */ ! 36: char nfsave[WDLEN + 1]; /* path name for 's' and 'S' */ ! 37: int c; /* input char */ ! 38: char *p, ! 39: *q; /* scratch pointers */ ! 40: int replot; /* whether to change what's on the screen */ ! 41: int toresp; /* init entry as resp */ ! 42: int forward; /* scroll forward/backward on deleted note */ ! 43: int toauth, /* send to author */ ! 44: znum, /* forward as resp to this note */ ! 45: znote, ! 46: zresp, /* scratch for asearch */ ! 47: i, ! 48: j, ! 49: wtext; /* send mail with text */ ! 50: char cmdline[CMDLEN]; /* leggo brand build-a-command */ ! 51: int retcode; ! 52: ! 53: ! 54: replot = 1; /* first pass always writes to the screen */ ! 55: retcode = -1; /* init so grabs character */ ! 56: forward = 1; /* default to scroll forward */ ! 57: toresp = (resp != 0); /* for entry */ ! 58: while (1) ! 59: { ! 60: x (readnum < 0, "readem: given bad readnum"); ! 61: if (readnum > io -> descr.d_nnote) ! 62: readnum = io -> descr.d_nnote; ! 63: if (readnum == 0 && io -> descr.d_plcy == 0) /* empty notesfile */ ! 64: return 0; /* so back to the index */ ! 65: getnrec (io, readnum, ¬e); ! 66: if (note.n_stat & DELETED) ! 67: if (forward) ! 68: goto nextnt; /* forward scroll */ ! 69: else ! 70: goto prevnote; /* backward scroll */ ! 71: if (toresp) ! 72: { ! 73: toresp = 0; ! 74: goto showit; ! 75: } ! 76: if (replot) ! 77: retcode = dspnote (io, ¬e, readnum); /* show the note if we need new one */ ! 78: replot = 1; /* reset later if don't want replot */ ! 79: forward = 1; ! 80: if (retcode < 0) ! 81: { ! 82: input: at (0, 1); ! 83: #ifdef PROMPT ! 84: printf (PROMPT); /* let him know we're ready */ ! 85: #endif PROMPT ! 86: c = gchar (); ! 87: printf ("\10 \10"); /* Kurt wants this to go away */ ! 88: } ! 89: else ! 90: { ! 91: c = retcode; ! 92: retcode = (-1); /* make sure don't loop! */ ! 93: } ! 94: switch (c) ! 95: { ! 96: case '?': /* if he doesn't know what to type */ ! 97: case 'h': ! 98: help (RDMHLP); /* print the pseudo-man page */ ! 99: goto showit; ! 100: ! 101: case 'D': /* delete this note/response */ ! 102: if (resp) /* check to see if his note */ ! 103: { ! 104: if ((rsprec.r_auth[roffset].aid & UIDMASK) != globuid) ! 105: { ! 106: at (0, PROMPTMSGX); ! 107: printf ("Not your response"); ! 108: replot = 0; ! 109: continue; ! 110: } ! 111: } ! 112: else ! 113: { ! 114: if ((note.n_auth.aid & UIDMASK) != globuid) ! 115: { ! 116: at (0, PROMPTMSGX); ! 117: printf ("Not your note"); ! 118: replot = 0; ! 119: continue; ! 120: } ! 121: if (readnum == 0) ! 122: { ! 123: at (0, PROMPTMSGX); ! 124: printf ("Use 'Z' to delete policy"); ! 125: replot = 0; ! 126: continue; ! 127: } ! 128: } ! 129: ! 130: at (0, 1); ! 131: if (askyn ("Delete? (y/n): \b\b") == 'n') ! 132: goto showit; ! 133: printf ("\r \r"); ! 134: ! 135: locknf (io, DSCRLOCK); /* CRITICAL section */ ! 136: getnrec (io, readnum, ¬e); /* this should catch most */ ! 137: getdscr (io, &io -> descr); /* and an up to date descriptor */ ! 138: if (resp) /* go about deleting it */ ! 139: { ! 140: if (resp == note.n_nresp && inorder (&io -> descr.d_lstxmit, &rsprec.r_when[roffset])) ! 141: { ! 142: delresp (io, readnum, rrecnum, roffset, 0); ! 143: note.n_nresp--; /* adjust note response count */ ! 144: unlocknf (io, DSCRLOCK); /* must free up the lock */ ! 145: break; /* show next response */ ! 146: } ! 147: else ! 148: { ! 149: at (0, PROMPTMSGX); ! 150: printf ("Can't delete: networked, or not last response"); ! 151: replot = 0; ! 152: unlocknf (io, DSCRLOCK); /* release lock here too */ ! 153: continue; ! 154: } ! 155: } ! 156: else /* its a note */ ! 157: { ! 158: if (note.n_nresp || inorder (¬e.n_date, &io -> descr.d_lstxmit)) ! 159: { ! 160: at (0, PROMPTMSGX); ! 161: printf ("Can't delete; note has responses or is networked"); ! 162: replot = 0; ! 163: unlocknf (io, DSCRLOCK); /* release the lock */ ! 164: continue; ! 165: } ! 166: delnote (io, readnum++, 0); ! 167: resp = 0; ! 168: unlocknf (io, DSCRLOCK); /* release the lock */ ! 169: continue; ! 170: } ! 171: ! 172: case 'E': /* edit an article */ ! 173: if (resp) /* check to see if his note */ ! 174: { ! 175: if ((rsprec.r_auth[roffset].aid & UIDMASK) != globuid) ! 176: { ! 177: at (0, PROMPTMSGX); ! 178: printf ("Not your response"); ! 179: replot = 0; ! 180: continue; ! 181: } ! 182: } ! 183: else ! 184: { ! 185: if ((note.n_auth.aid & UIDMASK) != globuid) ! 186: { ! 187: at (0, PROMPTMSGX); ! 188: printf ("Not your note"); ! 189: replot = 0; ! 190: continue; ! 191: } ! 192: if (readnum == 0) ! 193: { ! 194: at (0, PROMPTMSGX); ! 195: printf ("Sorry, E doesn't work for policy notes yet"); ! 196: replot = 0; ! 197: continue; ! 198: } ! 199: } ! 200: ! 201: locknf (io, DSCRLOCK); /* CRITICAL section */ ! 202: getnrec (io, readnum, ¬e); /* this should catch most */ ! 203: getdscr (io, &io -> descr); /* and an up to date descriptor */ ! 204: if (resp) /* go about deleting it */ ! 205: { ! 206: if (resp == note.n_nresp && inorder (&io -> descr.d_lstxmit, &rsprec.r_when[roffset])) ! 207: { ! 208: delresp (io, readnum, rrecnum, roffset, 0); ! 209: note.n_nresp--; /* adjust note response count */ ! 210: unlocknf (io, DSCRLOCK); /* must free up the lock */ ! 211: sprintf (nfsave, "/tmp/nfe%d", getpid ()); ! 212: /* build scr file */ ! 213: x ((txtfile = fopen (nfsave, "w")) == NULL, "readem: scrfile"); ! 214: x (chmod (nfsave, 0666) < 0, "readem: chmod"); ! 215: pageout (io, &rsprec.r_addr[roffset], txtfile); ! 216: /* dump it */ ! 217: fclose (txtfile); /* also flushes it */ ! 218: x ((txtfile = fopen (nfsave, "r")) == NULL, "readem: edit reopen"); ! 219: resp = addresp (io, txtfile, readnum, EDIT); ! 220: getnrec (io, readnum, ¬e); /* up to date */ ! 221: /* add it back in ! */ ! 222: x (unlink (nfsave) < 0, "readem: edit unlink"); ! 223: break; /* show next response */ ! 224: } ! 225: else ! 226: { ! 227: at (0, PROMPTMSGX); ! 228: printf ("Can't edit: networked, or not last response"); ! 229: replot = 0; ! 230: unlocknf (io, DSCRLOCK); /* release lock here too */ ! 231: continue; ! 232: } ! 233: } ! 234: else /* its a note */ ! 235: { ! 236: if (note.n_nresp || inorder (¬e.n_date, &io -> descr.d_lstxmit)) ! 237: { ! 238: at (0, PROMPTMSGX); ! 239: printf ("Can't edit; note has responses or is networked"); ! 240: replot = 0; ! 241: unlocknf (io, DSCRLOCK); /* release the lock */ ! 242: continue; ! 243: } ! 244: delnote (io, readnum++, 0); ! 245: resp = 0; ! 246: unlocknf (io, DSCRLOCK); /* release the lock */ ! 247: sprintf (nfsave, "/tmp/nfe%d", getpid ()); ! 248: /* build scr file */ ! 249: x ((txtfile = fopen (nfsave, "w")) == NULL, "readem: scrfile"); ! 250: x (chmod (nfsave, 0666) < 0, "readem: chmod"); ! 251: pageout (io, ¬e.n_addr, txtfile); ! 252: /* dump it */ ! 253: fclose (txtfile); /* also flushes it */ ! 254: x ((txtfile = fopen (nfsave, "r")) == NULL, "readem: edit reopen"); ! 255: znum = addnote (io, txtfile, "Edit note text:", ! 256: "Note title: ", ¬e.ntitle, EDIT); ! 257: x (unlink (nfsave) < 0, "readem: edit unlink"); ! 258: if (znum > 0) ! 259: readnum = znum; /* this is the one */ ! 260: continue; ! 261: } ! 262: ! 263: case 'Z': /* zap notes/responses - directors only */ ! 264: /* kills any note/response */ ! 265: getdscr (io, &io -> descr); /* up to date descriptor */ ! 266: if (allow (io, DRCTOK) == 0) ! 267: { ! 268: at (0, PROMPTMSGX); ! 269: printf ("Not a director"); ! 270: replot = 0; ! 271: continue; ! 272: } ! 273: ! 274: at (0, 1); ! 275: if (askyn ("Delete? (y/n): \b\b") == 'n') ! 276: goto showit; /* replotter */ ! 277: printf ("\r \r"); ! 278: /* ! 279: * should log the deletion here, so the "meta-director" can ! 280: * watch for fascist directors preying on the peasants. ! 281: */ ! 282: if (readnum == 0) /* deleting policy */ ! 283: { ! 284: locknf (io, DSCRLOCK); /* lock us up */ ! 285: getdscr (io, &io -> descr); /* grab up-to-date */ ! 286: io -> descr.d_plcy = 0; /* its gone now */ ! 287: putdscr (io, &io -> descr); /* replace descriptor */ ! 288: unlocknf (io, DSCRLOCK); ! 289: return 0; /* back to the index */ ! 290: } ! 291: if (resp) /* delete a response */ ! 292: { ! 293: delresp (io, readnum, rrecnum, roffset, 1); ! 294: /* kill it */ ! 295: note.n_nresp--; /* and response count */ ! 296: break; /* display next response */ ! 297: } ! 298: else ! 299: delnote (io, readnum++, 1); ! 300: continue; ! 301: ! 302: case 'r': /* replot the current note/response */ ! 303: case '\f': /* everyone else uses ^L, might as well */ ! 304: showit: /* come here to refill screen */ ! 305: if (replot == 0) ! 306: continue; /* screen appears fine */ ! 307: if (resp) ! 308: break; /* show him the response */ ! 309: else ! 310: { ! 311: replot = 1; /* make sure it gets done */ ! 312: continue; ! 313: } ! 314: ! 315: nextnt: ! 316: case '\r': /* wants the next note */ ! 317: case '\n': ! 318: if (readnum == 0) ! 319: return 0; /* policy leaves */ ! 320: if (++readnum > io -> descr.d_nnote) ! 321: { ! 322: *firstdis = io -> descr.d_nnote; ! 323: return 0; ! 324: } ! 325: resp = 0; /* reset response index */ ! 326: continue; ! 327: ! 328: case 'm': /* mail a note/response via Unix mail */ ! 329: toauth = 0; ! 330: wtext = 0; /* to others and no text */ ! 331: goto sendmail; ! 332: case 'M': /* same as 'm' but with text */ ! 333: toauth = 0; ! 334: wtext = 1; /* to others with text */ ! 335: goto sendmail; ! 336: case 'P': ! 337: toauth = 1; ! 338: wtext = 1; /* to author with text */ ! 339: goto sendmail; ! 340: case 'p': ! 341: toauth = 1; ! 342: wtext = 0; /* to author, no text */ ! 343: goto sendmail; ! 344: ! 345: sendmail: /* jump to here once set mail parms */ ! 346: if (resp) ! 347: { ! 348: strcpy (ntitle, "Re: "); /* prefix */ ! 349: strcat (ntitle, note.ntitle); /* append title */ ! 350: mailit (io, &rsprec.r_addr[roffset], &rsprec.r_auth[roffset], ! 351: &rsprec.r_when[roffset], ntitle, toauth, wtext); ! 352: break; ! 353: } ! 354: else ! 355: { ! 356: strncpy (ntitle, note.ntitle, TITLEN); ! 357: mailit (io, ¬e.n_addr, ¬e.n_auth, ! 358: ¬e.n_date, ntitle, toauth, wtext); ! 359: } ! 360: goto showit; /* replot current page */ ! 361: ! 362: case '!': /* wants to fork a shell */ ! 363: gshell (); ! 364: goto showit; ! 365: ! 366: case 'q': /* quit this, maybe whole system */ ! 367: #ifdef K_KEY ! 368: case 'k': ! 369: #endif K_KEY ! 370: return QUITSEQ; ! 371: ! 372: case '\04': ! 373: return QUITFAST; /* leave totally */ ! 374: ! 375: case 'z': /* total exit w/update */ ! 376: return QUITUPD; ! 377: ! 378: case 'Q': /* exit system without updating sequencer */ ! 379: #ifdef K_KEY ! 380: case 'K': ! 381: #endif K_KEY ! 382: return QUITNOSEQ; ! 383: ! 384: case 'i': /* go back to note index */ ! 385: *firstdis = readnum; ! 386: return 0; ! 387: ! 388: case '\b': ! 389: case '-': /* display previous response */ ! 390: if (resp <= 0) ! 391: goto prevnote; /* '-' at base note */ ! 392: if (--resp) ! 393: break; /* show the previous response */ ! 394: continue; /* show him the base note */ ! 395: ! 396: prevnote: /* display previous note */ ! 397: if (readnum == 0) ! 398: return 0; /* policy leaves */ ! 399: forward = 0; /* set to scroll backwards on deleted note */ ! 400: if (--readnum < 1) ! 401: { ! 402: readnum = 1; /* zero is policy, so stop at 1 */ ! 403: forward = 1; /* bounce off bottom end */ ! 404: continue; /* go hunt for the right note */ ! 405: } ! 406: resp = 0; ! 407: continue; ! 408: ! 409: case 'x': ! 410: case 'X': ! 411: if (readnum == 0) ! 412: return 0; /* policy leaves */ ! 413: retcode = tsearch (io, readnum - 1, c == 'x'); ! 414: /* look it up */ ! 415: if (retcode <= 0) ! 416: replot = 0; ! 417: else ! 418: { ! 419: readnum = retcode; ! 420: resp = 0; ! 421: } ! 422: goto showit; ! 423: ! 424: case 'a': ! 425: case 'A': /* author search from current spot */ ! 426: if (readnum == 0) ! 427: return 0; /* not from policy ! */ ! 428: znote = readnum; ! 429: zresp = resp; ! 430: if (zresp == 0) ! 431: znote--; ! 432: else ! 433: zresp++; /* select 'next' */ ! 434: retcode = asearch (io, &znote, &zresp, (c == 'a')); ! 435: /* look */ ! 436: if (retcode < 0) ! 437: { ! 438: replot = 0; ! 439: goto showit; /* didn't want anything */ ! 440: } ! 441: if (retcode == 0) ! 442: { ! 443: replot = 0; ! 444: } ! 445: else ! 446: { ! 447: readnum = znote; ! 448: resp = zresp; /* set returned values */ ! 449: getnrec (io, readnum, ¬e); /* grab right descriptor */ ! 450: } ! 451: goto showit; /* and display them */ ! 452: ! 453: case 'd': /* toggle a notes director status */ ! 454: if (allow (io, DRCTOK) == 0) ! 455: { /* tell him what's up */ ! 456: at (0, PROMPTMSGX); ! 457: printf (" Anonymous: %s Networked: %s", ! 458: (io -> descr.d_stat & ANONOK) ? "YES" : "NO", ! 459: (io -> descr.d_stat & NETWRKD) ? "YES" : "NO"); ! 460: replot = 0; /* leave on screen */ ! 461: goto showit; ! 462: } ! 463: if (resp == 0) /* toggle a note */ ! 464: { ! 465: locknf (io, DSCRLOCK); ! 466: getnrec (io, readnum, ¬e); ! 467: if (note.n_stat & DIRMES) ! 468: note.n_stat &= NOT DIRMES; ! 469: else ! 470: note.n_stat |= DIRMES; ! 471: putnrec (io, readnum, ¬e); /* replace */ ! 472: unlocknf (io, DSCRLOCK); ! 473: goto showit; ! 474: } ! 475: else /* toggle a response */ ! 476: { ! 477: locknf (io, DSCRLOCK); /* this locks the resp index too */ ! 478: getrrec (io, rrecnum, &rsprec); /* grab that block */ ! 479: if (rsprec.r_stat[roffset] & DIRMES) ! 480: rsprec.r_stat[roffset] &= NOT DIRMES; ! 481: else ! 482: rsprec.r_stat[roffset] |= DIRMES; ! 483: putrrec (io, rrecnum, &rsprec); /* replace */ ! 484: unlocknf (io, DSCRLOCK); ! 485: goto showit; /* and redisplay */ ! 486: } ! 487: ! 488: case 'e': /* allow him to edit his title */ ! 489: if (readnum == 0) ! 490: continue; /* don't touch */ ! 491: if (resp) ! 492: goto badkey; /* bell and reinput */ ! 493: else ! 494: { ! 495: if (allow (io, DRCTOK) == 0 && ! 496: (globuid != (note.n_auth.aid & UIDMASK) || ! 497: /* check uid */ ! 498: strcmp (System, note.n_id.sys) != 0)) ! 499: /* other sys */ ! 500: { ! 501: at (0, PROMPTMSGX); ! 502: printf ("Not your note"); ! 503: replot = 0; ! 504: continue; ! 505: } ! 506: at (0, 1); ! 507: printf ("New Title: "); ! 508: if ((i = gline (ntitle, TITLEN - 1)) == 1) ! 509: /* glom onto a title */ ! 510: continue; /* empty title, leave alone */ ! 511: strclean (ntitle); /* zip controls */ ! 512: locknf (io, DSCRLOCK); ! 513: getnrec (io, readnum, ¬e); /* well, update it */ ! 514: strncpy (note.ntitle, ntitle, TITLEN); ! 515: note.ntitle[TITLEN - 1] = '\0'; /* null for sure */ ! 516: putnrec (io, readnum, ¬e); /* and replace */ ! 517: unlocknf (io, DSCRLOCK); ! 518: goto showit; /* replot the message */ ! 519: } ! 520: ! 521: case 't': /* talk to the author of a note */ ! 522: if (resp) ! 523: talkto (&rsprec.r_auth[roffset]); ! 524: else ! 525: talkto (¬e.n_auth); ! 526: goto showit; /* and replot the current message */ ! 527: ! 528: case 'W': /* write a response with the text */ ! 529: case 'w': /* let him write a response */ ! 530: getdscr (io, &io -> descr); /* get up to date */ ! 531: if (allow (io, RESPOK) == 0) ! 532: { ! 533: at (0, PROMPTMSGX); ! 534: printf ("Sorry, you are not allowed to write"); ! 535: replot = 0; ! 536: continue; /* back to key processing */ ! 537: } ! 538: if (readnum == 0) ! 539: { ! 540: at (0, PROMPTMSGX); ! 541: printf ("No responses allowed to policy note"); ! 542: replot = 0; ! 543: continue; /* no responses to policy note */ ! 544: } ! 545: ! 546: if (c == 'w') ! 547: txtfile = NULL; /* no preface text */ ! 548: else ! 549: { ! 550: sprintf (cmdline, "/tmp/nfx%d", getpid ()); ! 551: x ((txtfile = fopen (cmdline, "w")) == NULL, "readem: bad scrfile"); ! 552: x (chmod (cmdline, 0666) < 0, "readem: chmod failed"); ! 553: if (resp) ! 554: { ! 555: preptxt (io, txtfile, &rsprec.r_auth[roffset], ! 556: &rsprec.r_when[roffset], &rsprec.r_addr[roffset], NULL); ! 557: } ! 558: else ! 559: { ! 560: preptxt (io, txtfile, ¬e.n_auth, ¬e.n_date, ¬e.n_addr, note.ntitle); ! 561: } ! 562: fclose (txtfile); ! 563: x ((txtfile = fopen (cmdline, "r")) == NULL, "readem: reopen"); ! 564: } ! 565: zresp = addresp (io, txtfile, readnum, EDIT);/* put it in */ ! 566: if (zresp > 0) ! 567: getnrec (io, readnum, ¬e); /* update descriptor */ ! 568: ! 569: if (txtfile != NULL) ! 570: { ! 571: fclose (txtfile); /* toss out scratch */ ! 572: x (unlink (cmdline) < 0, "readem: couldnt unlink scratch"); ! 573: } ! 574: if (zresp) ! 575: resp = zresp; /* show the new */ ! 576: goto showit; ! 577: ! 578: case 'B': /* bitch, bitch, bitch */ ! 579: if (init (&io2, GRIPES) < 0) /* check gripe file */ ! 580: { ! 581: at (0, PROMPTMSGX); ! 582: printf ("No gripe file"); ! 583: replot = 0; ! 584: } ! 585: else ! 586: { ! 587: addnote (&io2, NULL, "Edit Gripe text:", "Gripe Header: ", NULL, EDIT); ! 588: /* let him put the note in */ ! 589: finish (&io2); /* close up the gripe file */ ! 590: } ! 591: goto showit; ! 592: ! 593: case 'C': /* copy to other notesfile with editing */ ! 594: case 'c': /* copy to other notefile without editing */ ! 595: if (c == 'C') ! 596: wtext = 1; ! 597: else ! 598: wtext = 0; /* determine which */ ! 599: while (1) ! 600: { ! 601: printf ("\nCopy to: "); ! 602: if (gline (tonf, NNLEN) == 1) ! 603: goto showit; /* gave up */ ! 604: if (init (&io2, tonf) >= 0) ! 605: break; ! 606: printf ("Can't find notesfile %s\n", tonf); ! 607: } ! 608: sprintf (cmdline, "/tmp/nfx%d", getpid ()); ! 609: x ((txtfile = fopen (cmdline, "w")) == NULL, "readem:creat scratch failed"); ! 610: x (chmod (cmdline, 0666) < 0, "readem: chmod failed"); ! 611: if (resp) ! 612: { ! 613: preptxt (io, txtfile, &rsprec.r_auth[roffset], ! 614: &rsprec.r_when[roffset], &rsprec.r_addr[roffset], NULL); ! 615: } ! 616: else ! 617: { ! 618: preptxt (io, txtfile, ¬e.n_auth, ¬e.n_date, ¬e.n_addr, note.ntitle); ! 619: } ! 620: fclose (txtfile); /* close it */ ! 621: x ((txtfile = fopen (cmdline, "r")) == NULL, "readem: couldnt reopen"); ! 622: c = 'n'; /* default to note */ ! 623: if (allow (&io2, WRITOK) && allow (&io2, READOK) && allow (&io2, RESPOK)) ! 624: c = askyn ("Copy as Response (y/n)? "); ! 625: if (c == 'n' && allow (&io2, WRITOK)) ! 626: if (!resp && wtext == 0) /* use old title */ ! 627: addnote (&io2, txtfile, NULL, NULL, note.ntitle, wtext); ! 628: else ! 629: addnote (&io2, txtfile, "Edit copied text:", "Copy Title: ", NULL, wtext); ! 630: else ! 631: if (c == 'y') ! 632: { ! 633: if (znum = limindx (&io2)) ! 634: addresp (&io2, txtfile, znum, wtext); ! 635: } ! 636: else ! 637: { ! 638: printf ("You haven't permission"); ! 639: c = 'b'; /* leave message */ ! 640: } ! 641: if (strcmp (io -> nf, io2.nf) == 0) /* if was this notefile */ ! 642: getdscr (io, &io -> descr); /* get new descriptor */ ! 643: finish (&io2); /* close up that notefile */ ! 644: if (txtfile != NULL) ! 645: { ! 646: fclose (txtfile); /* throw it away */ ! 647: x (unlink (cmdline) < 0, "readem: couldnt unlink scratch"); ! 648: } ! 649: if (c == 'b') ! 650: { ! 651: replot = 0; ! 652: continue; /* leave on screen */ ! 653: } ! 654: else ! 655: goto showit; /* redo the screen */ ! 656: ! 657: case 'f': /* Forward (copy) string to other notefile w/o edit */ ! 658: case 'F': /* Forward (copy) string to other notefile w/edit */ ! 659: if (resp) ! 660: { ! 661: at (0, PROMPTMSGX); ! 662: printf ("f/F only allowed from base note"); ! 663: replot = 0; ! 664: continue; ! 665: } ! 666: if (c == 'F') ! 667: wtext = 1; ! 668: else ! 669: wtext = 0; /* determine which */ ! 670: while (1) ! 671: { ! 672: printf ("\nForward to: "); ! 673: if (gline (tonf, NNLEN) == 1) ! 674: goto showit; /* gave up */ ! 675: if (init (&io2, tonf) >= 0) ! 676: break; ! 677: printf ("Can't find notesfile %s\n", tonf); ! 678: } ! 679: sprintf (cmdline, "/tmp/nfx%d", getpid ()); ! 680: x ((txtfile = fopen (cmdline, "w")) == NULL, "readem:creat scratch failed"); ! 681: x (chmod (cmdline, 0666) < 0, "readem: chmod failed"); ! 682: preptxt (io, txtfile, ¬e.n_auth, ¬e.n_date, ¬e.n_addr, note.ntitle); ! 683: fclose (txtfile); /* close it */ ! 684: x ((txtfile = fopen (cmdline, "r")) == NULL, "readem: couldnt reopen"); ! 685: c = 'n'; ! 686: if (allow (&io2, WRITOK)) ! 687: { ! 688: if (wtext == 0) ! 689: znum = addnote (&io2, txtfile, NULL, NULL, note.ntitle, NOEDIT); ! 690: else ! 691: znum = addnote (&io2, txtfile, "Edit copy text:", "Copy Title:", NULL, EDIT); ! 692: fclose (txtfile); ! 693: x ((txtfile = fopen (cmdline, "w")) == NULL, "readem:creat scratch failed"); ! 694: for (i = 1; i <= note.n_nresp; i++) ! 695: { ! 696: if (wtext) /* if editing */ ! 697: printf ("Forwarding response %d of %d", ! 698: i, note.n_nresp); /* \n by addresp() below */ ! 699: if (lrsp (io, readnum, i, &rsprec, &roffset, &rrecnum) == -1) ! 700: continue; /* hit end of chain */ ! 701: preptxt (io, txtfile, &rsprec.r_auth[roffset], ! 702: &rsprec.r_when[roffset], &rsprec.r_addr[roffset], NULL); ! 703: fclose (txtfile); ! 704: x ((txtfile = fopen (cmdline, "r")) == NULL, "readem:creat scratch failed"); ! 705: addresp (&io2, txtfile, znum, wtext); ! 706: fclose (txtfile); ! 707: x ((txtfile = fopen (cmdline, "w")) == NULL, "readem:creat scratch failed"); ! 708: } ! 709: } ! 710: else ! 711: { ! 712: printf ("You haven't permission"); ! 713: c = 'b'; /* leave message */ ! 714: } ! 715: if (strcmp (io -> nf, io2.nf) == 0) /* if was this notefile */ ! 716: getdscr (io, &io -> descr); /* get new descriptor */ ! 717: finish (&io2); /* close up that notefile */ ! 718: if (txtfile != NULL) ! 719: { ! 720: fclose (txtfile); /* throw it away */ ! 721: x (unlink (cmdline) < 0, "readem: couldnt unlink scratch"); ! 722: } ! 723: if (c == 'b') ! 724: { ! 725: replot = 0; ! 726: continue; /* leave on screen */ ! 727: } ! 728: else ! 729: goto showit; /* redo the screen */ ! 730: ! 731: ! 732: case 'N': /* go to an archive */ ! 733: sprintf (tonf, "%s/%s", ARCHDIR, io -> nf);/* build dest */ ! 734: goto donest; /* share common code */ ! 735: ! 736: ! 737: case 'n': /* nest notesfiles - a stack */ ! 738: at (-1, 10); ! 739: printf (" New notesfile: "); ! 740: printf (" \b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); ! 741: if (gline (tonf, NNLEN) == 1) ! 742: goto showit; /* forget it, replot */ ! 743: donest: /* used by N */ ! 744: closenf (io); /* save fids */ ! 745: if ((i = control (tonf, NOSEQ)) == -1) /* do the other */ ! 746: sleep (1); /* some error there */ ! 747: if (opennf (io, 0) < 0) ! 748: { ! 749: at (0, PROMPTMSGX); ! 750: printf ("Couldn't reopen notesfile %s", io -> fullname); ! 751: fflush (stdout); ! 752: sleep (2); ! 753: return QUITNOSEQ; /* don't update */ ! 754: } ! 755: if (i == QUITFAST) /* he in a hurry? */ ! 756: return QUITFAST; /* oblige him */ ! 757: goto showit; /* redisplay page */ ! 758: ! 759: case 's': /* place text at end of 'nfsave' */ ! 760: case 'S': /* place the whole string */ ! 761: at (-1, 1); ! 762: printf ("File name: \b\b\b\b\b\b\b\b\b\b\b\b"); ! 763: znum = gline (nfsave, WDLEN); ! 764: at (-1, 1); ! 765: printf ("%*s", znum + 11, " "); /* overwrite */ ! 766: if (znum == 1) /* no file */ ! 767: { ! 768: at (0, PROMPTMSGX); /* tell him didn't do */ ! 769: printf ("No Text Saved"); ! 770: replot = 0; ! 771: continue; ! 772: } ! 773: p = q = nfsave; /* kill leading spaces */ ! 774: while (*p == ' ') ! 775: p++; /* skip them */ ! 776: for (; *p; p++, q++) ! 777: *q = *p; /* move down */ ! 778: *q = '\0'; /* terminate */ ! 779: for (--q;; q--) /* strip trailing */ ! 780: { ! 781: if (*q != ' ') ! 782: break; ! 783: *q = '\0'; /* strip trailing */ ! 784: } ! 785: if (nfsave[0] == '|') /* pipe */ ! 786: { ! 787: p = "Pipe"; ! 788: } ! 789: else ! 790: { ! 791: struct stat sb; /* hold stat result */ ! 792: ! 793: if (stat (nfsave, &sb) == 0) /* find it? */ ! 794: p = "Appended"; ! 795: else ! 796: p = "New File"; /* prolly new */ ! 797: } ! 798: if (c == 's') /* save single page */ ! 799: { ! 800: if (resp) ! 801: { ! 802: znum = savtxt (io, nfsave, &rsprec.r_auth[roffset], ! 803: &rsprec.r_when[roffset], &rsprec.r_addr[roffset], (char *) NULL); ! 804: } ! 805: else ! 806: { ! 807: znum = savtxt (io, nfsave, ¬e.n_auth, ¬e.n_date, ¬e.n_addr, note.ntitle); ! 808: } ! 809: } ! 810: else /* save whole string */ ! 811: { ! 812: znum = savtxt (io, nfsave, ¬e.n_auth, ¬e.n_date, ¬e.n_addr, note.ntitle); ! 813: ! 814: for (i = 1; i <= note.n_nresp; i++) ! 815: { ! 816: if (lrsp (io, readnum, i, &rsprec, &roffset, &rrecnum) == -1) ! 817: continue; /* hit end of chain */ ! 818: znum += savtxt (io, nfsave, &rsprec.r_auth[roffset], ! 819: &rsprec.r_when[roffset], &rsprec.r_addr[roffset], (char *) NULL); ! 820: } ! 821: } ! 822: at (0, PROMPTMSGX); ! 823: printf ("Saved %d lines in \"%s\" [%s]", znum, nfsave, p); ! 824: replot = 0; /* dont erase it */ ! 825: continue; /* don't replot */ ! 826: ! 827: case 'j': /* goto next note/resp */ ! 828: case 'l': ! 829: if (readnum == 0) ! 830: return 0; /* policy returns */ ! 831: if (resp == note.n_nresp) ! 832: goto findnext; /* at end of the responses for this note */ ! 833: if ((resp = nxtresp (io, readnum, resp, &io -> stime)) > 0) ! 834: break; /* go show it */ ! 835: else ! 836: goto findnext; /* try next note ! */ ! 837: ! 838: findnext: ! 839: case 'J': /* next unread note */ ! 840: case 'L': /* like J */ ! 841: if (readnum == 0) ! 842: return 0; /* policy note returns */ ! 843: resp = 0; ! 844: if ((readnum = nxtnote (io, readnum, &io -> stime)) > 0) ! 845: continue; ! 846: else ! 847: { ! 848: if (c == 'L' || c == 'l') /* leave */ ! 849: return QUITSEQ; /* and update... */ ! 850: *firstdis = io -> descr.d_nnote; /* last index page */ ! 851: return 0; /* and show it */ ! 852: } ! 853: ! 854: case '+': ! 855: case ';': ! 856: case ' ': ! 857: if (readnum == 0) ! 858: return 0; /* such is the fate of policy notes */ ! 859: resp++; ! 860: if (resp > note.n_nresp) ! 861: goto nextnt; ! 862: break; ! 863: ! 864: case '*': /* skip to last note */ ! 865: resp = note.n_nresp; ! 866: break; /* and show it */ ! 867: ! 868: case '=': /* go back to the base note */ ! 869: resp = 0; /* reset index into responses */ ! 870: continue; ! 871: ! 872: case '1': /* skip n responses */ ! 873: case '2': ! 874: case '3': ! 875: case '4': ! 876: case '5': ! 877: case '6': ! 878: case '7': ! 879: case '8': ! 880: case '9': ! 881: if (note.n_nresp < 1) ! 882: goto nextnt; ! 883: resp += c - '0'; /* let him skip all over responses */ ! 884: if (resp > note.n_nresp) ! 885: resp = note.n_nresp; /* dont go past end */ ! 886: break; ! 887: ! 888: ! 889: default: /* something we haven't covered */ ! 890: badkey: /* so can jump down here */ ! 891: printf ("\07"); ! 892: replot = 0; /* leave whatever is up on the screen */ ! 893: continue; ! 894: } ! 895: if (resp > note.n_nresp) ! 896: resp = note.n_nresp; /* set to the end */ ! 897: if (resp == 0) ! 898: continue; /* wound up at base note */ ! 899: if (lrsp (io, readnum, resp, &rsprec, &roffset, &rrecnum) == -1) ! 900: { ! 901: getnrec (io, readnum, ¬e); /* get a new descriptor */ ! 902: goto showit; /* dropped something */ ! 903: } ! 904: retcode = dspresp (io, ¬e, &rsprec, roffset, resp, readnum); ! 905: /* show the darn thing */ ! 906: replot = 0; /* leave the response on the screen */ ! 907: } ! 908: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.