Annotation of researchv10no/lbin/Mail/tty.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)tty.c       2.7 (Berkeley) 8/11/83";
                      3: #endif
                      4: 
                      5: /*
                      6:  * Mail -- a mail program
                      7:  *
                      8:  * Generally useful tty stuff.
                      9:  */
                     10: 
                     11: #include "rcv.h"
                     12: 
                     13: static int     c_erase;                /* Current erase char */
                     14: static int     c_kill;                 /* Current kill char */
                     15: static int     hadcont;                /* Saw continue signal */
                     16: static jmp_buf rewrite;                /* Place to go when continued */
                     17: #ifndef TIOCSTI
                     18: static int     ttyset;                 /* We must now do erase/kill */
                     19: #endif
                     20: 
                     21: /*
                     22:  * Read all relevant header fields.
                     23:  */
                     24: 
                     25: grabh(hp, gflags)
                     26:        struct header *hp;
                     27: {
                     28:        struct sgttyb ttybuf;
                     29:        int ttycont(), signull();
                     30: #ifndef TIOCSTI
                     31:        int (*savesigs[2])();
                     32: #endif
                     33:        int (*savecont)();
                     34:        register int s;
                     35:        int errs;
                     36: 
                     37: # ifdef VMUNIX
                     38:        savecont = sigset(SIGCONT, signull);
                     39: # endif VMUNIX
                     40:        errs = 0;
                     41: #ifndef TIOCSTI
                     42:        ttyset = 0;
                     43: #endif
                     44:        if (gtty(fileno(stdin), &ttybuf) < 0) {
                     45:                perror("gtty");
                     46:                return(-1);
                     47:        }
                     48:        c_erase = ttybuf.sg_erase;
                     49:        c_kill = ttybuf.sg_kill;
                     50: #ifndef TIOCSTI
                     51:        ttybuf.sg_erase = 0;
                     52:        ttybuf.sg_kill = 0;
                     53:        for (s = SIGINT; s <= SIGQUIT; s++)
                     54:                if ((savesigs[s-SIGINT] = sigset(s, SIG_IGN)) == SIG_DFL)
                     55:                        sigset(s, SIG_DFL);
                     56: #endif
                     57:        if (gflags & GTO) {
                     58: #ifndef TIOCSTI
                     59:                if (!ttyset && hp->h_to != NOSTR)
                     60:                        ttyset++, stty(fileno(stdin), &ttybuf);
                     61: #endif
                     62:                hp->h_to = readtty("To: ", hp->h_to);
                     63:                if (hp->h_to != NOSTR)
                     64:                        hp->h_seq++;
                     65:        }
                     66:        if (gflags & GSUBJECT) {
                     67: #ifndef TIOCSTI
                     68:                if (!ttyset && hp->h_subject != NOSTR)
                     69:                        ttyset++, stty(fileno(stdin), &ttybuf);
                     70: #endif
                     71:                hp->h_subject = readtty("Subject: ", hp->h_subject);
                     72:                if (hp->h_subject != NOSTR)
                     73:                        hp->h_seq++;
                     74:        }
                     75:        if (gflags & GCC) {
                     76: #ifndef TIOCSTI
                     77:                if (!ttyset && hp->h_cc != NOSTR)
                     78:                        ttyset++, stty(fileno(stdin), &ttybuf);
                     79: #endif
                     80:                hp->h_cc = readtty("Cc: ", hp->h_cc);
                     81:                if (hp->h_cc != NOSTR)
                     82:                        hp->h_seq++;
                     83:        }
                     84:        if (gflags & GBCC) {
                     85: #ifndef TIOCSTI
                     86:                if (!ttyset && hp->h_bcc != NOSTR)
                     87:                        ttyset++, stty(fileno(stdin), &ttybuf);
                     88: #endif
                     89:                hp->h_bcc = readtty("Bcc: ", hp->h_bcc);
                     90:                if (hp->h_bcc != NOSTR)
                     91:                        hp->h_seq++;
                     92:        }
                     93: # ifdef VMUNIX
                     94:        sigset(SIGCONT, savecont);
                     95: # endif VMUNIX
                     96: #ifndef TIOCSTI
                     97:        ttybuf.sg_erase = c_erase;
                     98:        ttybuf.sg_kill = c_kill;
                     99:        if (ttyset)
                    100:                stty(fileno(stdin), &ttybuf);
                    101:        for (s = SIGINT; s <= SIGQUIT; s++)
                    102:                sigset(s, savesigs[s-SIGINT]);
                    103: #endif
                    104:        return(errs);
                    105: }
                    106: 
                    107: /*
                    108:  * Read up a header from standard input.
                    109:  * The source string has the preliminary contents to
                    110:  * be read.
                    111:  *
                    112:  */
                    113: 
                    114: char *
                    115: readtty(pr, src)
                    116:        char pr[], src[];
                    117: {
                    118:        char ch, canonb[BUFSIZ];
                    119:        int c, signull();
                    120:        register char *cp, *cp2;
                    121: 
                    122:        fputs(pr, stdout);
                    123:        fflush(stdout);
                    124:        if (src != NOSTR && strlen(src) > BUFSIZ - 2) {
                    125:                printf("too long to edit\n");
                    126:                return(src);
                    127:        }
                    128: #ifndef TIOCSTI
                    129:        if (src != NOSTR)
                    130:                cp = copy(src, canonb);
                    131:        else
                    132:                cp = copy("", canonb);
                    133:        fputs(canonb, stdout);
                    134:        fflush(stdout);
                    135: #else
                    136:        cp = src == NOSTR ? "" : src;
                    137:        while (c = *cp++) {
                    138:                if (c == c_erase || c == c_kill) {
                    139:                        ch = '\\';
                    140:                        ioctl(0, TIOCSTI, &ch);
                    141:                }
                    142:                ch = c;
                    143:                ioctl(0, TIOCSTI, &ch);
                    144:        }
                    145:        cp = canonb;
                    146:        *cp = 0;
                    147: #endif
                    148:        cp2 = cp;
                    149:        while (cp2 < canonb + BUFSIZ)
                    150:                *cp2++ = 0;
                    151:        cp2 = cp;
                    152:        if (setjmp(rewrite))
                    153:                goto redo;
                    154: # ifdef VMUNIX
                    155:        sigset(SIGCONT, ttycont);
                    156: # endif VMUNIX
                    157:        clearerr(stdin);
                    158:        while (cp2 < canonb + BUFSIZ) {
                    159:                c = getc(stdin);
                    160:                if (c == EOF || c == '\n')
                    161:                        break;
                    162:                *cp2++ = c;
                    163:        }
                    164:        *cp2 = 0;
                    165: # ifdef VMUNIX
                    166:        sigset(SIGCONT, signull);
                    167: # endif VMUNIX
                    168:        if (c == EOF && ferror(stdin) && hadcont) {
                    169: redo:
                    170:                hadcont = 0;
                    171:                cp = strlen(canonb) > 0 ? canonb : NOSTR;
                    172:                clearerr(stdin);
                    173:                return(readtty(pr, cp));
                    174:        }
                    175: #ifndef TIOCSTI
                    176:        if (cp == NOSTR || *cp == '\0')
                    177:                return(src);
                    178:        cp2 = cp;
                    179:        if (!ttyset)
                    180:                return(strlen(canonb) > 0 ? savestr(canonb) : NOSTR);
                    181:        while (*cp != '\0') {
                    182:                c = *cp++;
                    183:                if (c == c_erase) {
                    184:                        if (cp2 == canonb)
                    185:                                continue;
                    186:                        if (cp2[-1] == '\\') {
                    187:                                cp2[-1] = c;
                    188:                                continue;
                    189:                        }
                    190:                        cp2--;
                    191:                        continue;
                    192:                }
                    193:                if (c == c_kill) {
                    194:                        if (cp2 == canonb)
                    195:                                continue;
                    196:                        if (cp2[-1] == '\\') {
                    197:                                cp2[-1] = c;
                    198:                                continue;
                    199:                        }
                    200:                        cp2 = canonb;
                    201:                        continue;
                    202:                }
                    203:                *cp2++ = c;
                    204:        }
                    205:        *cp2 = '\0';
                    206: #endif
                    207:        if (equal("", canonb))
                    208:                return(NOSTR);
                    209:        return(savestr(canonb));
                    210: }
                    211: 
                    212: # ifdef VMUNIX
                    213: /*
                    214:  * Receipt continuation.
                    215:  */
                    216: ttycont(s)
                    217: {
                    218: 
                    219:        hadcont++;
                    220:        longjmp(rewrite, 1);
                    221: }
                    222: # endif VMUNIX
                    223: 
                    224: /*
                    225:  * Null routine to satisfy
                    226:  * silly system bug that denies us holding SIGCONT
                    227:  */
                    228: signull(s)
                    229: {}

unix.superglobalmegacorp.com

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