2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
4 * Ken Stevens, Steve McClure
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 * See files README, COPYING and CREDITS in the root of the source
23 * tree for related information and legal notices. It is expected
24 * that future projects/authors will amend these files as needed.
28 * termio.c: Various io functions
30 * Known contributors to this file:
39 #include <sys/types.h>
49 termio(int fd, int sock, FILE *auxfi)
51 static char exec[] = "execute";
52 static char buf[4096];
56 char *p, *q, *r, *s, *t;
58 int prespace, exec_com, inarg, quoted, tagging;
59 struct tagstruct *tag;
62 INPUT_RECORD InpBuffer[2];
70 n = read(fd, p, sizeof(buf) - i);
72 /* The keyboard is sometimes generating both keydown and keyup
73 * events for the same key. Thus, we only want to grab keydown
76 ret = PeekConsoleInput(hStdIn, InpBuffer, 1, &records);
78 fprintf(stderr, "Error peeking the console input (%lu)\n",
84 if (InpBuffer[0].EventType != KEY_EVENT) {
85 ret = ReadConsoleInput(hStdIn, InpBuffer, 1, &records);
87 fprintf(stderr, "Error reading the console input (%lu)\n",
95 if (!InpBuffer[0].Event.KeyEvent.bKeyDown) {
96 ret = ReadConsoleInput(hStdIn, InpBuffer, 1, &records);
98 fprintf(stderr, "Error reading the console input (%lu)\n",
106 c = InpBuffer[0].Event.KeyEvent.uChar.AsciiChar;
114 ret = ReadConsole(hStdIn, p, sizeof(buf) - i, &records, NULL);
116 fprintf(stderr, "Error reading the console (%lu)\n",
122 /* Strip off the CRLF to just LF */
124 if (p[records - 2] == 13 && p[records - 1] == 10) {
130 FlushConsoleInputBuffer(hStdIn);
134 } else if (fd == 0) {
139 fgets(p, sizeof(buf) - i, stdin);
142 n = read(fd, p, sizeof(buf) - i);
150 perror("read standard input");
163 while (p < buf + n && q < out + 4000) {
166 tag = malloc(sizeof(struct tagstruct));
167 tag->item = malloc(1 + p - s);
183 } else if (tagging) {
185 } else if (!quoted && isspace(*p)) {
188 if (exec_com && s > exec + 2) {
192 } else if (prespace && *p == '|') {
196 } else if (prespace && *p == '>') {
199 if (*p != '\n' && (*p == '!' || *p == '>'))
207 if (!inarg && *p != '?') {
212 if (exec_com && *s && *s++ != *p)
219 while (ptr < buf + n)
225 fwrite(out, n, 1, auxfi);
229 nbytes = write(sock, ptr, n);
231 nbytes = send(sock, ptr, n, 0);
235 errno = WSAGetLastError();
237 perror("write server socket");
250 if (write(sock, "ctld\n", 5) < 5) {
252 if (send(sock, "ctld\n", 5, 0) < 5) {
254 fprintf(stderr, "sendeof: EOF send failed\n");