Annotation of coherent/e/bin/pax/ttyio.c, revision 1.1.1.1

1.1       root        1: /* $Source: /src386/usr/bin/pax/RCS/ttyio.c,v $
                      2:  *
                      3:  * $Revision: 1.2 $
                      4:  *
                      5:  * ttyio.c - Terminal/Console I/O functions for all archive interfaces
                      6:  *
                      7:  * DESCRIPTION
                      8:  *
                      9:  *     These routines provide a consistent, general purpose interface to
                     10:  *     the user via the users terminal, if it is available to the
                     11:  *     process.
                     12:  *
                     13:  * AUTHOR
                     14:  *
                     15:  *     Mark H. Colburn, NAPS International ([email protected])
                     16:  *
                     17:  * Sponsored by The USENIX Association for public distribution. 
                     18:  *
                     19:  * Copyright (c) 1989 Mark H. Colburn.
                     20:  * All rights reserved.
                     21:  *
                     22:  * Redistribution and use in source and binary forms are permitted
                     23:  * provided that the above copyright notice is duplicated in all such 
                     24:  * forms and that any documentation, advertising materials, and other 
                     25:  * materials related to such distribution and use acknowledge that the 
                     26:  * software was developed * by Mark H. Colburn and sponsored by The 
                     27:  * USENIX Association. 
                     28:  *
                     29:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     30:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     31:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     32:  *
                     33:  * $Log:       ttyio.c,v $
                     34:  * Revision 1.2  92/09/04  07:36:33  bin
                     35:  * vlad bug fixes
                     36:  * 
                     37:  * Revision 1.1  89/02/14  16:48:50  jep
                     38:  * Initial revision
                     39:  * 
                     40:  * Revision 1.1  88/12/23  18:02:39  mark
                     41:  * Initial revision
                     42:  * 
                     43:  */
                     44: 
                     45: #ifndef lint
                     46: static char *ident = "$Id: ttyio.c,v 1.2 92/09/04 07:36:33 bin Exp Locker: bin $";
                     47: static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
                     48: #endif /* ! lint */
                     49: 
                     50: 
                     51: /* Headers */
                     52: 
                     53: #include "pax.h"
                     54: 
                     55: 
                     56: /* open_tty - open the terminal for interactive queries
                     57:  *
                     58:  * DESCRIPTION
                     59:  *
                     60:  *     Assumes that background processes ignore interrupts and that the
                     61:  *     open() or the isatty() will fail for processes which are not
                     62:  *     attached to terminals. Returns a file descriptor or -1 if
                     63:  *     unsuccessful. 
                     64:  *
                     65:  * RETURNS
                     66:  *
                     67:  *     Returns a file descriptor which can be used to read and write
                     68:  *     directly to the user's terminal, or -1 on failure.  
                     69:  *
                     70:  * ERRORS
                     71:  *
                     72:  *     If SIGINT cannot be ignored, or the open fails, or the newly opened
                     73:  *     terminal device is not a tty, then open_tty will return a -1 to the
                     74:  *     caller.
                     75:  */
                     76: 
                     77: #if __STDC__
                     78: 
                     79: int open_tty(void)
                     80: 
                     81: #else
                     82: 
                     83: int open_tty()
                     84: 
                     85: #endif
                     86: {
                     87:     int             fd;                /* file descriptor for terminal */
                     88:     SIG_T         (*intr)();   /* used to restore interupts if signal fails */
                     89: 
                     90:     if ((intr = signal(SIGINT, SIG_IGN)) == SIG_IGN) {
                     91:        return (-1);
                     92:     }
                     93:     signal(SIGINT, intr);
                     94:     if ((fd = open(TTY, O_RDWR)) < 0) {
                     95:        return (-1);
                     96:     }
                     97:     if (isatty(fd)) {
                     98:        return (fd);
                     99:     }
                    100:     close(fd);
                    101:     return (-1);
                    102: }
                    103: 
                    104: 
                    105: /* nextask - ask a question and get a response
                    106:  *
                    107:  * DESCRIPTION
                    108:  *
                    109:  *     Give the user a prompt and wait for their response.  The prompt,
                    110:  *     located in "msg" is printed, then the user is allowed to type
                    111:  *     a response to the message.  The first "limit" characters of the
                    112:  *     user response is stored in "answer".
                    113:  *
                    114:  *     Nextask ignores spaces and tabs. 
                    115:  *
                    116:  * PARAMETERS
                    117:  *
                    118:  *     char *msg       - Message to display for user 
                    119:  *     char *answer    - Pointer to user's response to question 
                    120:  *     int limit       - Limit of length for user's response
                    121:  *
                    122:  * RETURNS
                    123:  *
                    124:  *     Returns the number of characters in the user response to the 
                    125:  *     calling function.  If an EOF was encountered, a -1 is returned to
                    126:  *     the calling function.  If an error occured which causes the read
                    127:  *     to return with a value of -1, then the function will return a
                    128:  *     non-zero return status to the calling process, and abort
                    129:  *     execution.
                    130:  */
                    131: 
                    132: #if __STDC__
                    133: 
                    134: int nextask(char *msg, char *answer, int limit)
                    135: 
                    136: #else
                    137: 
                    138: int nextask(msg, answer, limit)
                    139: char           *msg;           /* message to display for user */
                    140: char           *answer;                /* pointer to user's response to question */
                    141: int             limit;         /* limit of length for user's response */
                    142: 
                    143: #endif
                    144: {
                    145:     int             idx;       /* index into answer for character input */
                    146:     int             got;       /* number of characters read */
                    147:     char            c;         /* character read */
                    148: 
                    149:     if (ttyf < 0) {
                    150:        fatal("/dev/tty Unavailable");
                    151:     }
                    152:     write(ttyf, msg, (uint) strlen(msg));
                    153:     idx = 0;
                    154: 
                    155:     while ((got = read(ttyf, &c, 1)) == 1) {
                    156:        if (c == '\n') {
                    157:            break;
                    158:        } else if (c == ' ' || c == '\t') {
                    159:            continue;
                    160:        } else if (idx < limit - 1) {
                    161:            answer[idx++] = c;
                    162:        }
                    163:     }
                    164:     if (got == 0) {            /* got an EOF */
                    165:         return(-1);
                    166:     }
                    167:     if (got < 0) {
                    168:        fatal(strerror());
                    169:     }
                    170:     answer[idx] = '\0';
                    171:     return(0);
                    172: }
                    173: 
                    174: 
                    175: /* lineget - get a line from a given stream
                    176:  *
                    177:  * DESCRIPTION
                    178:  * 
                    179:  *     Get a line of input for the stream named by "stream".  The data on
                    180:  *     the stream is put into the buffer "buf".
                    181:  *
                    182:  * PARAMETERS
                    183:  *
                    184:  *     FILE *stream            - Stream to get input from 
                    185:  *     char *buf               - Buffer to put input into
                    186:  *
                    187:  * RETURNS
                    188:  *
                    189:  *     Returns 0 if successful, -1 at EOF. 
                    190:  */
                    191: 
                    192: #if __STDC__
                    193: 
                    194: int lineget(FILE *stream, char *buf)
                    195: 
                    196: #else
                    197: 
                    198: int lineget(stream, buf)
                    199: FILE           *stream;                /* stream to get input from */
                    200: char           *buf;           /* buffer to put input into */
                    201: 
                    202: #endif
                    203: {
                    204:     int             c;
                    205: 
                    206:     for (;;) {
                    207:        if ((c = getc(stream)) == EOF) {
                    208:            return (-1);
                    209:        }
                    210:        if (c == '\n') {
                    211:            break;
                    212:        }
                    213:        *buf++ = c;
                    214:     }
                    215:     *buf = '\0';
                    216:     return (0);
                    217: }
                    218: 
                    219: 
                    220: /* next - Advance to the next archive volume. 
                    221:  *
                    222:  * DESCRIPTION
                    223:  *
                    224:  *     Prompts the user to replace the backup medium with a new volume
                    225:  *     when the old one is full.  There are some cases, such as when
                    226:  *     archiving to a file on a hard disk, that the message can be a
                    227:  *     little surprising.  Assumes that background processes ignore
                    228:  *     interrupts and that the open() or the isatty() will fail for
                    229:  *     processes which are not attached to terminals. Returns a file
                    230:  *     descriptor or -1 if unsuccessful. 
                    231:  *
                    232:  * PARAMETERS
                    233:  *
                    234:  *     int mode        - mode of archive (READ, WRITE, PASS) 
                    235:  */
                    236: 
                    237: #if __STDC__
                    238: 
                    239: void next(int mode)
                    240: 
                    241: #else
                    242: 
                    243: void next(mode)
                    244: int             mode;          /* mode of archive (READ, WRITE, PASS) */
                    245: 
                    246: #endif
                    247: {
                    248:     char            msggo[200],
                    249:                    msgdev[200];/* buffers for message display */ 
                    250:     char            answer[20];        /* buffer for user's answer */
                    251:     static char            arfile[20]; /* local buffer for file name Vlad */
                    252:     int             ret;
                    253:     static int     openflag = 0;/* 1 when open_archive failed */
                    254: 
                    255:     close_archive();
                    256: 
                    257:     sprintf(msgdev, "%s: Ready for volume %u\n%s: Type \"/dev/name\" when"
                    258:                " ready to proceed (or \"quit\" to abort): \07",
                    259:                        myname, arvolume + 1, myname);
                    260:     sprintf(msggo, "%s: Ready for volume %u\n%s: Type \"go\" when"
                    261:                " ready to proceed (or \"quit\" to abort): \07",
                    262:                        myname, arvolume + 1, myname);
                    263: 
                    264:     if (!strcmp(ar_file, "-")) 
                    265:         openflag = 1;
                    266: 
                    267:     for (;;) {
                    268:        if (openflag) 
                    269:                ret = nextask(msgdev, answer, sizeof(answer));
                    270:        else
                    271:                ret = nextask(msggo, answer, sizeof(answer));   
                    272:        
                    273:        if (ret == -1 || strcmp(answer, "quit") == 0) {
                    274:            fatal("Aborted");
                    275:        }
                    276: 
                    277:        if (strcmp("go", answer) || openflag) {
                    278:            strcpy(arfile, answer);
                    279:            ar_file = arfile;
                    280:        }
                    281:        openflag = 0;
                    282:        if (open_archive(mode) == 0) {
                    283:            break;
                    284:        }
                    285:        openflag = 1;
                    286:     }
                    287:     warnarch("Continuing", (OFFSET) 0);
                    288: }

unix.superglobalmegacorp.com

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