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

Contents of /lbbs/src/io.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.21 - (show 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 /***************************************************************************
2 io.c - description
3 -------------------
4 Copyright : (C) 2004-2025 by Leaflet
5 Email : leaflet@leafok.com
6 ***************************************************************************/
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 * the Free Software Foundation; either version 3 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "io.h"
18 #include "log.h"
19 #include "common.h"
20 #include "tcplib.h"
21 #include <stdio.h>
22 #include <stdarg.h>
23 #include <time.h>
24 #include <fcntl.h>
25 #include <unistd.h>
26 #include <sys/ioctl.h>
27
28 int outc(char c)
29 {
30 int retval;
31
32 retval = fprintf(stdout, "%c", c);
33
34 return retval;
35 }
36
37 int prints(const char *format, ...)
38 {
39 va_list args;
40 int retval;
41
42 va_start(args, format);
43 retval = vfprintf(stdout, format, args);
44 va_end(args);
45
46 return retval;
47 }
48
49 int iflush()
50 {
51 int retval;
52
53 retval = fflush(stdout);
54
55 return retval;
56 }
57
58 int igetch(int clear_buf)
59 {
60 // static input buffer
61 static unsigned char buf[256];
62 static ssize_t len = 0;
63 static int pos = 0;
64
65 fd_set testfds;
66 struct timeval timeout;
67
68 unsigned char tmp[256];
69 int ret;
70 int out = KEY_NULL;
71 int in_esc = 0;
72 int in_ascii = 0;
73 int in_control = 0;
74 int i = 0;
75
76 if (clear_buf)
77 {
78 pos = 0;
79 len = 0;
80
81 return 0;
82 }
83
84 while (!SYS_server_exit && pos >= len)
85 {
86 FD_ZERO(&testfds);
87 FD_SET(STDIN_FILENO, &testfds);
88
89 timeout.tv_sec = 1;
90 timeout.tv_usec = 0;
91
92 ret = select(FD_SETSIZE, &testfds, NULL, NULL, &timeout);
93
94 if (ret < 0)
95 {
96 if (errno != EINTR)
97 {
98 log_error("Select error in igetch: !\n", errno);
99 return KEY_NULL;
100 }
101 continue;
102 }
103 else if (ret == 0)
104 {
105 return KEY_TIMEOUT;
106 }
107
108 if (FD_ISSET(STDIN_FILENO, &testfds))
109 {
110 len = read(STDIN_FILENO, buf, 255);
111 pos = 0;
112 break;
113 }
114
115 // For debug
116 // for (j = 0; j < len; j++)
117 // log_std ("<--[%u]\n", (buf[j] + 256) % 256);
118 }
119
120 while (pos < len)
121 {
122 unsigned char c = buf[pos++];
123
124 if (c == '\0')
125 {
126 out = c;
127 break;
128 }
129
130 if (c == KEY_CONTROL)
131 {
132 if (in_control == 0)
133 {
134 in_control = 1;
135 i = 0;
136 continue;
137 }
138 }
139
140 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
152 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
169 in_esc = 0;
170
171 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
225 out = ((int)c + 256) % 256;
226 break;
227 }
228
229 // for debug
230 // log_std ("-->[%u]\n", out);
231
232 return out;
233 }
234
235 int igetch_t(long int sec)
236 {
237 int ch;
238 time_t t_begin = time(0);
239
240 do
241 {
242 ch = igetch(0);
243 } while ((ch == KEY_TIMEOUT || ch == 0xa) && (time(0) - t_begin < sec));
244
245 return ch;
246 }

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