home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / std_unix / pax / 2 / ttyio.c < prev    next >
C/C++ Source or Header  |  1989-01-07  |  6KB  |  262 lines

  1. /* $Source: /u/mark/src/pax/RCS/ttyio.c,v $
  2.  *
  3.  * $Revision: 1.1 $
  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 (mark@jhereg.mn.org)
  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 MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  32.  *
  33.  * $Log:    ttyio.c,v $
  34.  * Revision 1.1  88/12/23  18:02:39  mark
  35.  * Initial revision
  36.  * 
  37.  */
  38.  
  39. #ifndef lint
  40. static char *ident = "$Id: ttyio.c,v 1.1 88/12/23 18:02:39 mark Rel $";
  41. static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
  42. #endif /* ! lint */
  43.  
  44.  
  45. /* Headers */
  46.  
  47. #include "pax.h"
  48.  
  49.  
  50. /* open_tty - open the terminal for interactive queries
  51.  *
  52.  * DESCRIPTION
  53.  *
  54.  *     Assumes that background processes ignore interrupts and that the
  55.  *    open() or the isatty() will fail for processes which are not
  56.  *    attached to terminals. Returns a file descriptor or -1 if
  57.  *    unsuccessful. 
  58.  *
  59.  * RETURNS
  60.  *
  61.  *    Returns a file descriptor which can be used to read and write
  62.  *    directly to the user's terminal, or -1 on failure.  
  63.  *
  64.  * ERRORS
  65.  *
  66.  *    If SIGINT cannot be ignored, or the open fails, or the newly opened
  67.  *    terminal device is not a tty, then open_tty will return a -1 to the
  68.  *    caller.
  69.  */
  70.  
  71. #ifdef __STDC__
  72.  
  73. int open_tty(void)
  74.  
  75. #else
  76.  
  77. int open_tty()
  78.  
  79. #endif
  80. {
  81.     int             fd;        /* file descriptor for terminal */
  82.     SIG_T         (*intr)();    /* used to restore interupts if signal fails */
  83.  
  84.     if ((intr = signal(SIGINT, SIG_IGN)) == SIG_IGN) {
  85.     return (-1);
  86.     }
  87.     signal(SIGINT, intr);
  88.     if ((fd = open(TTY, O_RDWR)) < 0) {
  89.     return (-1);
  90.     }
  91.     if (isatty(fd)) {
  92.     return (fd);
  93.     }
  94.     close(fd);
  95.     return (-1);
  96. }
  97.  
  98.  
  99. /* nextask - ask a question and get a response
  100.  *
  101.  * DESCRIPTION
  102.  *
  103.  *    Give the user a prompt and wait for their response.  The prompt,
  104.  *    located in "msg" is printed, then the user is allowed to type
  105.  *    a response to the message.  The first "limit" characters of the
  106.  *    user response is stored in "answer".
  107.  *
  108.  *    Nextask ignores spaces and tabs. 
  109.  *
  110.  * PARAMETERS
  111.  *
  112.  *    char *msg    - Message to display for user 
  113.  *    char *answer    - Pointer to user's response to question 
  114.  *    int limit    - Limit of length for user's response
  115.  *
  116.  * RETURNS
  117.  *
  118.  *    Returns the number of characters in the user response to the 
  119.  *    calling function.  If an EOF was encountered, a -1 is returned to
  120.  *    the calling function.  If an error occured which causes the read
  121.  *    to return with a value of -1, then the function will return a
  122.  *    non-zero return status to the calling process, and abort
  123.  *    execution.
  124.  */
  125.  
  126. #ifdef __STDC__
  127.  
  128. int nextask(char *msg, char *answer, int limit)
  129.  
  130. #else
  131.  
  132. int nextask(msg, answer, limit)
  133. char           *msg;        /* message to display for user */
  134. char           *answer;        /* pointer to user's response to question */
  135. int             limit;        /* limit of length for user's response */
  136.  
  137. #endif
  138. {
  139.     int             idx;    /* index into answer for character input */
  140.     int             got;    /* number of characters read */
  141.     char            c;        /* character read */
  142.  
  143.     if (ttyf < 0) {
  144.     fatal("/dev/tty Unavailable");
  145.     }
  146.     write(ttyf, msg, (uint) strlen(msg));
  147.     idx = 0;
  148.     while ((got = read(ttyf, &c, 1)) == 1) {
  149.     if (c == '\n') {
  150.         break;
  151.     } else if (c == ' ' || c == '\t') {
  152.         continue;
  153.     } else if (idx < limit - 1) {
  154.         answer[idx++] = c;
  155.     }
  156.     }
  157.     if (got == 0) {        /* got an EOF */
  158.         return(-1);
  159.     }
  160.     if (got < 0) {
  161.     fatal(syserr());
  162.     }
  163.     answer[idx] = '\0';
  164.     return(0);
  165. }
  166.  
  167.  
  168. /* lineget - get a line from a given stream
  169.  *
  170.  * DESCRIPTION
  171.  * 
  172.  *    Get a line of input for the stream named by "stream".  The data on
  173.  *    the stream is put into the buffer "buf".
  174.  *
  175.  * PARAMETERS
  176.  *
  177.  *    FILE *stream        - Stream to get input from 
  178.  *    char *buf        - Buffer to put input into
  179.  *
  180.  * RETURNS
  181.  *
  182.  *     Returns 0 if successful, -1 at EOF. 
  183.  */
  184.  
  185. #ifdef __STDC__
  186.  
  187. int lineget(FILE *stream, char *buf)
  188.  
  189. #else
  190.  
  191. int lineget(stream, buf)
  192. FILE           *stream;        /* stream to get input from */
  193. char           *buf;        /* buffer to put input into */
  194.  
  195. #endif
  196. {
  197.     int             c;
  198.  
  199.     for (;;) {
  200.     if ((c = getc(stream)) == EOF) {
  201.         return (-1);
  202.     }
  203.     if (c == '\n') {
  204.         break;
  205.     }
  206.     *buf++ = c;
  207.     }
  208.     *buf = '\0';
  209.     return (0);
  210. }
  211.  
  212.  
  213. /* next - Advance to the next archive volume. 
  214.  *
  215.  * DESCRIPTION
  216.  *
  217.  *    Prompts the user to replace the backup medium with a new volume
  218.  *    when the old one is full.  There are some cases, such as when
  219.  *    archiving to a file on a hard disk, that the message can be a
  220.  *    little surprising.  Assumes that background processes ignore
  221.  *    interrupts and that the open() or the isatty() will fail for
  222.  *    processes which are not attached to terminals. Returns a file
  223.  *    descriptor or -1 if unsuccessful. 
  224.  *
  225.  * PARAMETERS
  226.  *
  227.  *    int mode    - mode of archive (READ, WRITE, PASS) 
  228.  */
  229.  
  230. #ifdef __STDC__
  231.  
  232. void next(int mode)
  233.  
  234. #else
  235.  
  236. void next(mode)
  237. int             mode;        /* mode of archive (READ, WRITE, PASS) */
  238.  
  239. #endif
  240. {
  241.     char            msg[200];    /* buffer for message display */ 
  242.     char            answer[20];    /* buffer for user's answer */
  243.     int             ret;
  244.  
  245.     close_archive();
  246.  
  247.     sprintf(msg, "\
  248. %s: Ready for volume %u\n\
  249. %s: Type \"go\" when ready to proceed (or \"quit\" to abort): \07",
  250.            myname, arvolume + 1, myname);
  251.     for (;;) {
  252.     ret = nextask(msg, answer, sizeof(answer));
  253.     if (ret == -1 || strcmp(answer, "quit") == 0) {
  254.         fatal("Aborted");
  255.     }
  256.     if (strcmp(answer, "go") == 0 && open_archive(mode) == 0) {
  257.         break;
  258.     }
  259.     }
  260.     warnarch("Continuing", (OFFSET) 0);
  261. }
  262.