/[LeafOK_CVS]/lbbs/src/io.c
ViewVC logotype

Annotation of /lbbs/src/io.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.21 - (hide annotations)
Fri May 9 11:21:11 2025 UTC (10 months, 1 week ago) by sysadm
Branch: MAIN
Changes since 1.20: +21 -33 lines
Content type: text/x-csrc
Refact signal handler and processing implementation
Refine select error handling

1 sysadm 1.1 /***************************************************************************
2 sysadm 1.14 io.c - description
3     -------------------
4 sysadm 1.20 Copyright : (C) 2004-2025 by Leaflet
5     Email : leaflet@leafok.com
6 sysadm 1.1 ***************************************************************************/
7    
8     /***************************************************************************
9     * *
10     * This program is free software; you can redistribute it and/or modify *
11     * it under the terms of the GNU General Public License as published by *
12 sysadm 1.20 * the Free Software Foundation; either version 3 of the License, or *
13 sysadm 1.1 * (at your option) any later version. *
14     * *
15     ***************************************************************************/
16    
17     #include "io.h"
18 sysadm 1.16 #include "log.h"
19 sysadm 1.1 #include "common.h"
20 sysadm 1.11 #include "tcplib.h"
21 sysadm 1.1 #include <stdio.h>
22     #include <stdarg.h>
23 sysadm 1.9 #include <time.h>
24     #include <fcntl.h>
25     #include <unistd.h>
26 sysadm 1.5 #include <sys/ioctl.h>
27 sysadm 1.1
28 sysadm 1.14 int outc(char c)
29 sysadm 1.1 {
30 sysadm 1.14 int retval;
31 sysadm 1.1
32 sysadm 1.14 retval = fprintf(stdout, "%c", c);
33 sysadm 1.1
34 sysadm 1.14 return retval;
35 sysadm 1.1 }
36    
37 sysadm 1.14 int prints(const char *format, ...)
38 sysadm 1.1 {
39 sysadm 1.14 va_list args;
40     int retval;
41 sysadm 1.1
42 sysadm 1.14 va_start(args, format);
43     retval = vfprintf(stdout, format, args);
44     va_end(args);
45 sysadm 1.1
46 sysadm 1.14 return retval;
47 sysadm 1.1 }
48    
49 sysadm 1.14 int iflush()
50 sysadm 1.1 {
51 sysadm 1.14 int retval;
52 sysadm 1.6
53 sysadm 1.14 retval = fflush(stdout);
54 sysadm 1.6
55 sysadm 1.14 return retval;
56 sysadm 1.1 }
57    
58 sysadm 1.17 int igetch(int clear_buf)
59 sysadm 1.1 {
60 sysadm 1.18 // static input buffer
61 sysadm 1.19 static unsigned char buf[256];
62     static ssize_t len = 0;
63 sysadm 1.18 static int pos = 0;
64    
65 sysadm 1.21 fd_set testfds;
66     struct timeval timeout;
67    
68 sysadm 1.18 unsigned char tmp[256];
69 sysadm 1.21 int ret;
70 sysadm 1.18 int out = KEY_NULL;
71     int in_esc = 0;
72     int in_ascii = 0;
73     int in_control = 0;
74     int i = 0;
75 sysadm 1.1
76 sysadm 1.17 if (clear_buf)
77     {
78     pos = 0;
79     len = 0;
80    
81     return 0;
82     }
83    
84 sysadm 1.21 while (!SYS_server_exit && pos >= len)
85 sysadm 1.14 {
86     FD_ZERO(&testfds);
87 sysadm 1.21 FD_SET(STDIN_FILENO, &testfds);
88 sysadm 1.9
89 sysadm 1.14 timeout.tv_sec = 1;
90     timeout.tv_usec = 0;
91 sysadm 1.9
92 sysadm 1.21 ret = select(FD_SETSIZE, &testfds, NULL, NULL, &timeout);
93 sysadm 1.9
94 sysadm 1.21 if (ret < 0)
95 sysadm 1.14 {
96 sysadm 1.21 if (errno != EINTR)
97     {
98     log_error("Select error in igetch: !\n", errno);
99     return KEY_NULL;
100     }
101     continue;
102 sysadm 1.14 }
103 sysadm 1.21 else if (ret == 0)
104 sysadm 1.14 {
105 sysadm 1.21 return KEY_TIMEOUT;
106 sysadm 1.14 }
107 sysadm 1.21
108     if (FD_ISSET(STDIN_FILENO, &testfds))
109 sysadm 1.14 {
110 sysadm 1.21 len = read(STDIN_FILENO, buf, 255);
111     pos = 0;
112     break;
113 sysadm 1.14 }
114    
115     // For debug
116     // for (j = 0; j < len; j++)
117     // log_std ("<--[%u]\n", (buf[j] + 256) % 256);
118 sysadm 1.11 }
119 sysadm 1.14
120     while (pos < len)
121 sysadm 1.11 {
122 sysadm 1.18 unsigned char c = buf[pos++];
123 sysadm 1.5
124 sysadm 1.14 if (c == '\0')
125     {
126     out = c;
127     break;
128     }
129 sysadm 1.1
130 sysadm 1.14 if (c == KEY_CONTROL)
131     {
132     if (in_control == 0)
133     {
134     in_control = 1;
135     i = 0;
136     continue;
137     }
138     }
139 sysadm 1.1
140 sysadm 1.14 if (in_control)
141     {
142     tmp[i++] = c;
143     if (i >= 2)
144     {
145     out = (int)tmp[0] * 256 + tmp[1];
146     in_control = 0;
147     break;
148     }
149     continue;
150     }
151 sysadm 1.6
152 sysadm 1.14 if (c == ESC_KEY)
153     {
154     if (in_esc == 0)
155     {
156     in_esc = 1;
157     in_ascii = 1;
158     i = 0;
159     continue;
160     }
161     else
162     {
163     out = ESC_KEY;
164     in_esc = 0;
165     break;
166     }
167     }
168 sysadm 1.3
169 sysadm 1.14 in_esc = 0;
170 sysadm 1.1
171 sysadm 1.14 if (in_ascii)
172     {
173     tmp[i++] = c;
174     if (c == 'm')
175     {
176     in_ascii = 0;
177     continue;
178     }
179     if (i == 2 && c >= 'A' && c <= 'D')
180     {
181     in_ascii = 0;
182     switch (c)
183     {
184     case 'A':
185     out = KEY_UP;
186     break;
187     case 'B':
188     out = KEY_DOWN;
189     break;
190     case 'C':
191     out = KEY_RIGHT;
192     break;
193     case 'D':
194     out = KEY_LEFT;
195     break;
196     }
197     break;
198     }
199     if (i == 3 && tmp[0] == 91 && tmp[2] == 126)
200     {
201     in_ascii = 0;
202     switch (tmp[1])
203     {
204     case 49:
205     out = KEY_HOME;
206     break;
207     case 51:
208     out = KEY_DEL;
209     break;
210     case 52:
211     out = KEY_END;
212     break;
213     case 53:
214     out = KEY_PGUP;
215     break;
216     case 54:
217     out = KEY_PGDN;
218     break;
219     }
220     break;
221     }
222     continue;
223     }
224 sysadm 1.1
225 sysadm 1.14 out = ((int)c + 256) % 256;
226     break;
227 sysadm 1.1 }
228    
229 sysadm 1.14 // for debug
230     // log_std ("-->[%u]\n", out);
231 sysadm 1.1
232 sysadm 1.14 return out;
233 sysadm 1.1 }
234 sysadm 1.5
235 sysadm 1.14 int igetch_t(long int sec)
236 sysadm 1.9 {
237 sysadm 1.14 int ch;
238     time_t t_begin = time(0);
239 sysadm 1.10
240 sysadm 1.14 do
241     {
242 sysadm 1.17 ch = igetch(0);
243     } while ((ch == KEY_TIMEOUT || ch == 0xa) && (time(0) - t_begin < sec));
244 sysadm 1.9
245 sysadm 1.14 return ch;
246 sysadm 1.9 }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1