Annotation of 43BSD/contrib/nntp/rrn/respond.c, revision 1.1.1.1

1.1       root        1: /* $Header: respond.c,v 4.3.1.4 85/05/23 17:24:49 lwall Exp $
                      2:  *
                      3:  * $Log:       respond.c,v $
                      4:  * Revision 4.3.1.4  85/05/23  17:24:49  lwall
                      5:  * Now allows 'r' and 'f' on null articles.
                      6:  * 
                      7:  * Revision 4.3.1.3  85/05/15  14:42:32  lwall
                      8:  * Removed duplicate include of intrp.h.
                      9:  * 
                     10:  * Revision 4.3.1.2  85/05/14  08:55:15  lwall
                     11:  * Default for normal/mailbox question was applied to wrong buffer.
                     12:  * 
                     13:  * Revision 4.3.1.1  85/05/10  11:37:33  lwall
                     14:  * Branch for patches.
                     15:  * 
                     16:  * Revision 4.3  85/05/01  11:47:04  lwall
                     17:  * Baseline for release with 4.3bsd.
                     18:  * 
                     19:  */
                     20: 
                     21: #include "EXTERN.h"
                     22: #include "common.h"
                     23: #include "intrp.h"
                     24: #include "head.h"
                     25: #include "term.h"
                     26: #include "ng.h"
                     27: #include "util.h"
                     28: #include "rn.h"
                     29: #include "artio.h"
                     30: #include "final.h"
                     31: #include "INTERN.h"
                     32: #include "respond.h"
                     33: 
                     34: static char nullart[] = "\nNull article\n";
                     35: 
                     36: void
                     37: respond_init()
                     38: {
                     39:     ;
                     40: }
                     41: 
                     42: int
                     43: save_article()
                     44: {
                     45:     bool use_pref;
                     46:     register char *s, *c;
                     47:     char altbuf[CBUFLEN];
                     48:     int iter;
                     49:     bool interactive = (buf[1] == FINISHCMD);
                     50:     
                     51:     if (!finish_command(interactive))  /* get rest of command */
                     52:        return SAVE_ABORT;
                     53:     use_pref = isupper(*buf);
                     54: #ifdef ASYNC_PARSE
                     55:     parse_maybe(art);
                     56: #endif
                     57:     savefrom = (*buf=='w' || *buf=='W' ? htype[PAST_HEADER].ht_minpos : 0);
                     58:     if (artopen(art) == Nullfp) {
                     59: #ifdef VERBOSE
                     60:        IF(verbose)
                     61:            fputs("\n\
                     62: Saving null articles is not very productive!  :-)\n\
                     63: ",stdout) FLUSH;
                     64:        ELSE
                     65: #endif
                     66: #ifdef TERSE
                     67:            fputs(nullart,stdout) FLUSH;
                     68: #endif
                     69:        return SAVE_DONE;
                     70:     }
                     71:     if (chdir(cwd)) {
                     72:        printf(nocd,cwd) FLUSH;
                     73:        sig_catcher(0);
                     74:     }
                     75:     if (savedest)
                     76:        free(savedest);
                     77:     if ((s = index(buf,'|')) != Nullch) {
                     78:                                /* is it a pipe command? */
                     79:        s++;                    /* skip the | */
                     80:        while (*s == ' ') s++;
                     81:        safecpy(altbuf,filexp(s),sizeof altbuf);
                     82:        savedest = altbuf;
                     83:        interp(cmd_buf, (sizeof cmd_buf), getval("PIPESAVER",PIPESAVER));
                     84:                                /* then set up for command */
                     85:        resetty();              /* restore tty state */
                     86:        if (use_pref)           /* use preferred shell? */
                     87:            doshell(Nullch,cmd_buf);
                     88:                                /* do command with it */
                     89:        else
                     90:            doshell(sh,cmd_buf);        /* do command with sh */
                     91:        noecho();               /* and stop echoing */
                     92:        crmode();               /* and start cbreaking */
                     93:        savedest = savestr(savedest);
                     94:     }
                     95:     else {                     /* normal save */
                     96:        bool there, mailbox;
                     97:        char *savename = getval("SAVENAME",SAVENAME);
                     98: 
                     99:        s = buf+1;              /* skip s or S */
                    100:        if (*s == '-') {        /* if they are confused, skip - also */
                    101: #ifdef VERBOSE
                    102:            IF(verbose)
                    103:                fputs("Warning: '-' ignored.  This isn't readnews.\n",stdout)
                    104:                  FLUSH;
                    105:            ELSE
                    106: #endif
                    107: #ifdef TERSE
                    108:                fputs("'-' ignored.\n",stdout) FLUSH;
                    109: #endif
                    110:            s++;
                    111:        }
                    112:        for (; *s == ' '; s++); /* skip spaces */
                    113:        safecpy(altbuf,filexp(s),sizeof altbuf);
                    114:        s = altbuf;
                    115:        if (! index(s,'/')) {
                    116:            interp(buf, (sizeof buf), getval("SAVEDIR",SAVEDIR));
                    117:            if (makedir(buf,MD_DIR))    /* ensure directory exists */
                    118:                strcpy(buf,cwd);
                    119:            if (*s) {
                    120:                for (c = buf; *c; c++) ;
                    121:                *c++ = '/';
                    122:                strcpy(c,s);            /* add filename */
                    123:            }
                    124:            s = buf;
                    125:        }
                    126:        for (iter = 0;
                    127:            (there = stat(s,&filestat) >= 0) &&
                    128:            (filestat.st_mode & S_IFDIR);
                    129:            iter++) {                   /* is it a directory? */
                    130: 
                    131:            c = (s+strlen(s));
                    132:            *c++ = '/';                 /* put a slash before filename */
                    133:            interp(c, s==buf?(sizeof buf):(sizeof altbuf),
                    134:                iter ? "News" : savename );
                    135:                                /* generate a default name somehow or other */
                    136:            if (index(c,'/')) {         /* yikes, a '/' in the filename */
                    137:                makedir(s,MD_FILE);
                    138:            }
                    139:        }
                    140:        if (*s != '/') {                /* relative path? */
                    141:            c = (s==buf ? altbuf : buf);
                    142:            sprintf(c, "%s/%s", cwd, s);
                    143:            s = c;                      /* absolutize it */
                    144:        }
                    145:        s = savedest = savestr(s);      /* doesn't move any more */
                    146:                                        /* make it handy for %b */
                    147:        if (!there) {
                    148:            if (mbox_always)
                    149:                mailbox = TRUE;
                    150:            else if (norm_always)
                    151:                mailbox = FALSE;
                    152:            else {
                    153:                char *dflt = (instr(savename,"%a") ? "nyq" : "ynq");
                    154:                
                    155:                sprintf(cmd_buf,
                    156:                "\nFile %s doesn't exist--\n    use mailbox format? [%s] ",
                    157:                  s,dflt);
                    158:              reask_save:
                    159:                in_char(cmd_buf);
                    160:                putchar('\n') FLUSH;
                    161:                setdef(buf,dflt);
                    162: #ifdef VERIFY
                    163:                printcmd();
                    164: #endif
                    165:                if (*buf == 'h') {
                    166: #ifdef VERBOSE
                    167:                    IF(verbose)
                    168:                        printf("\n\
                    169: Type y to create %s as a mailbox.\n\
                    170: Type n to create it as a normal file.\n\
                    171: Type q to abort the save.\n\
                    172: ",s) FLUSH;
                    173:                    ELSE
                    174: #endif
                    175: #ifdef TERSE
                    176:                        fputs("\n\
                    177: y to create mailbox.\n\
                    178: n to create normal file.\n\
                    179: q to abort.\n\
                    180: ",stdout) FLUSH;
                    181: #endif
                    182:                    goto reask_save;
                    183:                }
                    184:                else if (*buf == 'n') {
                    185:                    mailbox = FALSE;
                    186:                }
                    187:                else if (*buf == 'y') {
                    188:                    mailbox = TRUE;
                    189:                }
                    190:                else if (*buf == 'q') {
                    191:                    goto s_bomb;
                    192:                }
                    193:                else {
                    194:                    fputs(hforhelp,stdout) FLUSH;
                    195:                    settle_down();
                    196:                    goto reask_save;
                    197:                }
                    198:            }
                    199:        }
                    200:        else if (filestat.st_mode & S_IFCHR)
                    201:            mailbox = FALSE;
                    202:        else {
                    203:            int tmpfd;
                    204:            
                    205:            tmpfd = open(s,0);
                    206:            if (tmpfd == -1)
                    207:                mailbox = FALSE;
                    208:            else {
                    209:                read(tmpfd,buf,LBUFLEN);
                    210:                c = buf;
                    211:                if (!isspace(MBOXCHAR))
                    212:                    while (isspace(*c))
                    213:                        c++;
                    214:                mailbox = (*c == MBOXCHAR);
                    215:                close(tmpfd);
                    216:            }
                    217:        }
                    218: 
                    219:        safecpy(cmd_buf, filexp(mailbox ?
                    220:            getval("MBOXSAVER",MBOXSAVER) :
                    221:            getval("NORMSAVER",NORMSAVER) ), sizeof cmd_buf);
                    222:                                /* format the command */
                    223:        resetty();              /* make terminal behave */
                    224:        if (doshell(use_pref?Nullch:SH,cmd_buf))
                    225:            fputs("Not saved",stdout);
                    226:        else
                    227:            printf("%s to %s %s",
                    228:              there?"Appended":"Saved",
                    229:              mailbox?"mailbox":"file",
                    230:              s);
                    231:        if (interactive)
                    232:            putchar('\n') FLUSH;
                    233:        noecho();               /* make terminal do what we want */
                    234:        crmode();
                    235:     }
                    236: s_bomb:
                    237: #ifdef SERVER
                    238:     if (chdir(spool)) {
                    239: #else
                    240:     if (chdir(spool) || chdir(ngdir)) {
                    241: #endif
                    242:        printf(nocd,ngdir) FLUSH;
                    243:        sig_catcher(0);
                    244:     }
                    245:     return SAVE_DONE;
                    246: }
                    247: 
                    248: int
                    249: cancel_article()
                    250: {
                    251:     char *artid_buf;
                    252:     char *ngs_buf;
                    253:     char *from_buf;
                    254:     char *reply_buf;
                    255:     int myuid = getuid();
                    256:     int r = -1;
                    257: 
                    258:     if (artopen(art) == Nullfp) {
                    259: #ifdef VERBOSE
                    260:        IF(verbose)
                    261:            fputs("\n\
                    262: Cancelling null articles is your idea of fun?  :-)\n\
                    263: ",stdout) FLUSH;
                    264:        ELSE
                    265: #endif
                    266: #ifdef TERSE
                    267:            fputs(nullart,stdout) FLUSH;
                    268: #endif
                    269:        return r;
                    270:     }
                    271:     reply_buf = fetchlines(art,REPLY_LINE);
                    272:     from_buf = fetchlines(art,FROM_LINE);
                    273:     artid_buf = fetchlines(art,ARTID_LINE);
                    274:     ngs_buf = fetchlines(art,NGS_LINE);
                    275:     if (!instr(from_buf,sitename) ||
                    276:        (!instr(from_buf,logname) &&
                    277:         !instr(reply_buf,logname) &&
                    278: #ifdef NEWSADMIN
                    279:         myuid != newsuid &&
                    280: #endif
                    281:         myuid != ROOTID ) )
                    282: #ifdef VERBOSE
                    283:            IF(verbose)
                    284:                fputs("You can't cancel someone else's article\n",stdout)
                    285:                  FLUSH;
                    286:            ELSE
                    287: #endif
                    288: #ifdef TERSE
                    289:                fputs("Not your article\n",stdout) FLUSH;
                    290: #endif
                    291:     else {
                    292:        tmpfp = fopen(headname,"w");    /* open header file */
                    293:        if (tmpfp == Nullfp) {
                    294:            printf(cantcreate,headname) FLUSH;
                    295:            goto no_cancel;
                    296:        }
                    297:        interp(buf, (sizeof buf), getval("CANCELHEADER",CANCELHEADER));
                    298:        fputs(buf,tmpfp);
                    299:        fclose(tmpfp);
                    300:        r = doshell(sh,filexp(getval("CANCEL",CANCEL)));
                    301:     }
                    302: no_cancel:
                    303:     free(artid_buf);
                    304:     free(ngs_buf);
                    305:     free(from_buf);
                    306:     free(reply_buf);
                    307:     return r;
                    308: }
                    309: 
                    310: void
                    311: reply()
                    312: {
                    313:     bool incl_body = (*buf == 'R');
                    314:     char *maildoer = savestr(filexp(getval("MAILPOSTER",MAILPOSTER)));
                    315: 
                    316:     artopen(art);
                    317:     tmpfp = fopen(headname,"w");       /* open header file */
                    318:     if (tmpfp == Nullfp) {
                    319:        printf(cantcreate,headname) FLUSH;
                    320:        goto no_reply;
                    321:     }
                    322:     interp(buf, (sizeof buf), getval("MAILHEADER",MAILHEADER));
                    323:     fputs(buf,tmpfp);
                    324:     if (!instr(maildoer,"%h"))
                    325: #ifdef VERBOSE
                    326:        IF(verbose)
                    327:            printf("\n%s\n(Above lines saved in file %s)\n",buf,headname)
                    328:              FLUSH;
                    329:        ELSE
                    330: #endif
                    331: #ifdef TERSE
                    332:            printf("\n%s\n(Header in %s)\n",buf,headname) FLUSH;
                    333: #endif
                    334:     if (incl_body && artfp != Nullfp) {
                    335:        interp(buf, (sizeof buf), getval("YOUSAID",YOUSAID));
                    336:        fprintf(tmpfp,"%s\n",buf);
                    337: #ifdef ASYNC_PARSE
                    338:        parse_maybe(art);
                    339: #endif
                    340:        fseek(artfp,(long)htype[PAST_HEADER].ht_minpos,0);
                    341:        while (fgets(buf,LBUFLEN,artfp) != Nullch) {
                    342:            fprintf(tmpfp,"%s%s",indstr,buf);
                    343:        }
                    344:        fprintf(tmpfp,"\n");
                    345:     }
                    346:     fclose(tmpfp);
                    347:     interp(cmd_buf, (sizeof cmd_buf), maildoer);
                    348:     invoke(cmd_buf,origdir);
                    349:     UNLINK(headname);          /* kill the header file */
                    350: no_reply:
                    351:     free(maildoer);
                    352: }
                    353: 
                    354: void
                    355: followup()
                    356: {
                    357:     bool incl_body = (*buf == 'F');
                    358: 
                    359:     artopen(art);
                    360:     tmpfp = fopen(headname,"w");
                    361:     if (tmpfp == Nullfp) {
                    362:        printf(cantcreate,headname) FLUSH;
                    363:        return;
                    364:     }
                    365:     interp(buf, (sizeof buf), getval("NEWSHEADER",NEWSHEADER));
                    366:     fprintf(tmpfp,"%s",buf);
                    367:     if (incl_body && artfp != Nullfp) {
                    368: #ifdef VERBOSE
                    369:        if (verbose)
                    370:            fputs("\n\
                    371: (Be sure to double-check the attribution against the signature, and\n\
                    372: trim the quoted article down as much as possible.)\n\
                    373: ",stdout) FLUSH;
                    374: #endif
                    375:        interp(buf, (sizeof buf), getval("ATTRIBUTION",ATTRIBUTION));
                    376:        fprintf(tmpfp,"%s\n",buf);
                    377: #ifdef ASYNC_PARSE
                    378:        parse_maybe(art);
                    379: #endif
                    380:        fseek(artfp,(long)htype[PAST_HEADER].ht_minpos,0);
                    381:        while (fgets(buf,LBUFLEN,artfp) != Nullch) {
                    382:            fprintf(tmpfp,"%s%s",indstr,buf);
                    383:        }
                    384:        fprintf(tmpfp,"\n");
                    385:     }
                    386:     fclose(tmpfp);
                    387:     safecpy(cmd_buf,filexp(getval("NEWSPOSTER",NEWSPOSTER)),sizeof cmd_buf);
                    388:     invoke(cmd_buf,origdir);
                    389:     UNLINK(headname);
                    390: }
                    391: 
                    392: void
                    393: invoke(cmd,dir)
                    394: char *cmd,*dir;
                    395: {
                    396:     if (chdir(dir)) {
                    397:        printf(nocd,dir) FLUSH;
                    398:        return;
                    399:     }
                    400: #ifdef VERBOSE
                    401:     IF(verbose)
                    402:        printf("\n(leaving cbreak mode; cwd=%s)\nInvoking command: %s\n\n",
                    403:            dir,cmd) FLUSH;
                    404:     ELSE
                    405: #endif
                    406: #ifdef TERSE
                    407:        printf("\n(-cbreak; cwd=%s)\nInvoking: %s\n\n",dir,cmd) FLUSH;
                    408: #endif
                    409:     resetty();                 /* make terminal well-behaved */
                    410:     doshell(sh,cmd);           /* do the command */
                    411:     noecho();                  /* set no echo */
                    412:     crmode();                  /* and cbreak mode */
                    413: #ifdef VERBOSE
                    414:     IF(verbose)
                    415:        fputs("\n(re-entering cbreak mode)\n",stdout) FLUSH;
                    416:     ELSE
                    417: #endif
                    418: #ifdef TERSE
                    419:        fputs("\n(+cbreak)\n",stdout) FLUSH;
                    420: #endif
                    421: #ifdef SERVER
                    422:     if (chdir(spool)) {
                    423: #else
                    424:     if (chdir(spool) || chdir(ngdir)) {
                    425: #endif
                    426:        printf(nocd,ngdir) FLUSH;
                    427:        sig_catcher(0);
                    428:     }
                    429: }
                    430: 

unix.superglobalmegacorp.com

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