home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / N / TCPIP / NETKIT-B.05 / NETKIT-B / NetKit-B-0.05 / talk / io.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-17  |  4.2 KB  |  142 lines

  1. /*
  2.  * Copyright (c) 1983 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. /*static char sccsid[] = "from: @(#)io.c    5.6 (Berkeley) 3/1/91";*/
  36. static char rcsid[] = "$Id: io.c,v 1.3 1993/08/14 13:47:51 mycroft Exp $";
  37. #endif /* not lint */
  38.  
  39. /*
  40.  * This file contains the I/O handling and the exchange of 
  41.  * edit characters. This connection itself is established in
  42.  * ctl.c
  43.  */
  44.  
  45. #include <sys/time.h>
  46. #include <sys/ioctl.h>
  47. #include "talk.h"
  48. #include <stdio.h>
  49. #include <errno.h>
  50. #include <string.h>
  51.  
  52. #define A_LONG_TIME 10000000
  53. #define STDIN_MASK (1<<fileno(stdin))    /* the bit mask for standard
  54.                        input */
  55.  
  56. /*
  57.  * The routine to do the actual talking
  58.  */
  59. talk()
  60. {
  61.     register int read_template, sockt_mask;
  62.     int read_set, nb;
  63.     char buf[BUFSIZ];
  64.     struct timeval wait;
  65.  
  66.     message("Connection established\007\007\007");
  67.     current_line = 0;
  68.     sockt_mask = (1<<sockt);
  69.  
  70.     /*
  71.      * Wait on both the other process (sockt_mask) and 
  72.      * standard input ( STDIN_MASK )
  73.      */
  74.     read_template = sockt_mask | STDIN_MASK;
  75.     for (;;) {
  76.         read_set = read_template;
  77.         wait.tv_sec = A_LONG_TIME;
  78.         wait.tv_usec = 0;
  79.         nb = select(32, &read_set, 0, 0, &wait);
  80.         if (nb <= 0) {
  81.             if (errno == EINTR) {
  82.                 read_set = read_template;
  83.                 continue;
  84.             }
  85.             /* panic, we don't know what happened */
  86.             p_error("Unexpected error from select");
  87.             quit();
  88.         }
  89.         if (read_set & sockt_mask) { 
  90.             /* There is data on sockt */
  91.             nb = read(sockt, buf, sizeof buf);
  92.             if (nb <= 0) {
  93.                 message("Connection closed. Exiting");
  94.                 quit();
  95.             }
  96.             display(&his_win, buf, nb);
  97.         }
  98.         if (read_set & STDIN_MASK) {
  99.             /*
  100.              * We can't make the tty non_blocking, because
  101.              * curses's output routines would screw up
  102.              */
  103.             ioctl(0, FIONREAD, (struct sgttyb *) &nb);
  104.             nb = read(0, buf, nb);
  105.             display(&my_win, buf, nb);
  106.             /* might lose data here because sockt is non-blocking */
  107.             write(sockt, buf, nb);
  108.         }
  109.     }
  110. }
  111.  
  112. extern    int errno;
  113. extern    int sys_nerr;
  114.  
  115. /*
  116.  * p_error prints the system error message on the standard location
  117.  * on the screen and then exits. (i.e. a curses version of perror)
  118.  */
  119. p_error(string) 
  120.     char *string;
  121. {
  122.     wmove(my_win.x_win, current_line%my_win.x_nlines, 0);
  123.     wprintw(my_win.x_win, "[%s : %s (%d)]\n",
  124.         string, strerror(errno), errno);
  125.     wrefresh(my_win.x_win);
  126.     move(LINES-1, 0);
  127.     refresh();
  128.     quit();
  129. }
  130.  
  131. /*
  132.  * Display string in the standard location
  133.  */
  134. message(string)
  135.     char *string;
  136. {
  137.  
  138.     wmove(my_win.x_win, current_line%my_win.x_nlines, 0);
  139.     wprintw(my_win.x_win, "[%s]\n", string);
  140.     wrefresh(my_win.x_win);
  141. }
  142.