|
|
1.1 root 1: /* $Header: /a/guest/moore/talk/RCS/io.c,v 1.3 83/07/06 00:17:15 moore Exp $ */
2:
3: /* this file contains the I/O handling and the exchange of
4: edit characters. This connection itself is established in
5: ctl.c
6: */
7:
8: #include "talk.h"
9: #include <stdio.h>
10: #include <errno.h>
11: #include <sys/time.h>
12:
13: #define A_LONG_TIME 10000000
14: #define STDIN_MASK (1<<fileno(stdin)) /* the bit mask for standard
15: input */
16: extern int errno;
17:
18: /*
19: * The routine to do the actual talking
20: */
21:
22: talk()
23: {
24: register int read_template, sockt_mask;
25: int read_set, nb;
26: char buf[BUFSIZ];
27: struct timeval wait;
28:
29: message("Connection established\007\007\007");
30: current_line = 0;
31:
32: sockt_mask = (1<<sockt);
33:
34: /*
35: * wait on both the other process (sockt_mask) and
36: * standard input ( STDIN_MASK )
37: */
38:
39: read_template = sockt_mask | STDIN_MASK;
40:
41: forever {
42:
43: read_set = read_template;
44:
45: wait.tv_sec = A_LONG_TIME;
46: wait.tv_usec = 0;
47:
48: nb = select(32, &read_set, 0, 0, &wait);
49:
50: if (nb <= 0) {
51:
52: /* We may be returning from an interupt handler */
53:
54: if (errno == EINTR) {
55: read_set = read_template;
56: continue;
57: } else {
58: /* panic, we don't know what happened */
59: p_error("Unexpected error from select");
60: quit();
61: }
62: }
63:
64: if ( read_set & sockt_mask ) {
65:
66: /* There is data on sockt */
67: nb = read(sockt, buf, sizeof buf);
68:
69: if (nb <= 0) {
70: message("Connection closed. Exiting");
71: quit();
72: } else {
73: display(&his_win, buf, nb);
74: }
75: }
76:
77: if ( read_set & STDIN_MASK ) {
78:
79: /* we can't make the tty non_blocking, because
80: curses's output routines would screw up */
81:
82: ioctl(0, FIONREAD, (struct sgttyb *) &nb);
83: nb = read(0, buf, nb);
84:
85: display(&my_win, buf, nb);
86: write(sockt, buf, nb); /* We might lose data here
87: because sockt is non-blocking
88: */
89:
90: }
91: }
92: }
93:
94: extern int errno;
95: extern int sys_nerr;
96: extern char *sys_errlist[];
97:
98: /* p_error prints the system error message on the standard location
99: on the screen and then exits. (i.e. a curses version of perror)
100: */
101:
102: p_error(string)
103: char *string;
104: {
105: char *sys;
106:
107: sys = "Unknown error";
108: if(errno < sys_nerr) {
109: sys = sys_errlist[errno];
110: }
111:
112:
113: wmove(my_win.x_win, current_line%my_win.x_nlines, 0);
114: wprintw(my_win.x_win, "[%s : %s (%d)]\n", string, sys, errno);
115: wrefresh(my_win.x_win);
116: move(LINES-1, 0);
117: refresh();
118: quit();
119: }
120:
121: /* display string in the standard location */
122:
123: message(string)
124: char *string;
125: {
126: wmove(my_win.x_win, current_line%my_win.x_nlines, 0);
127: wprintw(my_win.x_win, "[%s]\n", string);
128: wrefresh(my_win.x_win);
129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.