Annotation of researchv10no/cmd/nupas/print/cmds.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <signal.h>
        !             3: #include "mail.h"
        !             4: #include "string.h"
        !             5: #include "message.h"
        !             6: 
        !             7: /* imported */
        !             8: char *getenv();
        !             9: 
        !            10: /*
        !            11:  * auxiliary routines used by commands
        !            12:  */
        !            13: 
        !            14: /* drop the newline off a string */
        !            15: static char *
        !            16: dropleadingwhite(cmd)
        !            17:        char *cmd;
        !            18: {
        !            19:        while(*cmd==' ' || *cmd=='\t')
        !            20:                cmd++;
        !            21:        return cmd;
        !            22: }
        !            23: 
        !            24: /* drop the newline off a string */
        !            25: static void
        !            26: dropnewline(cmd)
        !            27:        char *cmd;
        !            28: {
        !            29:        cmd = cmd+strlen(cmd)-1;
        !            30:        if (*cmd=='\n')
        !            31:                *cmd = '\0';
        !            32: }
        !            33: 
        !            34: /* make sure an argument exists */
        !            35: static int
        !            36: needargument(cmd)
        !            37:        char *cmd;
        !            38: {
        !            39:        if (*cmd=='\0') {
        !            40:                fprintf(stderr, "?argument missing\n");
        !            41:                return -1;
        !            42:        }
        !            43:        return 0;
        !            44: }
        !            45: 
        !            46: /* make the header line for a message */
        !            47: char *
        !            48: header(mp)
        !            49:        message *mp;
        !            50: {
        !            51:        static char hd[256];
        !            52: 
        !            53:        sprintf(hd, "%3d %c %4d %s %.30s", mp->pos, mp->status&DELETED?'d':' ',
        !            54:                mp->size, s_to_c(mp->sender), s_to_c(mp->date));
        !            55:        return hd;
        !            56: }
        !            57: 
        !            58: /*
        !            59:  *     command routines 
        !            60:  */
        !            61: 
        !            62: /* current message */
        !            63: whereis(mp)
        !            64:        message *mp;
        !            65: {
        !            66:        printf("%d\n", mp->pos);
        !            67:        return 0;
        !            68: }
        !            69: 
        !            70: /* print header */
        !            71: prheader(mp)
        !            72:        message *mp;
        !            73: {
        !            74:        printf("%s\n", header(mp));
        !            75:        return 0;
        !            76: }
        !            77: 
        !            78: /* change message status */
        !            79: delete(mp)
        !            80:        message *mp;
        !            81: {
        !            82:        mp->status |= DELETED;
        !            83:        return 0;
        !            84: }
        !            85: undelete(mp)
        !            86:        message *mp;
        !            87: {
        !            88:        mp->status &= ~DELETED;
        !            89:        return 0;
        !            90: }
        !            91: 
        !            92: /* store a message into a file */
        !            93: store(mp, cmd, header)
        !            94:        message *mp;
        !            95:        char *cmd;
        !            96: {
        !            97:        static string *mbox=NULL;
        !            98:        FILE *fp;
        !            99:        char *home;
        !           100: 
        !           101:        dropnewline(cmd);
        !           102:        cmd = dropleadingwhite(cmd);
        !           103:        if (*cmd=='\0') {
        !           104:                if (mbox==NULL){ 
        !           105:                        mbox=s_new();
        !           106:                        if ((home=getenv("HOME"))!=NULL) {
        !           107:                                s_append(mbox, home);
        !           108:                                s_append(mbox, "/");
        !           109:                        }
        !           110:                        s_append(mbox, "mbox");
        !           111:                }
        !           112:                cmd = s_to_c(mbox);
        !           113:        }
        !           114:        fp = fopen(cmd, "a");
        !           115:        if (fp == NULL) {
        !           116:                fprintf(stderr, "?can't open %s\n", cmd);
        !           117:                return -1;
        !           118:        }
        !           119:        m_print(mp, fp, header, header);
        !           120:        fclose(fp);
        !           121:        return 0;
        !           122: }
        !           123: 
        !           124: static interrupt = 0;
        !           125: 
        !           126: SIGRETURN
        !           127: remember_int(s)
        !           128:        int s;
        !           129: {
        !           130:        signal(SIGINT, remember_int);
        !           131:        interrupt = 1;
        !           132: }
        !           133: 
        !           134: /* pipe a message (and possible tty input) to a command */
        !           135: static int
        !           136: pipecmd(mp, cmd, fromtty, mailinput)
        !           137:        message *mp;
        !           138:        char *cmd;
        !           139:        int fromtty;
        !           140:        int mailinput;
        !           141: {
        !           142:        FILE *fp;
        !           143:        char buf[128];
        !           144:        int status, rv=0;
        !           145:        SIG_TYP istat, qstat;
        !           146:        int onatty;
        !           147: 
        !           148:        onatty = isatty(fileno(stdin));
        !           149:        if (fromtty){
        !           150:                printf("!%s\n", cmd);
        !           151:                fflush(stdout);
        !           152:        }
        !           153:        fp = popen(cmd, "w");
        !           154:        if (fp==NULL) {
        !           155:                fprintf(stderr, "?can't exec %s\n", cmd);
        !           156:                return -1;
        !           157:        }
        !           158:        interrupt = 0;
        !           159:        istat = signal(SIGINT, remember_int);
        !           160:        qstat = signal(SIGQUIT, remember_int);
        !           161:        if (fromtty) {
        !           162:                while (fgets(buf, sizeof(buf), stdin)!=NULL) {
        !           163:                        if (interrupt!=0)
        !           164:                                break;
        !           165:                        if (onatty && strcmp(buf, ".\n")==0)
        !           166:                                break;
        !           167:                        fputs(buf, fp);
        !           168:                        fflush(fp);
        !           169:                }
        !           170:                clearerr(stdin);
        !           171:        }
        !           172:        if (!interrupt && mailinput)
        !           173:                m_print(mp, fp, 0, 1);
        !           174:        if (status=pclose(fp))
        !           175:                rv = -1;
        !           176:        signal(SIGINT, istat);
        !           177:        signal(SIGQUIT, qstat);
        !           178:        if (fromtty)
        !           179:                printf("!\n");
        !           180:        return rv;
        !           181: }
        !           182: 
        !           183: /* pass a message to someone else */
        !           184: remail(mp, cmd, ttyinput)
        !           185:        message *mp;
        !           186:        char *cmd;
        !           187:        int ttyinput;
        !           188: {
        !           189:        static string *cmdstring=NULL;
        !           190: 
        !           191:        dropnewline(cmd);
        !           192:        if(cmdstring==NULL)
        !           193:                cmdstring = s_new();
        !           194:        s_append(s_restart(cmdstring), "/bin/mail ");
        !           195:        s_append(cmdstring, cmd);
        !           196:        if (pipecmd(mp, s_to_c(cmdstring), ttyinput, 1)<0)
        !           197:                return -1;
        !           198:        return 0;
        !           199: }
        !           200: 
        !           201: /* output a message */
        !           202: print(mp)
        !           203:        message *mp;
        !           204: {
        !           205:        m_print(mp, stdout, 0, 1);
        !           206:        return 0;
        !           207: }
        !           208: 
        !           209: /* pipe mail into a command */
        !           210: pipemail(mp, cmd, ttyinput)
        !           211:        message *mp;
        !           212:        char *cmd;
        !           213: {
        !           214:        dropnewline(cmd);
        !           215:        if (pipecmd(mp, cmd, ttyinput, 1)<0)
        !           216:                return -1;
        !           217:        return 0;
        !           218: }
        !           219: 
        !           220: /* escape to the shell */
        !           221: escape(cmd)
        !           222:        char *cmd;
        !           223: {
        !           224:        char *cp;
        !           225: 
        !           226:        cp = cmd+strlen(cmd)-1;
        !           227:        if (*cp=='\n')
        !           228:                *cp = '\0';
        !           229:        system(cmd);
        !           230:        printf("!\n");
        !           231:        return 0;
        !           232: }
        !           233: 
        !           234: /* reply to a message */
        !           235: reply(mp, mailinput)
        !           236:        message *mp;
        !           237:        int mailinput;
        !           238: {
        !           239:        static string *cmdstring=NULL;
        !           240: 
        !           241:        if (cmdstring==NULL)
        !           242:                cmdstring = s_new();
        !           243:        s_append(s_restart(cmdstring), "/bin/mail ");
        !           244:        s_append(cmdstring, s_to_c(mp->sender));
        !           245:        if (pipecmd(mp, s_to_c(cmdstring), 1, mailinput)<0)
        !           246:                return -1;
        !           247:        return 0;
        !           248: }
        !           249: 
        !           250: /* print out the command list */
        !           251: help()
        !           252: {
        !           253:        printf("Commands are of the form [range] command [argument].\n");
        !           254:        printf("The commmands are:\n");
        !           255:        printf("b\tprint the next ten headers\n");
        !           256:        printf("d\tmark for deletion\n");
        !           257:        printf("h\tprint message header (,h to print all headers)\n");
        !           258:        printf("m addr\tremail message to addr\n");
        !           259:        printf("M addr\tremail message to addr preceded by user input\n");
        !           260:        printf("p\tprint the message\n");
        !           261:        printf("q\texit from mail, and save messages not marked for deletion\n");
        !           262:        printf("r\treply to sender\n");
        !           263:        printf("R\treply to sender with original message appended\n");
        !           264:        printf("s file\tappend message to file\n");
        !           265:        printf("u\tunmark message for deletion\n");
        !           266:        printf("x\texit without changing mail box\n");
        !           267:        printf("| cmd\tpipe mail to command\n");
        !           268:        printf("! cmd\tescape to commmand\n");
        !           269:        printf("?\tprint this message\n");
        !           270:        return 0;
        !           271: }

unix.superglobalmegacorp.com

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