Annotation of 43BSD/contrib/notes/src/readem.c, revision 1.1.1.1

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, &note);
                     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, &note, 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, &note);           /* 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 (&note.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, &note);           /* 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, &note);   /* 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 (&note.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, &note.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: ", &note.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, &note.n_addr, &note.n_auth,
                    358:                            &note.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, &note);       /* 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, &note);
                    467:                    if (note.n_stat & DIRMES)
                    468:                        note.n_stat &= NOT DIRMES;
                    469:                    else
                    470:                        note.n_stat |= DIRMES;
                    471:                    putnrec (io, readnum, &note);       /* 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, &note);       /* well, update it */
                    514:                    strncpy (note.ntitle, ntitle, TITLEN);
                    515:                    note.ntitle[TITLEN - 1] = '\0';     /* null for sure */
                    516:                    putnrec (io, readnum, &note);       /* 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 (&note.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, &note.n_auth, &note.n_date, &note.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, &note);       /* 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, &note.n_auth, &note.n_date, &note.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, &note.n_auth, &note.n_date, &note.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, &note.n_auth, &note.n_date, &note.n_addr, note.ntitle);
                    808:                    }
                    809:                }
                    810:                else                                    /* save whole string */
                    811:                {
                    812:                    znum = savtxt (io, nfsave, &note.n_auth, &note.n_date, &note.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, &note);               /* get a new descriptor */
                    902:            goto showit;                                /* dropped something */
                    903:        }
                    904:        retcode = dspresp (io, &note, &rsprec, roffset, resp, readnum);
                    905:                                                        /* show the darn thing */
                    906:        replot = 0;                                     /* leave the response on the screen */
                    907:     }
                    908: }

unix.superglobalmegacorp.com

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