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

Annotation of /lbbs/src/io.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.26 - (hide annotations)
Sun May 11 04:09:08 2025 UTC (10 months ago) by sysadm
Branch: MAIN
Changes since 1.25: +16 -1 lines
Content type: text/x-csrc
Change getch to non-blocking
Refine select parameter
Remove sleep

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.22 #include <errno.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.22 #include <sys/select.h>
27 sysadm 1.5 #include <sys/ioctl.h>
28 sysadm 1.1
29 sysadm 1.14 int outc(char c)
30 sysadm 1.1 {
31 sysadm 1.14 int retval;
32 sysadm 1.1
33 sysadm 1.14 retval = fprintf(stdout, "%c", c);
34 sysadm 1.1
35 sysadm 1.14 return retval;
36 sysadm 1.1 }
37    
38 sysadm 1.14 int prints(const char *format, ...)
39 sysadm 1.1 {
40 sysadm 1.14 va_list args;
41     int retval;
42 sysadm 1.1
43 sysadm 1.14 va_start(args, format);
44     retval = vfprintf(stdout, format, args);
45     va_end(args);
46 sysadm 1.1
47 sysadm 1.14 return retval;
48 sysadm 1.1 }
49    
50 sysadm 1.14 int iflush()
51 sysadm 1.1 {
52 sysadm 1.14 int retval;
53 sysadm 1.6
54 sysadm 1.14 retval = fflush(stdout);
55 sysadm 1.6
56 sysadm 1.14 return retval;
57 sysadm 1.1 }
58    
59 sysadm 1.17 int igetch(int clear_buf)
60 sysadm 1.1 {
61 sysadm 1.18 // static input buffer
62 sysadm 1.22 static unsigned char buf[LINE_BUFFER_LEN];
63 sysadm 1.19 static ssize_t len = 0;
64 sysadm 1.18 static int pos = 0;
65    
66 sysadm 1.21 fd_set testfds;
67     struct timeval timeout;
68    
69 sysadm 1.22 unsigned char tmp[LINE_BUFFER_LEN];
70 sysadm 1.21 int ret;
71 sysadm 1.18 int out = KEY_NULL;
72     int in_esc = 0;
73     int in_ascii = 0;
74     int in_control = 0;
75     int i = 0;
76 sysadm 1.26 int flags;
77 sysadm 1.1
78 sysadm 1.17 if (clear_buf)
79     {
80     pos = 0;
81     len = 0;
82    
83     return 0;
84     }
85    
86 sysadm 1.21 while (!SYS_server_exit && pos >= len)
87 sysadm 1.14 {
88     FD_ZERO(&testfds);
89 sysadm 1.21 FD_SET(STDIN_FILENO, &testfds);
90 sysadm 1.9
91 sysadm 1.22 timeout.tv_sec = 0;
92     timeout.tv_usec = 100 * 1000; // 0.1 second
93 sysadm 1.9
94 sysadm 1.26 ret = select(STDIN_FILENO + 1, &testfds, NULL, NULL, &timeout);
95 sysadm 1.9
96 sysadm 1.21 if (ret < 0)
97 sysadm 1.14 {
98 sysadm 1.21 if (errno != EINTR)
99     {
100     log_error("Select error in igetch: !\n", errno);
101     return KEY_NULL;
102     }
103     continue;
104 sysadm 1.14 }
105 sysadm 1.21 else if (ret == 0)
106 sysadm 1.14 {
107 sysadm 1.21 return KEY_TIMEOUT;
108 sysadm 1.14 }
109 sysadm 1.21
110     if (FD_ISSET(STDIN_FILENO, &testfds))
111 sysadm 1.14 {
112 sysadm 1.26 flags = fcntl(STDIN_FILENO, F_GETFL, 0);
113     fcntl(socket_server, F_SETFL, flags | O_NONBLOCK);
114    
115 sysadm 1.22 len = read(STDIN_FILENO, buf, sizeof(buf));
116 sysadm 1.26 if (len < 0)
117     {
118     if (errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR)
119     {
120     log_error("Read socket error (%d)\n", errno);
121     }
122     }
123    
124 sysadm 1.21 pos = 0;
125 sysadm 1.26
126     fcntl(STDIN_FILENO, F_SETFL, flags);
127    
128 sysadm 1.21 break;
129 sysadm 1.14 }
130    
131     // For debug
132     // for (j = 0; j < len; j++)
133     // log_std ("<--[%u]\n", (buf[j] + 256) % 256);
134 sysadm 1.11 }
135 sysadm 1.14
136     while (pos < len)
137 sysadm 1.11 {
138 sysadm 1.18 unsigned char c = buf[pos++];
139 sysadm 1.5
140 sysadm 1.14 if (c == '\0')
141     {
142 sysadm 1.24 return KEY_NULL;
143 sysadm 1.14 }
144 sysadm 1.1
145 sysadm 1.14 if (c == KEY_CONTROL)
146     {
147     if (in_control == 0)
148     {
149     in_control = 1;
150     i = 0;
151     continue;
152     }
153     }
154 sysadm 1.1
155 sysadm 1.14 if (in_control)
156     {
157     tmp[i++] = c;
158     if (i >= 2)
159     {
160     out = (int)tmp[0] * 256 + tmp[1];
161     in_control = 0;
162     break;
163     }
164     continue;
165     }
166 sysadm 1.6
167 sysadm 1.14 if (c == ESC_KEY)
168     {
169     if (in_esc == 0)
170     {
171     in_esc = 1;
172     in_ascii = 1;
173     i = 0;
174     continue;
175     }
176     else
177     {
178     out = ESC_KEY;
179     in_esc = 0;
180     break;
181     }
182     }
183 sysadm 1.3
184 sysadm 1.14 in_esc = 0;
185 sysadm 1.1
186 sysadm 1.14 if (in_ascii)
187     {
188     tmp[i++] = c;
189     if (c == 'm')
190     {
191     in_ascii = 0;
192     continue;
193     }
194     if (i == 2 && c >= 'A' && c <= 'D')
195     {
196     in_ascii = 0;
197     switch (c)
198     {
199     case 'A':
200     out = KEY_UP;
201     break;
202     case 'B':
203     out = KEY_DOWN;
204     break;
205     case 'C':
206     out = KEY_RIGHT;
207     break;
208     case 'D':
209     out = KEY_LEFT;
210     break;
211     }
212     break;
213     }
214     if (i == 3 && tmp[0] == 91 && tmp[2] == 126)
215     {
216     in_ascii = 0;
217     switch (tmp[1])
218     {
219     case 49:
220     out = KEY_HOME;
221     break;
222     case 51:
223     out = KEY_DEL;
224     break;
225     case 52:
226     out = KEY_END;
227     break;
228     case 53:
229     out = KEY_PGUP;
230     break;
231     case 54:
232     out = KEY_PGDN;
233     break;
234     }
235     break;
236     }
237     continue;
238     }
239 sysadm 1.1
240 sysadm 1.14 out = ((int)c + 256) % 256;
241     break;
242 sysadm 1.1 }
243    
244 sysadm 1.14 // for debug
245     // log_std ("-->[%u]\n", out);
246 sysadm 1.1
247 sysadm 1.14 return out;
248 sysadm 1.1 }
249 sysadm 1.5
250 sysadm 1.14 int igetch_t(long int sec)
251 sysadm 1.9 {
252 sysadm 1.14 int ch;
253     time_t t_begin = time(0);
254 sysadm 1.10
255 sysadm 1.14 do
256     {
257 sysadm 1.17 ch = igetch(0);
258 sysadm 1.25 } while (!SYS_server_exit && ch == KEY_TIMEOUT && (time(0) - t_begin < sec));
259 sysadm 1.9
260 sysadm 1.14 return ch;
261 sysadm 1.9 }

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