Annotation of researchv10no/lbin/mailx/cmd4.c, revision 1.1.1.1

1.1       root        1: #ident "@(#)cmd4.c     1.3 'attmail mail(1) command'"
                      2: #ident "@(#)mailx:cmd4.c       1.4.1.1"
                      3: /*     Copyright (c) 1984 AT&T */
                      4: /*       All Rights Reserved   */
                      5: 
                      6: /*     THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T     */
                      7: /*     The copyright notice above does not evidence any        */
                      8: /*     actual or intended publication of such source code.     */
                      9: 
                     10: #ident "@(#)mailx:cmd4.c       1.4"
                     11: 
                     12: #include "rcv.h"
                     13: 
                     14: /*
                     15:  * mailx -- a modified version of a University of California at Berkeley
                     16:  *     mail program
                     17:  *
                     18:  * More commands..
                     19:  */
                     20: 
                     21: 
                     22: /*
                     23:  * pipe messages to cmd.
                     24:  */
                     25: 
                     26: dopipe(str)
                     27:        char str[];
                     28: {
                     29:        register int *ip, mesg;
                     30:        register struct message *mp;
                     31:        char *cp, *cmd;
                     32:        int f, *msgvec, nowait=0;
                     33:        void (*sigint)(), (*sigpipe)();
                     34:        long lc, cc, t;
                     35:        register pid_t pid;
                     36:        int page, s, pivec[2];
                     37:        char *Shell;
                     38:        FILE *pio;
                     39: 
                     40:        msgvec = (int *) salloc((msgCount + 2) * sizeof *msgvec);
                     41:        if ((cmd = snarf(str, &f, 0)) == NOSTR) {
                     42:                if (f == -1) {
                     43:                        printf("pipe command error\n");
                     44:                        return(1);
                     45:                        }
                     46:                if ( (cmd = value("cmd")) == NOSTR) {
                     47:                        printf("\"cmd\" not set, ignored.\n");
                     48:                        return(1);
                     49:                        }
                     50:                }
                     51:        if (!f) {
                     52:                *msgvec = first(0, MMNORM);
                     53:                if (*msgvec == NULL) {
                     54:                        printf("No messages to pipe.\n");
                     55:                        return(1);
                     56:                }
                     57:                msgvec[1] = NULL;
                     58:        }
                     59:        if (f && getmsglist(str, msgvec, 0) < 0)
                     60:                return(1);
                     61:        if (*(cp=cmd+strlen(cmd)-1)=='&'){
                     62:                *cp=0;
                     63:                nowait++;
                     64:                }
                     65:        printf("Pipe to: \"%s\"\n", cmd);
                     66:        flush();
                     67: 
                     68:                                        /*  setup pipe */
                     69:        if (pipe(pivec) < 0) {
                     70:                perror("pipe");
                     71:                return(0);
                     72:        }
                     73: 
                     74:        if ((pid = fork()) == 0) {
                     75:                close(pivec[1]);        /* child */
                     76:                fclose(stdin);
                     77:                dup(pivec[0]);
                     78:                close(pivec[0]);
                     79:                if ((Shell = value("SHELL")) == NOSTR || *Shell=='\0')
                     80:                        Shell = SHELL;
                     81:                execlp(Shell, Shell, "-c", cmd, (char *)0);
                     82:                perror(Shell);
                     83:                _exit(1);
                     84:        }
                     85:        if (pid == (pid_t)-1) {         /* error */
                     86:                perror("fork");
                     87:                close(pivec[0]);
                     88:                close(pivec[1]);
                     89:                return(0);
                     90:        }
                     91: 
                     92:        close(pivec[0]);                /* parent */
                     93:        pio=fdopen(pivec[1],"w");
                     94:        sigint = sigset(SIGINT, SIG_IGN);
                     95:        sigpipe = sigset(SIGPIPE, SIG_IGN);
                     96: 
                     97:                                        /* send all messages to cmd */
                     98:        page = (value("page")!=NOSTR);
                     99:        lc = cc = 0;
                    100:        for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
                    101:                mesg = *ip;
                    102:                touch(mesg);
                    103:                mp = &message[mesg-1];
                    104:                if ((t = send(mp, pio, 0)) < 0) {
                    105:                        perror(cmd);
                    106:                        sigset(SIGPIPE, sigpipe);
                    107:                        sigset(SIGINT, sigint);
                    108:                        return(1);
                    109:                }
                    110:                lc += t;
                    111:                cc += mp->m_size;
                    112:                if (page) putc('\f', pio);
                    113:        }
                    114: 
                    115:        fflush(pio);
                    116:        if (ferror(pio))
                    117:              perror(cmd);
                    118:        fclose(pio);
                    119: 
                    120:                                        /* wait */
                    121:        if (!nowait) {
                    122:                while (wait(&s) != pid);
                    123:                if (s != 0)
                    124:                        printf("Pipe to \"%s\" failed\n", cmd);
                    125:        }
                    126:        if (nowait || s == 0)
                    127:                printf("\"%s\" %ld/%ld\n", cmd, lc, cc);
                    128:        sigset(SIGPIPE, sigpipe);
                    129:        sigset(SIGINT, sigint);
                    130:        return(0);
                    131: }

unix.superglobalmegacorp.com

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