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

Annotation of /lbbs/src/io.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.22 - (hide annotations)
Sat May 10 02:14:46 2025 UTC (10 months, 1 week ago) by sysadm
Branch: MAIN
Changes since 1.21: +7 -6 lines
Content type: text/x-csrc
Refine to prevent blocking while shutdown server

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.1
77 sysadm 1.17 if (clear_buf)
78     {
79     pos = 0;
80     len = 0;
81    
82     return 0;
83     }
84    
85 sysadm 1.21 while (!SYS_server_exit && pos >= len)
86 sysadm 1.14 {
87     FD_ZERO(&testfds);
88 sysadm 1.21 FD_SET(STDIN_FILENO, &testfds);
89 sysadm 1.9
90 sysadm 1.22 timeout.tv_sec = 0;
91     timeout.tv_usec = 100 * 1000; // 0.1 second
92 sysadm 1.9
93 sysadm 1.21 ret = select(FD_SETSIZE, &testfds, NULL, NULL, &timeout);
94 sysadm 1.9
95 sysadm 1.21 if (ret < 0)
96 sysadm 1.14 {
97 sysadm 1.21 if (errno != EINTR)
98     {
99     log_error("Select error in igetch: !\n", errno);
100     return KEY_NULL;
101     }
102     continue;
103 sysadm 1.14 }
104 sysadm 1.21 else if (ret == 0)
105 sysadm 1.14 {
106 sysadm 1.21 return KEY_TIMEOUT;
107 sysadm 1.14 }
108 sysadm 1.21
109     if (FD_ISSET(STDIN_FILENO, &testfds))
110 sysadm 1.14 {
111 sysadm 1.22 len = read(STDIN_FILENO, buf, sizeof(buf));
112 sysadm 1.21 pos = 0;
113     break;
114 sysadm 1.14 }
115    
116     // For debug
117     // for (j = 0; j < len; j++)
118     // log_std ("<--[%u]\n", (buf[j] + 256) % 256);
119 sysadm 1.11 }
120 sysadm 1.14
121     while (pos < len)
122 sysadm 1.11 {
123 sysadm 1.18 unsigned char c = buf[pos++];
124 sysadm 1.5
125 sysadm 1.14 if (c == '\0')
126     {
127     out = c;
128     break;
129     }
130 sysadm 1.1
131 sysadm 1.14 if (c == KEY_CONTROL)
132     {
133     if (in_control == 0)
134     {
135     in_control = 1;
136     i = 0;
137     continue;
138     }
139     }
140 sysadm 1.1
141 sysadm 1.14 if (in_control)
142     {
143     tmp[i++] = c;
144     if (i >= 2)
145     {
146     out = (int)tmp[0] * 256 + tmp[1];
147     in_control = 0;
148     break;
149     }
150     continue;
151     }
152 sysadm 1.6
153 sysadm 1.14 if (c == ESC_KEY)
154     {
155     if (in_esc == 0)
156     {
157     in_esc = 1;
158     in_ascii = 1;
159     i = 0;
160     continue;
161     }
162     else
163     {
164     out = ESC_KEY;
165     in_esc = 0;
166     break;
167     }
168     }
169 sysadm 1.3
170 sysadm 1.14 in_esc = 0;
171 sysadm 1.1
172 sysadm 1.14 if (in_ascii)
173     {
174     tmp[i++] = c;
175     if (c == 'm')
176     {
177     in_ascii = 0;
178     continue;
179     }
180     if (i == 2 && c >= 'A' && c <= 'D')
181     {
182     in_ascii = 0;
183     switch (c)
184     {
185     case 'A':
186     out = KEY_UP;
187     break;
188     case 'B':
189     out = KEY_DOWN;
190     break;
191     case 'C':
192     out = KEY_RIGHT;
193     break;
194     case 'D':
195     out = KEY_LEFT;
196     break;
197     }
198     break;
199     }
200     if (i == 3 && tmp[0] == 91 && tmp[2] == 126)
201     {
202     in_ascii = 0;
203     switch (tmp[1])
204     {
205     case 49:
206     out = KEY_HOME;
207     break;
208     case 51:
209     out = KEY_DEL;
210     break;
211     case 52:
212     out = KEY_END;
213     break;
214     case 53:
215     out = KEY_PGUP;
216     break;
217     case 54:
218     out = KEY_PGDN;
219     break;
220     }
221     break;
222     }
223     continue;
224     }
225 sysadm 1.1
226 sysadm 1.14 out = ((int)c + 256) % 256;
227     break;
228 sysadm 1.1 }
229    
230 sysadm 1.14 // for debug
231     // log_std ("-->[%u]\n", out);
232 sysadm 1.1
233 sysadm 1.14 return out;
234 sysadm 1.1 }
235 sysadm 1.5
236 sysadm 1.14 int igetch_t(long int sec)
237 sysadm 1.9 {
238 sysadm 1.14 int ch;
239     time_t t_begin = time(0);
240 sysadm 1.10
241 sysadm 1.14 do
242     {
243 sysadm 1.17 ch = igetch(0);
244     } while ((ch == KEY_TIMEOUT || ch == 0xa) && (time(0) - t_begin < sec));
245 sysadm 1.9
246 sysadm 1.14 return ch;
247 sysadm 1.9 }

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