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

Annotation of /lbbs/src/io.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.53 - (hide annotations)
Fri Oct 17 01:25:08 2025 UTC (4 months, 4 weeks ago) by sysadm
Branch: MAIN
Changes since 1.52: +1 -1 lines
Content type: text/x-csrc
No longer use igetch_reset() to skip remaining \n after \r
\r\n -> \r and \n -> \r conversions have already been implemented in igetch()

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 sysadm 1.47 #include "common.h"
18 sysadm 1.1 #include "io.h"
19 sysadm 1.16 #include "log.h"
20 sysadm 1.22 #include <errno.h>
21 sysadm 1.47 #include <fcntl.h>
22     #include <stdarg.h>
23 sysadm 1.1 #include <stdio.h>
24 sysadm 1.28 #include <string.h>
25 sysadm 1.9 #include <time.h>
26     #include <unistd.h>
27 sysadm 1.47 #include <sys/epoll.h>
28     #include <sys/ioctl.h>
29 sysadm 1.22 #include <sys/select.h>
30 sysadm 1.47 #include <libssh/callbacks.h>
31 sysadm 1.39 #include <libssh/libssh.h>
32     #include <libssh/server.h>
33 sysadm 1.1
34 sysadm 1.28 static char stdout_buf[BUFSIZ];
35     static int stdout_buf_len = 0;
36 sysadm 1.30 static int stdout_buf_offset = 0;
37 sysadm 1.1
38 sysadm 1.14 int prints(const char *format, ...)
39 sysadm 1.1 {
40 sysadm 1.28 char buf[BUFSIZ];
41 sysadm 1.14 va_list args;
42 sysadm 1.28 int ret;
43 sysadm 1.1
44 sysadm 1.14 va_start(args, format);
45 sysadm 1.28 ret = vsnprintf(buf, sizeof(buf), format, args);
46 sysadm 1.14 va_end(args);
47 sysadm 1.1
48 sysadm 1.30 if (ret > 0)
49 sysadm 1.28 {
50 sysadm 1.30 if (stdout_buf_len + ret > BUFSIZ)
51     {
52     iflush();
53     }
54 sysadm 1.31
55 sysadm 1.30 if (stdout_buf_len + ret <= BUFSIZ)
56     {
57     memcpy(stdout_buf + stdout_buf_len, buf, (size_t)ret);
58     stdout_buf_len += ret;
59     }
60     else
61     {
62     errno = EAGAIN;
63     ret = (BUFSIZ - stdout_buf_len - ret);
64 sysadm 1.35 log_error("Output buffer is full, additional %d is required\n", ret);
65 sysadm 1.30 }
66 sysadm 1.28 }
67 sysadm 1.30
68     return ret;
69     }
70    
71     int outc(char c)
72     {
73     int ret;
74    
75     if (stdout_buf_len + 1 > BUFSIZ)
76 sysadm 1.28 {
77 sysadm 1.30 iflush();
78     }
79    
80     if (stdout_buf_len + 1 <= BUFSIZ)
81     {
82     stdout_buf[stdout_buf_len] = c;
83     stdout_buf_len++;
84     }
85     else
86     {
87     errno = EAGAIN;
88     ret = -1;
89 sysadm 1.28 }
90    
91     return ret;
92 sysadm 1.1 }
93    
94 sysadm 1.43 int iflush(void)
95 sysadm 1.1 {
96 sysadm 1.28 int flags;
97 sysadm 1.29 struct epoll_event ev, events[MAX_EVENTS];
98     int nfds, epollfd;
99 sysadm 1.30 int retry;
100 sysadm 1.28 int ret = 0;
101    
102 sysadm 1.29 epollfd = epoll_create1(0);
103     if (epollfd < 0)
104     {
105     log_error("epoll_create1() error (%d)\n", errno);
106     return -1;
107     }
108    
109     ev.events = EPOLLOUT;
110     ev.data.fd = STDOUT_FILENO;
111     if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDOUT_FILENO, &ev) == -1)
112     {
113     log_error("epoll_ctl(STDOUT_FILENO) error (%d)\n", errno);
114 sysadm 1.31 if (close(epollfd) < 0)
115     {
116     log_error("close(epoll) error (%d)\n");
117     }
118 sysadm 1.29 return -1;
119     }
120    
121 sysadm 1.28 // Set STDOUT as non-blocking
122     flags = fcntl(STDOUT_FILENO, F_GETFL, 0);
123     fcntl(STDOUT_FILENO, F_SETFL, flags | O_NONBLOCK);
124    
125 sysadm 1.30 // Retry wait / flush for at most 3 times
126     retry = 3;
127     while (retry > 0 && !SYS_server_exit)
128 sysadm 1.28 {
129 sysadm 1.30 retry--;
130    
131 sysadm 1.29 nfds = epoll_wait(epollfd, events, MAX_EVENTS, 100); // 0.1 second
132 sysadm 1.28
133 sysadm 1.29 if (nfds < 0)
134 sysadm 1.28 {
135 sysadm 1.29 if (errno != EINTR)
136     {
137     log_error("epoll_wait() error (%d)\n", errno);
138     break;
139     }
140 sysadm 1.28 continue;
141     }
142 sysadm 1.29 else if (nfds == 0) // timeout
143 sysadm 1.28 {
144 sysadm 1.29 continue;
145 sysadm 1.28 }
146 sysadm 1.29
147     for (int i = 0; i < nfds; i++)
148 sysadm 1.28 {
149 sysadm 1.29 if (events[i].data.fd == STDOUT_FILENO)
150 sysadm 1.28 {
151 sysadm 1.30 while (stdout_buf_offset < stdout_buf_len && !SYS_server_exit) // write until complete or error
152 sysadm 1.28 {
153 sysadm 1.39 if (SSH_v2)
154     {
155     ret = ssh_channel_write(SSH_channel, stdout_buf + stdout_buf_offset, (uint32_t)(stdout_buf_len - stdout_buf_offset));
156     if (ret == SSH_ERROR)
157     {
158     log_error("ssh_channel_write() error: %s\n", ssh_get_error(SSH_session));
159     retry = 0;
160     break;
161     }
162     }
163     else
164     {
165     ret = (int)write(STDOUT_FILENO, stdout_buf + stdout_buf_offset, (size_t)(stdout_buf_len - stdout_buf_offset));
166     }
167 sysadm 1.29 if (ret < 0)
168     {
169     if (errno == EAGAIN || errno == EWOULDBLOCK)
170     {
171     break;
172     }
173     else if (errno == EINTR)
174     {
175     continue;
176     }
177     else
178     {
179 sysadm 1.46 #ifdef _DEBUG
180 sysadm 1.29 log_error("write(STDOUT) error (%d)\n", errno);
181 sysadm 1.46 #endif
182 sysadm 1.30 retry = 0;
183 sysadm 1.29 break;
184     }
185     }
186     else if (ret == 0) // broken pipe
187     {
188 sysadm 1.30 retry = 0;
189 sysadm 1.29 break;
190     }
191     else
192     {
193     stdout_buf_offset += ret;
194 sysadm 1.30 if (stdout_buf_offset >= stdout_buf_len) // flush buffer completely
195 sysadm 1.29 {
196     ret = 0;
197 sysadm 1.30 stdout_buf_offset = 0;
198 sysadm 1.29 stdout_buf_len = 0;
199 sysadm 1.30 retry = 0;
200 sysadm 1.29 break;
201     }
202     continue;
203     }
204 sysadm 1.28 }
205     }
206     }
207     }
208 sysadm 1.6
209 sysadm 1.28 // Restore STDOUT flags
210     fcntl(STDOUT_FILENO, F_SETFL, flags);
211 sysadm 1.6
212 sysadm 1.31 if (close(epollfd) < 0)
213     {
214     log_error("close(epoll) error (%d)\n");
215     }
216    
217 sysadm 1.28 return ret;
218 sysadm 1.1 }
219    
220 sysadm 1.31 int igetch(int timeout)
221 sysadm 1.1 {
222 sysadm 1.18 // static input buffer
223 sysadm 1.22 static unsigned char buf[LINE_BUFFER_LEN];
224 sysadm 1.31 static int len = 0;
225 sysadm 1.18 static int pos = 0;
226    
227 sysadm 1.29 struct epoll_event ev, events[MAX_EVENTS];
228     int nfds, epollfd;
229 sysadm 1.31 int ret;
230     int loop;
231 sysadm 1.21
232 sysadm 1.22 unsigned char tmp[LINE_BUFFER_LEN];
233 sysadm 1.31 int out = KEY_NULL;
234 sysadm 1.18 int in_esc = 0;
235     int in_ascii = 0;
236     int in_control = 0;
237     int i = 0;
238 sysadm 1.26 int flags;
239 sysadm 1.1
240 sysadm 1.48 if (pos >= len)
241 sysadm 1.29 {
242 sysadm 1.48 len = 0;
243     pos = 0;
244 sysadm 1.31
245 sysadm 1.48 epollfd = epoll_create1(0);
246     if (epollfd < 0)
247 sysadm 1.31 {
248 sysadm 1.48 log_error("epoll_create1() error (%d)\n", errno);
249     return -1;
250 sysadm 1.31 }
251 sysadm 1.9
252 sysadm 1.48 ev.events = EPOLLIN;
253     ev.data.fd = STDIN_FILENO;
254     if (epoll_ctl(epollfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) == -1)
255     {
256     log_error("epoll_ctl(STDIN_FILENO) error (%d)\n", errno);
257 sysadm 1.9
258 sysadm 1.48 if (close(epollfd) < 0)
259     {
260     log_error("close(epoll) error (%d)\n");
261     }
262     return -1;
263     }
264 sysadm 1.31
265 sysadm 1.48 flags = fcntl(STDIN_FILENO, F_GETFL, 0);
266     fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK);
267 sysadm 1.31
268 sysadm 1.49 for (loop = 1; loop && pos >= len && !SYS_server_exit;)
269 sysadm 1.39 {
270 sysadm 1.48 if (SSH_v2 && ssh_channel_is_closed(SSH_channel))
271     {
272     log_error("SSH channel is closed\n");
273     loop = 0;
274     break;
275     }
276 sysadm 1.39
277 sysadm 1.48 nfds = epoll_wait(epollfd, events, MAX_EVENTS, timeout);
278 sysadm 1.9
279 sysadm 1.48 if (nfds < 0)
280     {
281     if (errno != EINTR)
282     {
283     log_error("epoll_wait() error (%d)\n", errno);
284     break;
285     }
286     continue;
287     }
288     else if (nfds == 0) // timeout
289 sysadm 1.21 {
290 sysadm 1.48 out = KEY_TIMEOUT;
291 sysadm 1.31 break;
292 sysadm 1.21 }
293    
294 sysadm 1.48 for (int i = 0; i < nfds; i++)
295 sysadm 1.26 {
296 sysadm 1.48 if (events[i].data.fd == STDIN_FILENO)
297 sysadm 1.26 {
298 sysadm 1.48 while (len < sizeof(buf) && !SYS_server_exit) // read until complete or error
299 sysadm 1.39 {
300 sysadm 1.48 if (SSH_v2)
301 sysadm 1.39 {
302 sysadm 1.48 ret = ssh_channel_read_nonblocking(SSH_channel, buf + len, sizeof(buf) - (uint32_t)len, 0);
303     if (ret == SSH_ERROR)
304     {
305     log_error("ssh_channel_read_nonblocking() error: %s\n", ssh_get_error(SSH_session));
306     loop = 0;
307     break;
308     }
309     else if (ret == SSH_EOF)
310     {
311     loop = 0;
312     break;
313     }
314     else if (ret == 0)
315     {
316     out = 0;
317 sysadm 1.52 loop = 0;
318     break;
319 sysadm 1.48 }
320 sysadm 1.39 }
321 sysadm 1.48 else
322 sysadm 1.39 {
323 sysadm 1.48 ret = (int)read(STDIN_FILENO, buf + len, sizeof(buf) - (size_t)len);
324 sysadm 1.39 }
325 sysadm 1.48 if (ret < 0)
326 sysadm 1.39 {
327 sysadm 1.48 if (errno == EAGAIN || errno == EWOULDBLOCK)
328     {
329     out = 0;
330     loop = 0;
331     break;
332     }
333     else if (errno == EINTR)
334     {
335     continue;
336     }
337     else
338     {
339     #ifdef _DEBUG
340     log_error("read(STDIN) error (%d)\n", errno);
341     #endif
342     loop = 0;
343     break;
344     }
345 sysadm 1.39 }
346 sysadm 1.48 else if (ret == 0) // broken pipe
347 sysadm 1.29 {
348 sysadm 1.31 loop = 0;
349     break;
350 sysadm 1.29 }
351 sysadm 1.48 else
352 sysadm 1.29 {
353 sysadm 1.48 len += ret;
354 sysadm 1.29 continue;
355     }
356     }
357 sysadm 1.26 }
358     }
359 sysadm 1.48
360     // For debug
361     #ifdef _DEBUG
362     for (int j = pos; j < len; j++)
363     {
364     log_common("Debug: <--[%u]\n", (buf[j] + 256) % 256);
365     }
366     #endif
367 sysadm 1.14 }
368    
369 sysadm 1.48 fcntl(STDIN_FILENO, F_SETFL, flags);
370    
371     if (close(epollfd) < 0)
372 sysadm 1.45 {
373 sysadm 1.48 log_error("close(epoll) error (%d)\n");
374 sysadm 1.45 }
375 sysadm 1.11 }
376 sysadm 1.14
377     while (pos < len)
378 sysadm 1.11 {
379 sysadm 1.18 unsigned char c = buf[pos++];
380 sysadm 1.5
381 sysadm 1.51 // Convert \r\n to \r
382     if (c == CR && pos < len && buf[pos] == LF)
383     {
384     pos++;
385     }
386    
387     // Convert single \n to \r
388     if (c == LF)
389     {
390     c = CR;
391     }
392    
393 sysadm 1.14 if (c == KEY_CONTROL)
394     {
395     if (in_control == 0)
396     {
397     in_control = 1;
398     i = 0;
399     continue;
400     }
401     }
402 sysadm 1.1
403 sysadm 1.14 if (in_control)
404     {
405     tmp[i++] = c;
406     if (i >= 2)
407     {
408     out = (int)tmp[0] * 256 + tmp[1];
409     in_control = 0;
410     break;
411     }
412     continue;
413     }
414 sysadm 1.6
415 sysadm 1.37 if (c == KEY_ESC)
416 sysadm 1.14 {
417     if (in_esc == 0)
418     {
419     in_esc = 1;
420     in_ascii = 1;
421     i = 0;
422     continue;
423     }
424     else
425     {
426 sysadm 1.37 out = KEY_CSI;
427 sysadm 1.14 in_esc = 0;
428     break;
429     }
430     }
431 sysadm 1.3
432 sysadm 1.14 in_esc = 0;
433 sysadm 1.1
434 sysadm 1.14 if (in_ascii)
435     {
436     tmp[i++] = c;
437 sysadm 1.33 if (i == 2 && (tmp[0] == 79 || tmp[0] == 91))
438 sysadm 1.14 {
439     in_ascii = 0;
440 sysadm 1.33 switch (tmp[1])
441 sysadm 1.14 {
442 sysadm 1.33 case 65:
443 sysadm 1.14 out = KEY_UP;
444     break;
445 sysadm 1.33 case 66:
446 sysadm 1.14 out = KEY_DOWN;
447     break;
448 sysadm 1.33 case 67:
449 sysadm 1.14 out = KEY_RIGHT;
450     break;
451 sysadm 1.33 case 68:
452 sysadm 1.14 out = KEY_LEFT;
453     break;
454 sysadm 1.33 default:
455     in_ascii = 1;
456     }
457     if (!in_ascii)
458     {
459     break;
460     }
461     }
462     if (i == 2 && tmp[0] == 91) // Fterm
463     {
464     in_ascii = 0;
465     switch (tmp[1])
466     {
467     case 86:
468     out = KEY_SHIFT_F1;
469     break;
470     case 90:
471     out = KEY_SHIFT_F2;
472     break;
473     case 97:
474     out = KEY_SHIFT_F3;
475     break;
476     case 98:
477     out = KEY_SHIFT_F4;
478     break;
479     case 99:
480     out = KEY_SHIFT_F5;
481     break;
482     case 100:
483     out = KEY_SHIFT_F6;
484     break;
485     case 101:
486     out = KEY_SHIFT_F7;
487     break;
488     case 102:
489     out = KEY_SHIFT_F8;
490     break;
491     case 103:
492     out = KEY_SHIFT_F9;
493     break;
494     case 104:
495     out = KEY_SHIFT_F10;
496     break;
497     case 107:
498     out = KEY_CTRL_F1;
499     break;
500     case 108:
501     out = KEY_CTRL_F2;
502     break;
503     case 109:
504     out = KEY_CTRL_F3;
505     break;
506     case 112:
507     out = KEY_CTRL_F6;
508     break;
509     case 113:
510     out = KEY_CTRL_F7;
511     break;
512     case 114:
513     out = KEY_CTRL_F8;
514     break;
515     case 115:
516     out = KEY_CTRL_F9;
517     break;
518     case 116:
519     out = KEY_CTRL_F10;
520     break;
521     default:
522     in_ascii = 1;
523     }
524     if (!in_ascii)
525     {
526     break;
527     }
528     }
529     if (i == 2 && tmp[0] == 79) // Xterm
530     {
531     in_ascii = 0;
532     switch (tmp[1])
533     {
534     case 80:
535     out = KEY_F1;
536     break;
537     case 81:
538     out = KEY_F2;
539     break;
540     case 82:
541     out = KEY_F3;
542     break;
543     case 83:
544     out = KEY_F4;
545     break;
546     default:
547     in_ascii = 1;
548     }
549     if (!in_ascii)
550     {
551     break;
552 sysadm 1.14 }
553     }
554     if (i == 3 && tmp[0] == 91 && tmp[2] == 126)
555     {
556     in_ascii = 0;
557     switch (tmp[1])
558     {
559     case 49:
560     out = KEY_HOME;
561     break;
562 sysadm 1.42 case 50:
563     out = KEY_INS;
564     break;
565 sysadm 1.14 case 51:
566     out = KEY_DEL;
567     break;
568     case 52:
569     out = KEY_END;
570     break;
571     case 53:
572     out = KEY_PGUP;
573     break;
574     case 54:
575     out = KEY_PGDN;
576     break;
577 sysadm 1.33 default:
578     in_ascii = 1;
579     }
580     if (!in_ascii)
581     {
582     break;
583     }
584     }
585 sysadm 1.39 if (i == 4 && tmp[0] == 91 && tmp[1] == 49 && tmp[3] == 126) // Fterm
586 sysadm 1.33 {
587     in_ascii = 0;
588     switch (tmp[2])
589     {
590     case 49:
591     out = KEY_F1;
592     break;
593     case 50:
594     out = KEY_F2;
595     break;
596     case 51:
597     out = KEY_F3;
598     break;
599     case 52:
600     out = KEY_F4;
601     break;
602     case 53:
603     out = KEY_F5;
604     break;
605     case 55:
606     out = KEY_F6;
607     break;
608     case 56:
609     out = KEY_F7;
610     break;
611     case 57:
612     out = KEY_F8;
613     break;
614     default:
615     in_ascii = 1;
616     }
617     if (!in_ascii)
618     {
619     break;
620     }
621     }
622     if (i == 4 && tmp[0] == 91 && tmp[1] == 50 && tmp[3] == 126) // Fterm
623     {
624     in_ascii = 0;
625     switch (tmp[2])
626     {
627     case 48:
628     out = KEY_F9;
629     break;
630     case 49:
631     out = KEY_F10;
632     break;
633     case 50:
634     out = KEY_F11; // Fterm
635     break;
636     case 51:
637     out = KEY_F11; // Xterm
638     break;
639     case 52:
640     out = KEY_F12; // Xterm
641     break;
642     default:
643     in_ascii = 1;
644     }
645     if (!in_ascii)
646     {
647     break;
648     }
649     }
650     if (i == 5 && tmp[0] == 91 && tmp[1] == 49 && tmp[2] == 59 && tmp[3] == 53) // Xterm
651     {
652     in_ascii = 0;
653     switch (tmp[4])
654     {
655 sysadm 1.41 case 65:
656     out = KEY_CTRL_UP;
657     break;
658     case 66:
659     out = KEY_CTRL_DOWN;
660     break;
661     case 67:
662     out = KEY_CTRL_RIGHT;
663     break;
664     case 68:
665     out = KEY_CTRL_LEFT;
666     break;
667     case 70:
668     out = KEY_CTRL_END;
669     break;
670     case 72:
671     out = KEY_CTRL_HOME;
672     break;
673 sysadm 1.33 case 80:
674     out = KEY_CTRL_F1;
675     break;
676     case 81:
677     out = KEY_CTRL_F2;
678     break;
679     case 82:
680     out = KEY_CTRL_F3;
681     break;
682     default:
683     in_ascii = 1;
684     }
685     if (!in_ascii)
686     {
687     break;
688     }
689     }
690     if (i == 6 && tmp[0] == 91 && tmp[1] == 49 && tmp[3] == 59 && tmp[4] == 53 && tmp[5] == 126) // Xterm
691     {
692     in_ascii = 0;
693     switch (tmp[2])
694     {
695     case 53:
696     out = KEY_CTRL_F5;
697     break;
698     case 55:
699     out = KEY_CTRL_F6;
700     break;
701     case 56:
702     out = KEY_CTRL_F7;
703     break;
704     case 57:
705     out = KEY_CTRL_F8;
706     break;
707     default:
708     in_ascii = 1;
709     }
710     if (!in_ascii)
711     {
712     break;
713     }
714     }
715     if (i == 6 && tmp[0] == 91 && tmp[1] == 50 && tmp[3] == 59 && tmp[4] == 53 && tmp[5] == 126) // Xterm
716     {
717     in_ascii = 0;
718     switch (tmp[2])
719     {
720     case 48:
721     out = KEY_CTRL_F9;
722     break;
723     case 49:
724     out = KEY_CTRL_F10;
725     break;
726     case 51:
727     out = KEY_CTRL_F11;
728     break;
729     case 52:
730     out = KEY_CTRL_F12;
731     break;
732     default:
733     in_ascii = 1;
734     }
735     if (!in_ascii)
736     {
737     break;
738     }
739     }
740     if (i == 5 && tmp[0] == 91 && tmp[1] == 49 && tmp[2] == 59 && tmp[3] == 50) // Xterm
741     {
742     in_ascii = 0;
743     switch (tmp[4])
744     {
745     case 80:
746     out = KEY_SHIFT_F1;
747     break;
748     case 81:
749     out = KEY_SHIFT_F2;
750     break;
751     case 82:
752     out = KEY_SHIFT_F3;
753     break;
754     case 83:
755     out = KEY_SHIFT_F4;
756     break;
757     default:
758     in_ascii = 1;
759     }
760     if (!in_ascii)
761     {
762     break;
763 sysadm 1.14 }
764 sysadm 1.33 }
765     if (i == 6 && tmp[0] == 91 && tmp[1] == 49 && tmp[3] == 59 && tmp[4] == 50 && tmp[5] == 126) // Xterm
766     {
767     in_ascii = 0;
768     switch (tmp[2])
769     {
770     case 53:
771     out = KEY_SHIFT_F5;
772     break;
773     case 55:
774     out = KEY_SHIFT_F6;
775     break;
776     case 56:
777     out = KEY_SHIFT_F7;
778     break;
779     case 57:
780     out = KEY_SHIFT_F8;
781     break;
782     default:
783     in_ascii = 1;
784     }
785     if (!in_ascii)
786     {
787     break;
788     }
789     }
790     if (i == 6 && tmp[0] == 91 && tmp[1] == 50 && tmp[3] == 59 && tmp[4] == 50 && tmp[5] == 126) // Xterm
791     {
792     in_ascii = 0;
793     switch (tmp[2])
794     {
795     case 48:
796     out = KEY_SHIFT_F9;
797     break;
798     case 49:
799     out = KEY_SHIFT_F10;
800     break;
801     case 51:
802     out = KEY_SHIFT_F11;
803     break;
804     case 52:
805     out = KEY_SHIFT_F12;
806     break;
807     default:
808     in_ascii = 1;
809     }
810     if (!in_ascii)
811     {
812     break;
813     }
814     }
815    
816     if (c == 'm')
817     {
818     in_ascii = 0;
819 sysadm 1.14 }
820     continue;
821     }
822 sysadm 1.1
823 sysadm 1.14 out = ((int)c + 256) % 256;
824     break;
825 sysadm 1.1 }
826    
827 sysadm 1.36 // For ESC key
828     if (out == 0 && in_esc)
829     {
830     out = KEY_ESC;
831     }
832    
833 sysadm 1.33 // for debug
834 sysadm 1.45 #ifdef _DEBUG
835     if (out != KEY_TIMEOUT && out != KEY_NULL)
836     {
837     log_common("Debug: -->[0x %x]\n", out);
838     }
839     #endif
840 sysadm 1.33
841 sysadm 1.14 return out;
842 sysadm 1.1 }
843 sysadm 1.5
844 sysadm 1.31 int igetch_t(int sec)
845 sysadm 1.9 {
846 sysadm 1.14 int ch;
847 sysadm 1.44 time_t t_begin = time(NULL);
848 sysadm 1.10
849 sysadm 1.14 do
850     {
851 sysadm 1.31 ch = igetch(100);
852 sysadm 1.44 } while (!SYS_server_exit && ch == KEY_TIMEOUT && (time(NULL) - t_begin < sec));
853 sysadm 1.9
854 sysadm 1.14 return ch;
855 sysadm 1.9 }
856 sysadm 1.31
857     void igetch_reset()
858     {
859     int ch;
860     do
861     {
862 sysadm 1.53 ch = igetch(100);
863 sysadm 1.31 } while (ch != KEY_NULL && ch != KEY_TIMEOUT);
864     }

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