1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc.
3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or
5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License
6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2
7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version.
8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful,
10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of
11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details.
14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License
16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software
17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Based on sys_linux.c
22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <unistd.h>
24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <signal.h>
25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <stdlib.h>
26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <limits.h>
27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <sys/time.h>
28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <sys/types.h>
29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <unistd.h>
30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <fcntl.h>
31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <stdarg.h>
32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <stdio.h>
33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// #include <sys/ipc.h>
34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// #include <sys/shm.h>
35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <sys/stat.h>
36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <string.h>
37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <ctype.h>
38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <sys/wait.h>
39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <sys/mman.h>
40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <errno.h>
41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "quakedef.h"
43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint noconinput = 0;
45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint nostdout = 0;
46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichchar *basedir = "/sdcard/data/quake";
48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichchar *cachedir = "/tmp";
49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcvar_t  sys_linerefresh = CVAR2("sys_linerefresh","0");// set for entity display
51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// =======================================================================
53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// General routines
54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// =======================================================================
55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_DebugNumber(int y, int val)
57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Printf (char *fmt, ...)
62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	va_list		argptr;
64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	char		text[1024];
65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	va_start (argptr,fmt);
67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	vsprintf (text,fmt,argptr);
68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	va_end (argptr);
69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	fprintf(stderr, "%s", text);
70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	Con_Print (text);
72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Printf (char *fmt, ...)
75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    va_list     argptr;
78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    char        text[1024], *t_p;
79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    int         l, r;
80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    if (nostdout)
82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        return;
83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    va_start (argptr,fmt);
85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    vsprintf (text,fmt,argptr);
86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    va_end (argptr);
87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    l = strlen(text);
89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    t_p = text;
90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// make sure everything goes through, even though we are non-blocking
92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    while (l)
93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    {
94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        r = write (1, text, l);
95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        if (r != l)
96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich            sleep (0);
97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        if (r > 0)
98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        {
99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich            t_p += r;
100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich            l -= r;
101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        }
102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    }
103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Printf (char *fmt, ...)
108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	va_list		argptr;
110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	char		text[2048];
111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	unsigned char		*p;
112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	va_start (argptr,fmt);
114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	vsprintf (text,fmt,argptr);
115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	va_end (argptr);
116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	if (strlen(text) > sizeof(text))
118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		Sys_Error("memory overwrite in Sys_Printf");
119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    if (nostdout)
121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        return;
122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	for (p = (unsigned char *)text; *p; p++)
124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if ((*p > 128 || *p < 32) && *p != 10 && *p != 13 && *p != 9)
125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			printf("[%02x]", *p);
126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		else
127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			putc(*p, stdout);
128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Quit (void)
131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	Host_Shutdown();
133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	printf("Sys_Quit - exiting.");
134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    // fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY);
135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	exit(0);
136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Init(void)
139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if id386
141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	Sys_SetFPCW();
142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Error (char *error, ...)
146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    va_list     argptr;
148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    char        string[1024];
149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// change stdin to non blocking
151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    // fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY);
152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    va_start (argptr,error);
154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    vsprintf (string,error,argptr);
155cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    va_end (argptr);
156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	fprintf(stderr, "Error: %s\n", string);
157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
158cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	Host_Shutdown ();
159cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	printf("Sys_Error - exiting.");
160cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	exit (1);
161cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
162cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_Warn (char *warning, ...)
165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    va_list     argptr;
167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    char        string[1024];
168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    va_start (argptr,warning);
170cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    vsprintf (string,warning,argptr);
171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    va_end (argptr);
172cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	fprintf(stderr, "Warning: %s", string);
173cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
174cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
175cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
176cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============
177cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSys_FileTime
178cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
179cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichreturns -1 if not present
180cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============
181cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
182cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint	Sys_FileTime (char *path)
183cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
184cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	struct	stat	buf;
185cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
186cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	if (stat (path,&buf) == -1)
187cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		return -1;
188cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
189cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	return buf.st_mtime;
190cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
191cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
192cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
193cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_mkdir (char *path)
194cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
195cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    mkdir (path, 0777);
196cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
197cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
198cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Sys_FileOpenRead (char *path, int *handle)
199cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
200cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int	h;
201cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	struct stat	fileinfo;
202cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
203cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
204cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	h = open (path, O_RDONLY, 0666);
205cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	*handle = h;
206cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	if (h == -1)
207cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		return -1;
208cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
209cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	if (fstat (h,&fileinfo) == -1)
210cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		Sys_Error ("Error fstating %s", path);
211cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
212cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	return fileinfo.st_size;
213cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
214cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
215cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Sys_FileOpenWrite (char *path)
216cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
217cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int     handle;
218cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
219cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	umask (0);
220cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
221cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	handle = open(path,O_RDWR | O_CREAT | O_TRUNC
222cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	, 0666);
223cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
224cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	if (handle == -1)
225cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		Sys_Error ("Error opening %s: %s", path,strerror(errno));
226cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
227cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	return handle;
228cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
229cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
230cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Sys_FileWrite (int handle, void *src, int count)
231cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
232cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	return write (handle, src, count);
233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
234cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
235cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_FileClose (int handle)
236cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
237cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	close (handle);
238cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
239cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
240cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_FileSeek (int handle, int position)
241cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
242cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	lseek (handle, position, SEEK_SET);
243cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
244cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
245cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Sys_FileRead (int handle, void *dest, int count)
246cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
247cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    return read (handle, dest, count);
248cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
249cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
250cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_DebugLog(char *file, char *fmt, ...)
251cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
252cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    va_list argptr;
253cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    static char data[1024];
254cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    int fd;
255cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
256cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    va_start(argptr, fmt);
257cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    vsprintf(data, fmt, argptr);
258cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    va_end(argptr);
259cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//    fd = open(file, O_WRONLY | O_BINARY | O_CREAT | O_APPEND, 0666);
260cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    fd = open(file, O_WRONLY | O_CREAT | O_APPEND, 0666);
261cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    write(fd, data, strlen(data));
262cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    close(fd);
263cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
264cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
265cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_EditFile(char *filename)
266cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
267cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
268cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	char cmd[256];
269cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	char *term;
270cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	char *editor;
271cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
272cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	term = getenv("TERM");
273cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	if (term && !strcmp(term, "xterm"))
274cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	{
275cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		editor = getenv("VISUAL");
276cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (!editor)
277cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			editor = getenv("EDITOR");
278cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (!editor)
279cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			editor = getenv("EDIT");
280cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (!editor)
281cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			editor = "vi";
282cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		sprintf(cmd, "xterm -e %s %s", editor, filename);
283cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		system(cmd);
284cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	}
285cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
286cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
287cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
288cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichdouble Sys_DoubleTime (void)
289cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
290cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    struct timeval tp;
291cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    struct timezone tzp;
292cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    static int      secbase;
293cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
294cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    gettimeofday(&tp, &tzp);
295cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
296cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    if (!secbase)
297cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    {
298cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        secbase = tp.tv_sec;
299cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        return tp.tv_usec/1000000.0;
300cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    }
301cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
302cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    return (tp.tv_sec - secbase) + tp.tv_usec/1000000.0;
303cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
304cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
305cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// =======================================================================
306cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Sleeps for microseconds
307cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// =======================================================================
308cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
309cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic volatile int oktogo;
310cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
311cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid alarm_handler(int x)
312cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
313cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	oktogo=1;
314cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
315cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
316cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_LineRefresh(void)
317cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
318cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
319cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
320cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid floating_point_exception_handler(int whatever)
321cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
322cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//	Sys_Warn("floating point exception\n");
323cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	signal(SIGFPE, floating_point_exception_handler);
324cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
325cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
326cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichchar *Sys_ConsoleInput(void)
327cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
328cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if 0
329cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    static char text[256];
330cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    int     len;
331cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
332cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	if (cls.state == ca_dedicated) {
333cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		len = read (0, text, sizeof(text));
334cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		if (len < 1)
335cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			return NULL;
336cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		text[len-1] = 0;    // rip off the /n and terminate
337cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
338cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		return text;
339cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	}
340cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
341cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	return NULL;
342cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
343cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
344cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if !id386
345cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_HighFPPrecision (void)
346cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
347cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
348cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
349cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Sys_LowFPPrecision (void)
350cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
351cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
352cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
353cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
354cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint		skipframes;
355cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
356cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// The following APIs are called from the Java activity
357cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
358cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint gAndroidQuitting = 0;
359cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
360cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichdouble g_oldtime;
361cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
362cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichextern int scr_width;
363cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichextern int scr_height;
364cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
365cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid AndroidInit(int width, int height)
366cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
367cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	quakeparms_t parms;
368cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int j;
369cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int c = 0;
370cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	char* v[] = {"quake", (char*) 0};
371cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
372cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	scr_width = width;
373cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	scr_height = height;
374cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
375cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//	static char cwd[1024];
376cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
377cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//	signal(SIGFPE, floating_point_exception_handler);
378cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//  signal(SIGFPE, SIG_IGN);
379cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
380cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	memset(&parms, 0, sizeof(parms));
381cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
382cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	COM_InitArgv(c, v);
383cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	parms.argc = com_argc;
384cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	parms.argv = com_argv;
385cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
386cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	parms.memsize = 16*1024*1024;
387cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
388cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	j = COM_CheckParm("-mem");
389cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	if (j)
390cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		parms.memsize = (int) (Q_atof(com_argv[j+1]) * 1024 * 1024);
391cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	parms.membase = malloc (parms.memsize);
392cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
393cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	parms.basedir = basedir;
394cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// caching is disabled by default, use -cachedir to enable
395cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//	parms.cachedir = cachedir;
396cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
397cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#if 0 // FNDELAY not implemented
398cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	noconinput = COM_CheckParm("-noconinput");
399cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	if (!noconinput)
400cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY);
401cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#endif
402cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
403cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	if (COM_CheckParm("-nostdout"))
404cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich		nostdout = 1;
405cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
406cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	Sys_Init();
407cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
408cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    Host_Init(&parms);
409cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
410cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    g_oldtime = Sys_DoubleTime ();
411cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
412cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
413cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid AndroidStep()
414cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
415cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	double time, newtime;
416cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	// find time spent rendering last frame
417cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	newtime = Sys_DoubleTime ();
418cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	time = newtime - g_oldtime;
419cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
420cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	Host_Frame(time);
421cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	g_oldtime = newtime;
422cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
423cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
424cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint AndroidQuiting()
425cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
426cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	return gAndroidQuitting;
427cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
428